Новое отображение ошибок в 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-сервис регистрации ошибок. Попробуем реализовать пример использования обработчика ОбработкаОтображенияОшибки(). Будет интересно 👍