При возникновении необработанного исключения клиентское приложение платформы 1С:Предприятие 8.3 выводит окно с описанием ошибки и предлагает пользователю выбор: завершить работу или продолжить выполнение. На практике пользователи часто нажимают кнопку продолжения, не сообщая о проблеме разработчикам. Это может приводить к рассинхронизации экранных форм, повторным сбоям и искажению промежуточных данных. Разберем, как устроена обработка ошибок в платформе и какими программными способами можно предотвратить нежелательное развитие событий.
Проанализируем, почему возникает диалоговое окно и можно ли отключить его глобально на уровне прав или настроек платформы:
Частая проблема возникает в предопределенных обработчиках событий (например, ПередЗаписью, ОбработкаПроверкиЗаполнения), где передается управляющий параметр Отказ. По умолчанию он равен Ложь. Если в середине обработчика происходит ошибка или досрочный выход, цепочка действий может посчитаться успешной.
Рассмотрим безопасный подход: сразу устанавливать значение Отказ = Истина в начале процедуры и сбрасывать его в Ложь только при полном и успешном завершении всех проверок.
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
// Сразу блокируем запись на случай непредвиденных сбоев в коде
Отказ = Истина;
// Выполняем проверки и подготовку данных
ВыполнитьПроверкуДанных();
ЗаполнитьСлужебныеРеквизиты();
// Разрешаем запись только при успешном завершении алгоритма
Отказ = Ложь;
КонецПроцедуры
Если участок кода выполняет критически важные расчеты, его необходимо оборачивать в конструкцию перехвата исключений. Чтобы ошибка не была проигнорирована и не привела к скрытому продолжению, используем оператор ВызватьИсключение или фиксируем факт сбоя в Журнале регистрации с помощью метода ЗаписьЖурналаРегистрации().
Посмотрим на пример правильной обработки исключения с записью подробностей:
Попытка
ВыполнитьКритическуюОперацию();
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации(
"ВыполнениеБизнесПроцесса",
УровеньЖурналаРегистрации.Ошибка,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)
);
// Пробрасываем исключение дальше с понятным текстом для пользователя
ВызватьИсключение "Критическая ошибка при обработке данных. Операция прервана.";
КонецПопытки;
Когда продолжение работы сеанса категорически недопустимо и может нарушить целостность данных в памяти, разработчик может программно закрыть приложение из блока обработки исключений на клиенте.
Для этого во встроенном языке 1С применяются следующие методы:
ЗавершитьРаботуСистемы(Ложь) — инициирует штатное закрытие клиентского приложения. Параметр Ложь отключает запрос интерактивного подтверждения закрытия у пользователя.ПрекратитьРаботуСистемы() — выполняет аварийное немедленное завершение сеанса без вызова обработчиков закрытия.Разберем пример вызова принудительного завершения работы на клиенте:
&НаКлиенте
Процедура ЗапуститьПоследовательнуюОбработку()
Попытка
ВыполнитьСложныйРасчетНаСервере();
Исключение
ПоказатьПредупреждение(, "Обнаружена критическая ошибка! Работа программы будет завершена.");
ЗавершитьРаботуСистемы(Ложь);
КонецПопытки;
КонецПроцедуры
Чтобы не зависеть от сообщений пользователей, рекомендуется настроить автоматическую регистрацию и мониторинг сбоев: