Пост

Новое отображение ошибок в 1С

Рассмотрим развитие механизма отображения ошибок в 1С (начиная с 8.3.17)


Данная статья - текстовый вариант данного видео

Подготовка

Где почитать?

В начале этого года вышла статья на Зазеркалье с информацией о новой возможности платформы - работой с окном отображения ошибок.

Вот статья: https://wonderland.v8.1c.ru/blog/razvitie-mekhanizma-otobrazheniya-oshibok/

Многие после прочтения были воодушевлены. Естественно, ведь наконец-то мы сможем не только работать с этим окном, но и получать от пользователей полноценный отчет об ошибке!

И вот, в версии 8.3.17 мы можем видеть “новое о платформе”

https://dl04.1c.ru/content/Platform/8_3_17_1549/1cv8upd_8_3_17_1549.htm#9f36892b-eb6c-11e9-8371-0050569f678a

Реализованы следующие возможности, связанные с обработкой ошибок, возникающих при работе прикладного решения:

  • Возможность обработки всех не перехваченных ошибок, возникающих при работе прикладного решения, перед отображением ошибок пользователю. Реализован обработчик модуля приложения ОбработкаОтображенияОшибки.
  • Реализована возможность декларативной настройки текстов сообщений об ошибке.
  • Реализована возможность формирования и отправки отчета об ошибке для службы технической поддержки (в том числе полностью автоматически). Реализован объект ОтчетОбОшибке.
  • Реализовано понятие «категория ошибки», что позволяет группировать ошибки. Реализован метод ИнформацияОбОшибке.ЯвляетсяОшибкойКатегории().
  • Изменено стандартное окно отображения ошибок пользователю.
  • Реализовано свойство глобального контекста ОбработкаОшибок.

Реализована стандартная функция Управление настройками обработки ошибок, позволяющая настроить тексты ошибок. Методы глобального контекста КраткоеПредставлениеОшибки(), ПодробноеПредставлениеОшибки() и ПоказатьИнформациюОбОшибке() считаются устаревшими. Рекомендуется использовать одноименные методы объекта ОбработкаОшибок.

Тем, кому будет интересно самому подробнее погрузиться в этот механизм, можно прочитать на ИТС здесь и здесь

Где и как тестировать?

Работать мы будем в демо-базе, которую можно скачать с того сайта 1С: https://releases.1c.ru/version_files?nick=Platform83&ver=8.3.17.1549

Скрин

Я выбрал пункт с файлом DT. Вот прямая ссылка на скачивание. Естественно, нужен доступ на users: https://releases.1c.ru/version_file?nick=Platform83&ver=8.3.17.1549&path=Platform\8_3_17_1549\demodt_8_3_17_1549.zip

Данный ДТшник после установки платформы 8.3.17.1549 я загрузил в базу для последующих экспериментов.

Так же для работы сделаем обработку, в которой просто будем вызывать ошибку.

Скрин

Сделаем простую непредвиденную ошибку в коде. Просто попытаемся присвоить в зарезервированную переменную “Неопределено”:

Скрин

Далее будем работать с этой обработкой.

В начале были нюансы…

Сразу упомяним важный нюанс работы механизма. Дело в том, что новое окно с информацией об ошибке будет появляться только в том случае, если текущий сеанс НЕ допускает отладки.

Поэтому сразу же для удобства вынесем кнопку “1С:Предприятие”, которая будет запускать базу без подключенной отладки.

Скрин

Теперь запустим в таком режиме сеанс и попробуем выполнить нашу обработку.

Скрин

Вуаля! Мы видим новое окно с информацией об ошибке! Здесь есть кнопка “Сформировать отчет об ошибке” и нет совершенно упоминание кода, на котором эта ошибка возникла. Но данную форму мы ещё рассмотрим. Давайте закроем сеанс, вернёмся в конфигуратор и запустим 1С в режиме отладки. Теперь, если мы попытаемся выполнить нашу обработку, то увидим старое, уже давно привычное нам, окно с информацией об ошибке:

Скрин

Выходит, что с подключенной отладкой мы не увидим новое окно? Да, но более того - мы не увидим его даже, если отладка не подключена, но в сеансе есть на неё разрешение.

