Почему метод ОбработкаОшибок.ПоказатьИнформациюОбОшибке игнорирует переданный текст?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке и сопровождении конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача кастомизации стандартных окон с сообщениями о сбоях. Платформа предоставляет штатное событие клиентского модуля приложения ОбработкаОтображенияОшибки и менеджер ОбработкаОшибок с методом ПоказатьИнформациюОбОшибке. Однако разработчики нередко сталкиваются с ситуацией, когда переданные в этот метод параметры игнорируются, а на экране появляется обычное техническое окно ошибки.

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

Анализ проблемы и исходного кода

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


Процедура ОбработкаОтображенияОшибки(ИнформацияОбОшибке, ТребуетсяЗавершениеСеанса, СтандартнаяОбработка)
    ДополнительныйТекстОшибки = ОбщегоНазначения.ПолучитьДополнительныйТекстОшибки();
    Если СокрЛП(ДополнительныйТекстОшибки) <> "" Тогда
        ОбработкаОшибок.ПоказатьИнформациюОбОшибке(ИнформацияОбОшибке, "Некое сообщение", ДополнительныйТекстОшибки);
        СтандартнаяОбработка = Ложь;
        ОбщегоНазначения.УстановитьДополнительныйТекстОшибки("");
    КонецЕсли;
КонецПроцедуры

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

Выясним причину такого поведения: здесь одновременно действуют два ключевых фактора.

Причина 1: Влияние режима отладки

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

Если сеанс запущен из конфигуратора по клавише F5, передан ключ запуска /debug или пользователю в текущем сеансе разрешено подключение отладки, платформа считает, что перед монитором находится разработчик. В этом режиме принудительно открывается классическое окно со стеком вызовов, а переданные пользовательские параметры оформления полностью игнорируются.

Причина 2: Несоответствие типов параметров метода

Проанализируем сигнатуру вызова метода платформы:

ОбработкаОшибок.ПоказатьИнформациюОбОшибке(<ИнформацияОбОшибке>, <ВариантОтображения>, <ДополнительнаяИнформация>, <ФормироватьОтчетОбОшибке>)

Обратим внимание на назначение параметров:

  1. ИнформацияОбОшибке — исходный объект с описанием сбоя.
  2. ВариантОтображения — принимает системное перечисление ВариантОтображенияСообщенияОбОшибке (например, СообщениеОбОшибкеДляПользователя, КраткоеПредставлениеОшибки, ПодробноеПредставлениеОшибки или Авто). Передача произвольной строки во второй параметр является синтаксической ошибкой логики, и платформа сбрасывает вариант отображения на значение по умолчанию.
  3. ДополнительнаяИнформация — строка, содержащая поясняющий текст для пользователя. Именно сюда необходимо передавать произвольное описание.
  4. ФормироватьОтчетОбОшибке — булево значение, определяющее, будет ли доступна кнопка отправки отчета.

Пошаговое решение задачи

Разберем по шагам, как настроить корректное отображение собственного текста ошибки.

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

Ограничения контекста и меры предосторожности

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

  1. Только клиентский контекст: процедура ОбработкаОтображенияОшибки срабатывает на клиенте в момент, когда состояние приложения может быть нестабильным. Не выполняйте в ней тяжелые серверные вызовы. Если серверный вызов завершится аварийно, сеанс 1С будет закрыт без предупреждения.
  2. Перехват исключений внутри обработчика: если любая строка внутри процедуры ОбработкаОтображенияОшибки вызовет исключение, платформа аварийно откатится к системному окну ошибки разработчика.
  3. Служебные сеансы: данное событие не вызывается для COM-соединений и сеансов Web-сервисов, так как в них отсутствует графический интерфейс.

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

← На главную