При разработке и сопровождении конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача кастомизации стандартных окон с сообщениями о сбоях. Платформа предоставляет штатное событие клиентского модуля приложения ОбработкаОтображенияОшибки и менеджер ОбработкаОшибок с методом ПоказатьИнформациюОбОшибке. Однако разработчики нередко сталкиваются с ситуацией, когда переданные в этот метод параметры игнорируются, а на экране появляется обычное техническое окно ошибки.
Разберем детально, почему возникает такое поведение, какие скрытые нюансы платформы влияют на отображение диалога и как правильно реализовать вывод собственной информации об ошибке.
Рассмотрим типовой сценарий, в котором разработчик пытается перехватить ошибку и показать пользователю понятный текст вместе с дополнительной информацией:
Процедура ОбработкаОтображенияОшибки(ИнформацияОбОшибке, ТребуетсяЗавершениеСеанса, СтандартнаяОбработка)
ДополнительныйТекстОшибки = ОбщегоНазначения.ПолучитьДополнительныйТекстОшибки();
Если СокрЛП(ДополнительныйТекстОшибки) <> "" Тогда
ОбработкаОшибок.ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке, "Некое сообщение", ДополнительныйТекстОшибки);
СтандартнаяОбработка = Ложь;
ОбщегоНазначения.УстановитьДополнительныйТекстОшибки("");
КонецЕсли;
КонецПроцедуры
При выполнении этого кода в сеансе разработчика метод ОбработкаОшибок.ПоказатьИнформациюОбОшибке полностью игнорирует второй и третий параметры, выводя стандартное техническое окно с дампом стека. В то же время вызов обычной функции ПоказатьПредупреждение() корректно отображает переданную строку.
Выясним причину такого поведения: здесь одновременно действуют два ключевых фактора.
Главный нюанс механизма интерактивной обработки ошибок в 1С заключается в проверке активности отладки. Новое пользовательское окно с рекомендациями и дополнительными блоками выводится только в том случае, если в текущем клиентском сеансе отладка не разрешена.
Если сеанс запущен из конфигуратора по клавише F5, передан ключ запуска /debug или пользователю в текущем сеансе разрешено подключение отладки, платформа считает, что перед монитором находится разработчик. В этом режиме принудительно открывается классическое окно со стеком вызовов, а переданные пользовательские параметры оформления полностью игнорируются.
Проанализируем сигнатуру вызова метода платформы:
ОбработкаОшибок.ПоказатьИнформациюОбОшибке(<ИнформацияОбОшибке>, <ВариантОтображения>, <ДополнительнаяИнформация>, <ФормироватьОтчетОбОшибке>)
Обратим внимание на назначение параметров:
ВариантОтображенияСообщенияОбОшибке (например, СообщениеОбОшибкеДляПользователя, КраткоеПредставлениеОшибки, ПодробноеПредставлениеОшибки или Авто). Передача произвольной строки во второй параметр является синтаксической ошибкой логики, и платформа сбрасывает вариант отображения на значение по умолчанию.Разберем по шагам, как настроить корректное отображение собственного текста ошибки.
Процедура ОбработкаОтображенияОшибки(ИнформацияОбОшибке, ТребуетсяЗавершениеСеанса, СтандартнаяОбработка)
ДополнительныйТекстОшибки = ОбщегоНазначения.ПолучитьДополнительныйТекстОшибки();
Если СокрЛП(ДополнительныйТекстОшибки) <> "" Тогда
ОбработкаОшибок.ПоказатьИнформациюОбОшибке(
ИнформацияОбОшибке,
ВариантОтображенияСообщенияОбОшибке.СообщениеОбОшибкеДляПользователя,
ДополнительныйТекстОшибки,
Истина
);
СтандартнаяОбработка = Ложь;
ОбщегоНазначения.УстановитьДополнительныйТекстОшибки("");
КонецЕсли;
КонецПроцедуры
ПоказатьИнформациюОбОшибке не позволяет подменить сам заголовок и центральный текст ошибки «на лету» строковым литералом — они формируются на основе правил категорий ошибок. Настроить их можно интерактивно через меню «Функции для технического специалиста» — стандартная обработка «Управление настройками обработки ошибок», либо программно с помощью объекта НастройкаОбработкиОшибок и метода ОбработкаОшибок.УстановитьНастройкиОбработкиОшибок().Рассмотрим важные технические ограничения, о которых необходимо помнить при реализации своего обработчика:
ОбработкаОтображенияОшибки срабатывает на клиенте в момент, когда состояние приложения может быть нестабильным. Не выполняйте в ней тяжелые серверные вызовы. Если серверный вызов завершится аварийно, сеанс 1С будет закрыт без предупреждения.ОбработкаОтображенияОшибки вызовет исключение, платформа аварийно откатится к системному окну ошибки разработчика.Таким образом, для успешного вывода кастомизированной информации об ошибке достаточно передать во второй параметр значение системного перечисления ВариантОтображенияСообщенияОбОшибке и обязательно тестировать функциональность в режиме запуска приложения без отладки.