Скрин

То есть пользователи, у которых включена отладка в текущем сеансе, не увидят новое окошно с информацией об ошибке и не смогут сформировать отчет об ошибке.

Это странное решение 1С, может у кого в комментариях будут предположения о причинах… Но деваться некуда - нужно просто это знать, чтобы потом не удивляться.

Ещё усугубляет ситуацию то, что часто разработчики советуют пользователям включать этот режим отладки в текущем сеансе. Для того, чтобы появлялась кнопочка “Подробнее…”. Покажу не примере:

Если открыть базу до 8.3.17 (у меня это будет 8.3.15), а далее без режима отладки вызвать ошибку, то мы увидим такое окно:

Скрин

Что здесь не так? Нет возможности нажать “Подробнее” (чтобы увидеть полный текст ошибки), а так же нет возможности скопировать этот текст.

Для того, чтобы окно было более функциональным, пользователи включают в своих сеансах режим разрешенной отладки.

Скрин

Скрин

Выходит, что пользователи, наученные включать режим отладки, не увидят новое окно об ошибке. Их нужно будет переучить. И, поздравляю, можете начинать и сейчас. Потому что есть более “правильный” способ пользователям копировать текст ошибке (без включения отладки). Просто перейдите в “О программе” -> “Информация для технической поддержки”. Это даже удобнее, чем окно с сообщением, потому что ошибки копятся и не пропадут после закрытия окна.

Скрин

Что видит пользователь?

Вернёмся к новому окну.

Скрин

Вот что пользователь увидит по кнопке “Сформировать отчет об ошибке”:

Скрин

Форма формирования отчета

Это новая форма платформы, в которой мы можем внести описание проблемы (например, что мы именно делали перед возникновением ошибки).

Но самое главное, что теперь разработчики могут получить от пользователя автоматически сформированные пункты.

  • Подробный текст ошибки. Это конкретно тот текст ошибки, который нам нужен. А не тот, который пользователь неизвестно как и откуда скопировал.

Скрин

  • Снимок окон приложения. Полноразмерный скрин окон 1С.

Скрин

  • Имя пользователя информационной базы

Скрин

  • Сведения об используемом приложении. Здесь у нас хранится инфа о конфигурации, режиме совместимстимости и расширениях

Скрин

  • Информация о компьютере. Гигабайты, гигагерцы и так далее

Скрин

  • Приложить файл. Пользователь может приложить, например, файл, который он пытался прогрузить в обработку. Или же саму внешнюю обработку.

Скрин

Самое главное, что всё это добро можно сохранить на компьютере в виде архива, а потом переслать кому нужно:

Скрин

Содержимое отчета об ошибке

Давайте посмотрим, что внутри:

Скрин

Скриншот и файлик JSON. А вот в JSON уже хранится вся информация:

Скрин

Здесь хранится даже больше, чем нам было показано в окне. Например, вот код локализации:

Скрин

А вот идентификатор расширений. Их не было на скринах выше:

Скрин

А здесь вообще подробный стек:

Скрин

В общем, в JSON хранится много всего интересного. Но рассмотрим его подробнее в следующих статьях. Попытаемся его распарсить.

Как сохраняются скриншоты

Перед тем, как перейти далее, рассмотрим то, как 1С создаёт скриншоты окон приложения. Для этого в форме нашей обработки сделаем режим открытия окна “Блокировать весь интерфейс”.

Скрин

И теперь вызовем ошибку.

Скрин

Как видите, обработка полностью закрыла собой основное окно 1С. Но как будет выглядеть скриншот?

Скрин

1С разделила скриншот на две части - два независимых изображения окна. При этом, наложения одного окна на другое нету. В итоге, разработчик видит как скрин самой формы, в которой выпала ошибка, так и скрин основного окна 1С, в котором форма была открыта. Очень удобно 👍

Администрирование

Одно из основных “фишек” нового механизма - возможность видоизменять текст окна с ошибкой в режиме предприятия.

Управление настройками обработки ошибок

