При возникновении необработанных исключений в пользовательском режиме (например, при делении на ноль или обращении к несуществующему реквизиту) платформа 1С:Предприятие выводит системное модальное окно с описанием проблемы и кнопками «Завершить работу», «Перезапустить» или «Подробно». У разработчиков часто возникает задача модифицировать этот диалог — например, добавить кнопку «Отправить ошибку разработчику», чтобы пользователь в один клик мог передать диагностические данные. Рассмотрим, возможно ли изменить эту форму и какие существуют альтернативные способы решения данной задачи.
Выясним причину, почему системное окно ошибки нельзя отредактировать в конфигураторе:
Application.ThreadException или window.onerror). Если ошибка не была обработана в кодовой конструкции разработчика, управление сразу передается системному диалогу платформы.Таким образом, внедрить произвольные кнопки или перерисовать стандартный диалог ошибки платформенными средствами невозможно. Разберем рабочие и архитектурно правильные способы сбора сведений об ошибках.
Иногда разработчики пытаются решить задачу тотальным оборачиванием кода в блоки перехвата:
Попытка
// Потенциально опасный код
Результат = Значение1 / Значение2;
Исключение
// Вызов своей формы или отправка письма
ПоказатьПредупреждение(, "Произошла ошибка: " + ОписаниеОшибки());
КонецПопытки;
Такой подход имеет серьезные архитектурные недостатки:
Попытка ... Исключение каждую строку всей конфигурации невозможно и нерационально.Конструкцию Попытка ... Исключение следует применять строго точечно (например, при интеграциях, обращении к внешним веб-сервисам, парсинге файлов или работе с COM-объектами), а общую диагностику строить на специализированных механизмах.
Если конфигурация создана на базе Библиотеки стандартных подсистем (БСП), в ней уже присутствуют готовые инструменты для решения этой задачи:
Все системные необработанные исключения пользователей автоматически фиксируются в Журнале регистрации с уровнем важности УровеньЖурналаРегистрации.Ошибка. Мы можем настроить регламентное задание, которое будет регулярно опрашивать журнал и отправлять отчеты разработчикам.
Рассмотрим пример программного кода для процедуры регламентного задания, собирающего свежие ошибки:
Процедура ОтправитьОшибкиРазработчику() Экспорт
ПериодПроверки = ТекущаяДатаСеанса() - 300; // Проверяем за последние 5 минут
Отбор = Новый Структура;
Отбор.Вставить("ДатаНачала", ПериодПроверки);
Отбор.Вставить("Уровень", УровеньЖурналаРегистрации.Ошибка);
ТаблицаОшибок = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(ТаблицаОшибок, Отбор, "Дата, Пользователь, ИмяПользователя, Событие, ПредставлениеСобытия, ОписаниеВобытия, Метаданные, Данные");
Если ТаблицаОшибок.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ТекстСообщения = "";
Для Каждого СтрокаОшибки Из ТаблицаОшибок Цикл
ТекстСообщения = ТекстСообщения + "=== Ошибка от " + Строка(СтрокаОшибки.Дата) + " ===" + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Пользователь: " + СтрокаОшибки.ИмяПользователя + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Событие: " + СтрокаОшибки.ПредставлениеСобытия + Символы.ПС;
ТекстСообщения = ТекстСообщения + "Описание: " + СтрокаОшибки.ОписаниеВобытия + Символы.ПС + Символы.ПС;
КонецЦикла;
// Отправка сформированного текста (через ИнтернетПочта, HTTP-запрос в мессенджер или таск-трекер)
ОтправитьУведомлениеРазработчикам(ТекстСообщения);
КонецПроцедуры
Такой подход полностью автоматизирует процесс: разработчик оперативно получает стек вызовов, контекст выполнения и данные пользователя даже в том случае, если пользователь просто закрыл окно ошибки и не сообщил о ней.
Для высоконагруженных или критически важных информационных баз оптимальным решением является использование средств низкоуровневого мониторинга:
EXCP (исключительные ситуации) и EXCPCNTX (контекст исключений) на уровне сервера приложений 1С.