Начиная с версии платформы 1С:Предприятие 8.3.17 (при установленном режиме совместимости 8.3.17 и выше) разработчики фирмы «1С» изменили стандартное поведение системы при возникновении неперехваченных исключений. Вместо привычного окна с техническим описанием сбоя, модулем и номером строки пользователи стали видеть лаконичное сообщение: «К сожалению, возникла непредвиденная ситуация». Это решение было принято для того, чтобы не пугать рядовых пользователей сложными техническими терминами и стеком вызовов, однако для разработчиков, аналитиков и администраторов баз данных это существенно усложнило первичную диагностику неполадок.
Выясним причину такого поведения и подробно разберем все доступные способы вернуть информативные сообщения об ошибках.
Платформа 1С предоставляет встроенный механизм управления сообщениями об ошибках, доступный через пользовательский интерфейс. Этот способ не требует снятия конфигурации с поддержки или изменения программного кода.
Разберем по шагам, как настроить вывод текста ошибки для текущего пользователя:
[КраткоеПредставлениеОшибки] — возвращает лаконичное описание сбоя (аналогично поведению платформы до релиза 8.3.17);[ПодробноеПредставлениеОшибки] — выводит полный стек вызовов с указанием модулей, методов и строк исходного кода;[ПредставлениеОшибкиДляПользователя] — формирует понятное описание без системных технических рекомендаций;[СтандартноеСообщениеОбОшибкеДляПользователя] — стандартный платформенный текст по умолчанию.Если нам необходимо централизованно задать формат вывода сообщений для группы пользователей или автоматизировать процесс при первом запуске информационной базы, воспользуемся возможностями встроенного языка. Для этого в платформе предусмотрен менеджер ОбработкаОшибок.
Посмотрим на пример программной установки шаблона текста для системных исключений:
Настройки = ОбработкаОшибок.ПолучитьНастройкиПользователя();
Тексты = Новый ТекстыСообщенияОбОшибке;
Тексты.ТекстОшибки = "[КраткоеПредставлениеОшибки]";
Тексты.ПодробныйТекстОшибки = "[ПодробноеПредставлениеОшибки]";
Настройки.ТекстыСообщенийОбОшибках.Вставить(
КатегорияОшибки.ИсключениеВызванноеИзВстроенногоЯзыка,
Тексты
);
ОбработкаОшибок.УстановитьНастройкиПользователя(Настройки);
Рассмотрим подробнее логику работы этого фрагмента. Сначала с помощью метода ПолучитьНастройкиПользователя() мы извлекаем текущую структуру настроек сеанса. Затем создаем объект типа ТекстыСообщенияОбОшибке, наполняем его макетами с макроподстановками и связываем с требуемым элементом системного перечисления КатегорияОшибки. Метод УстановитьНастройкиПользователя() сохраняет новые правила для текущего пользователя информационной базы.
Для полного контроля над визуализацией сбоев разработчик может воспользоваться событием клиентского контекста в модуле управляемого приложения или в аналогичном обработчике расширения конфигурации.
Проанализируем пример использования обработчика ОбработкаОтображенияОшибки:
Процедура ОбработкаОтображенияОшибки(ИнформацияОбОшибке, ТребуетсяЗавершениеСеанса, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
ПоказатьПредупреждение(, ТекстОшибки, , "Обнаружена ошибка выполнения");
КонецПроцедуры
Разберем ключевые моменты этого решения. Установка параметра СтандартнаяОбработка = Ложь полностью блокирует появление штатного платформенного окна с сообщением о непредвиденной ситуации. Из параметра ИнформацияОбОшибке с помощью встроенной функции ПодробноеПредставлениеОшибки() извлекается детальное описание сбоя вместе со стеком вызовов. Этот текст мы можем вывести пользователю в привычном окне предупреждения либо отправить во внешнюю систему логирования.
Если у пользователя нет прав на изменение конфигурации или доступ к функциям для технического специалиста заблокирован администратором, полный текст ошибки всегда можно извлечь прямо из появившегося диалогового окна.
При работе с механизмами отображения ошибок следует учитывать несколько важных нюансов:
conf.cfg или файл описания баз ibases.v8i) невозможно. Механизм управляется исключительно на уровне базы данных и встроенного языка 1С.EXCP.