Настройки механизма в режиме Предприятие вносятся в “Управление настройками обработки ошибок”. Для этого перейдём в “Функции для технического специалиста” (ранее “Все функции”) -> “Стандартные” - “Управление настройками обработки ошибок”.

Скрин

И вот мы видим такую форму. Добавить в избранное мы, к сожалению, не можем, потому что это “стандартная форма”.

Скрин

Теперь посмотрим на функционал этой формы. У нас уже есть одна настройка, потому что это демо-база.

Настройка отображения для категории

Попробуем добавить новую.

Скрин

Мы можем выбрать

  • Любую категорию ошибок. В 1С есть список из 12ти категорий:
    • Все ошибки
    • Прочая ошибка
    • Нарушение прав доступа
    • Ошибка доступа к локальному файлу
    • Ошибка сети
    • Ошибка работы с принтером
    • Исключение, вызванное из встроенного языка
    • Ошибка системы взаимодействия
    • Ошибка настроек компоновки данных
    • Ошибка сеанса
    • Ошибка полнотекстового поиска
    • Ошибка внешнего источника данных
  • Текст для ошибки, не требующей перезапуск
  • Текст для ошибки, требующей перезапуск

Скрин

Шаблон с текстом ошибки позволяет задать произвольный отформатированный текст, а так же использовать встроенные “параметры”.

Скрин

Чтобы рассмотреть их наглядно, создадим настройку для категории “Все ошибки”. И внесём в неё текст со списком всех параметров.

Скрин

Настройки обработки ошибок применяются после перезапуска сеанса:

Скрин

Перезапустим сеанс и снова откроем нашу обработку, которая вызовет ошибку.

Вот так выглядят все доступные параметры для пользователя:

Скрин

  • СтандартноеСообщениеОбОшибкеДляПользователя - текст, который формирует сама 1С, опираясь на категорию ошибки. Этот текст содержит рекомендации для пользователя и “призывы” к действию.
  • ПредставлениеОшибкиДляПользователя - отображает только описание ошибки без каких-либо рекомендаций. Так же напрямую формируется из категории
  • КраткоеПредставлениеОшибки - это краткое представление ошибки равнозначно тому тексту, который на ранних версиях платформы показывался пользователю в сеансе без подключенной отладки.
  • ПодробноеПредставлениеОшибки - Расширенное представление информации об ошибки. Как то, которое доступно пользователю по кнопке “Подробно” в окне с ошибкой.

Как хранить шаблоны?

Вернемся в редактор и рассмотрим небольшой его недостаток и как с ним можно бороться.

Скрин

Сразу видно что здесь нету галочки с отключением существующих настроек. Допустим, я хочу отключить эту настройку (не удаляя ее), чтобы сохранить сам шаблон представления ошибки. Такой возможности нет. Естественно, сделать две настройки на категорию нельзя. Однако, есть вариант сохранить текст с сохранием формата. Для этого просто достаточно нажать соответствующую кнопку и сохранить шаблон в формате HTML.

Скрин

А далее открыть его в браузере.

Скрин

И уже с этого файла можно простым копипастом вставить его в поле с настройкой 1С.

Это может быть полезным, когда в рамках ТЗ вы разработали шаблон, нужно его как-то передать на внедрение на продуктив. Просто сохраняете HTML.

И если вам нужно временно отключить настройку, но не потерять её содержимое - опять же HTML.

Настройка пунктов отчета

Теперь рассмотрим остальные настройки в редакторе:

Скрин

Первые две группы параметров относятся к сервису регистрации ошибок. Нужно ли отправлять отчет автоматически или же спрашивать у пользователя. Сам адрес сервиса регистрации, дополнительная информация и так далее.

Сам сервис регистрации ошибок мы рассмотрим позднее следующих публикациях. Попробуем его запустить сами и обработать входящие отчеты об ошибках.

А сейчас рассмотрим третью группу настроек.

Скрин

Здесь настраиваются пункты, которые будут добавляться в отчет об ошибке.

Давайте сделаем здесь разные варианты. Например, такие:

Скрин

Перезапустим и вызовем ошибку:

Скрин

Сразу видим, что список пунктов уменьшился. Те, что мы отключили, в принципе не предполагается к отправке. А обязательные пункты отключить нельзя.

Это очень удобно для разработчиков и администраторов. Мы можем просто запретить пользователям снимать галочки с пунктов, чтобы однозначно увидеть полные данные об ошибке.

Сбросим теперь настройки на Авто (к сожалению, кнопки по сбросу настроек нет).

Скрин

Настройки для пользователей

Помимо общих параметров в редакторе есть ещё и возможность указать точечно настройки для каждого пользователя.

Скрин

Они работают точно так же, но уже для конкретного пользователя ИБ.

Можно, например, для всех пользователей задать простой текст ошибки, а администратору выводить максимально детализированную информацию (как мы делали в своей настройке с выводом всех возможных параметров).

Программная работа

Вернемся к нашей обработке и рассмотрим принцип механизма.

ИнформацияОбОшибке.ЯвляетсяОшибкойКатегории()

Скрин

Что здесь происходит?

Мы пытаемся присвоить “Неопределено” в зарезервированную переменную. Происходит ошибка. Давайте перехватим её при помощи попытки:

Скрин

В отладке мы видим содержимое информации об ошибке.

Скрин

Это старый объект в 1С, но он получил новый метод: ЯвляетсяОшибкойКатегории()

Теперь каждая информация об ошибке относится к категориям. И все информации об ошибках относятся к категории “Все ошибки”:

Скрин

Но что нам с этим делать?

ОбработкаОтображенияОшибки()

Дело в том, что если ранее мы НЕ перехватывали ошибку через попытку, то она сразу отправлялась на экран пользователю. И мы никак не могли с этим работать.

Скрин

Но теперь платформа позволяет использовать метод в модуле приложения: ОбработкаОтображенияОшибки()

Скрин

И теперь, когда возникает ошибка, выполняется этот метод и мы на входе имеем информацию о ней. А так же можем видоизменять представление для пользователя.

Процедура имеет параметры:

  • ИнформацияОбОшибке - одноименный объект. Тот же самый, что мы перехватывали через попытку
  • ТребуетсяЗавершениеСеанса - булево - будет ли платформа требовать завершения сеанса. Изменить эту переменную вы можете, но ни на что это влиять не будет. Она нужна только для чтения.
  • СтандартнаяОбработка - булево - будет ли платформа сама отображать пользователю ошибку.

Рассмотрим пример из Демо-базы:

Скрин

Здесь мы видим, что при нарушении прав доступа будет формироваться программно текст с фамилией, именем и номером телефона Иванова Ивана. Номер телефона будет выделен форматированием.

Вообще, данный пример можно было бы настроить и в режиме предприятия. Ведь всё здесь постоянно - и ФИ и номер телефона. Но пример показывает не кейсы применения, а саму программную работу.

ОбработкаОшибок (МенеджерОбработкиОшибок)

На скрине выше мы видим использование новой глобальной переменной ОбработкаОшибок. Тип у переменной МенеджерОбработкиОшибок.

Скрин

Это переменная - самый главный объект по программному доступу к обработке ошибок.

Объект содержит методы, которые позволяют отображать информацию пользователя, получить форматированный текст с учетом настроек в базе, а так же читать и изменять эти самые настройки.

Скрин

Это даёт разработчику возможность полностью видоизменять отображаемый пользователю форматированный текст.

Если додумать наш код из демо-базы, то ФИО и контактную информацию можно брать из базы. Например, добавить регистр сведений “ОтветственныеЗаОшибки”. И в этом регистре указывать физ-лица в разрезе категорий ошибок. А в коде, при возникновении ошибки, выводить пользователю контактные данные этого физ-лица.

В следующих публикациях мы ещё остановимся подробнее на тех реальных кейсах, которые можно реализовать.

Ну и стоит помнить, что так как у нас появилась новая глобальная перменная, то если где-то в ваших текущих разработках она будет использоваться - после обновления платфомры будут ошибки. Так же, как когда-то случилось с переменной ЭтотОбъект внутри управляемой формы.

ОбработкаОшибок.КатегорияОшибкиДляПользователя()

В примере из демо-базы используется ещё один метод для определения категории. На этот раз метод относится не к ИнформацияОбОшибке, а к ОбработкаОшибок.

КатегорияОшибкиДляПользователя() возвращает конкретную категорию, к которой относится ошибка. Например, у нас это “непредвиденная ошибка”.

Какой метод использовать?

На Зазеркалье использовался метод ИнформацияОбОшибке.ЯвляетсяОшибкойКатегории(). Дело в том, что одна ошибка может относится сразу к нескольким категориям. Цитата:

У объекта ИнформацияОбОшибке есть метод ЯвляетсяОшибкойКатегории(). Одна ошибка может одновременно принадлежать к нескольким категориям.

В описании нового в платформе так же указывается этот метод

Скрин

И на ИТС тоже:

Скрин

Не совсем понятно, почему в демо-базе использовался другой метод. Если у вас есть ответ на этот вопрос, то можете писать в комментарии. Обновлю информацию в статье.

Журнал регистрации

Как обстоят дела с фиксацией ошибки в журнале регистрации?

Сейчас мы находимся в отладке в самом начале метода ОбработкаОтображенияОшибки().

Скрин

Если зайдём в журнал регистрации, то увидим, что ошибка уже в него записана:

Скрин

То есть, дополнительно фиксировать информацию в журнал регистрации не нужно, даже если мы установим СтандартнаяОбработка = Ложь. Уже на момент входа в процедуру запись в ЖР есть.

Но есть нюанс:

Ошибки внутри ОбработкаОтображенияОшибки()

Вот у нас в обработке произошла ошибка. 1С передала управление в метод ОбработкаОтображенияОшибки().

Но что будет, если в этом методе тоже произойдёт ошибка? Как себя поведёт платформа?

Вызовем ошибку внутри процедуры по обработке ошибки (интересно звучит). Для этого попытаемся присвоить “Неопределено” в зарезервированную переменную

Скрин

Выполняем обработку и видим стандартный текст с инфомацией об ошибке:

Скрин

Перейдём в формирование отчета:

Скрин

И посмотрим подробный текст ошибки:

Скрин

Как видим, это текст ошибки, которая возникла в обработке. Здесь не содержится информация об ошибке, которую мы совершили после.

А что в журнале регистрации?

Скрин

Опять же только одна ошибка. Та, которая является первопричиной. И нет никаких данных о том, что у нас была ещё и другая.

Дело в том, что когда в процедуре ОбработкаОтображенияОшибки() происходит ошибка, то 1С дальше работает по стандартной логике. Независимо от того, успели ли вы отключить СтандартнуюОбработку.

И в журнале регистрации вторая ошибка (в самом обработчике) фиксироваться не будет.

А что если мы успели сами уже отобразить показать информацию пользователю? Для этого внесём изменения в код:

Скрин

Вызываем ошибку:

Скрин

В этом тексте есть в конце слово “ТЕСТ”. А значит, это то окно, которое мы сами программно вызвали.

Но когда мы закроем это окно, 1с откроет новое:

Скрин

Это окно уже без надписи “ТЕСТ”.

Дело в том, что 1С сначала выполнила открытие окна с ошибкой, которое мы выполнили сами, а затем, после того как процедуру ОбработкаОтображенияОшибки() не удалось выполнить, открыла ещё и стандартное окно.

Этот нюанс важно помнить при разработке. И быть очень осторожным, чтобы не допустить в методе ошибку. Иначе вы как разработчик можете даже не заметить её (ведь в журнале не фиксируется), а пользователя может пытать ситуация, когда ему дважды предлагают отправить отчет.

Выводы

Новый механизм достаточно гибок и имеет множество преимуществ. Как только он станет во всю использоваться в типовых, то знание нюансов работы с ним станет для разработчика большим плюсом. Ведь вряд ли кто откажется от удобств, которые даёт автоматически формируемый отчет с данными об ошибке.

В следующих статьях мы продолжим разбирать данных механизм. Создадим свойс htttp-сервис регистрации ошибок. Попробуем реализовать пример использования обработчика ОбработкаОтображенияОшибки(). Будет интересно 👍

Авторский пост защищен лицензией CC BY 4.0 .