Как запретить пользователю продолжать работу при возникновении ошибки в 1С:Предприятие?

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

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

Поведение платформы и архитектурные ограничения

Проанализируем, почему возникает диалоговое окно и можно ли отключить его глобально на уровне прав или настроек платформы:

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

Способ 1. Безопасная инициализация флагов в обработчиках событий

Частая проблема возникает в предопределенных обработчиках событий (например, ПередЗаписью, ОбработкаПроверкиЗаполнения), где передается управляющий параметр Отказ. По умолчанию он равен Ложь. Если в середине обработчика происходит ошибка или досрочный выход, цепочка действий может посчитаться успешной.

Рассмотрим безопасный подход: сразу устанавливать значение Отказ = Истина в начале процедуры и сбрасывать его в Ложь только при полном и успешном завершении всех проверок.


Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
	
	// Сразу блокируем запись на случай непредвиденных сбоев в коде
	Отказ = Истина;
	
	// Выполняем проверки и подготовку данных
	ВыполнитьПроверкуДанных();
	ЗаполнитьСлужебныеРеквизиты();
	
	// Разрешаем запись только при успешном завершении алгоритма
	Отказ = Ложь;
	
КонецПроцедуры

Способ 2. Локализация критических алгоритмов через Попытка...Исключение

Если участок кода выполняет критически важные расчеты, его необходимо оборачивать в конструкцию перехвата исключений. Чтобы ошибка не была проигнорирована и не привела к скрытому продолжению, используем оператор ВызватьИсключение или фиксируем факт сбоя в Журнале регистрации с помощью метода ЗаписьЖурналаРегистрации().

Посмотрим на пример правильной обработки исключения с записью подробностей:


Попытка
	ВыполнитьКритическуюОперацию();
Исключение
	ИнформацияОбОшибке = ИнформацияОбОшибке();
	
	ЗаписьЖурналаРегистрации(
		"ВыполнениеБизнесПроцесса",
		УровеньЖурналаРегистрации.Ошибка,,,
		ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)
	);
	
	// Пробрасываем исключение дальше с понятным текстом для пользователя
	ВызватьИсключение "Критическая ошибка при обработке данных. Операция прервана.";
КонецПопытки;

Способ 3. Программное принудительное завершение сеанса

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

Для этого во встроенном языке 1С применяются следующие методы:

  1. ЗавершитьРаботуСистемы(Ложь) — инициирует штатное закрытие клиентского приложения. Параметр Ложь отключает запрос интерактивного подтверждения закрытия у пользователя.
  2. ПрекратитьРаботуСистемы() — выполняет аварийное немедленное завершение сеанса без вызова обработчиков закрытия.

Разберем пример вызова принудительного завершения работы на клиенте:


&НаКлиенте
Процедура ЗапуститьПоследовательнуюОбработку()
	
	Попытка
		ВыполнитьСложныйРасчетНаСервере();
	Исключение
		ПоказатьПредупреждение(, "Обнаружена критическая ошибка! Работа программы будет завершена.");
		ЗавершитьРаботуСистемы(Ложь);
	КонецПопытки;
	
КонецПроцедуры

Способ 4. Централизованный сбор информации об ошибках

Чтобы не зависеть от сообщений пользователей, рекомендуется настроить автоматическую регистрацию и мониторинг сбоев:

  1. Мониторинг Журнала регистрации: Все необработанные исключения получают уровень Ошибка. Настроив регулярный анализ логов или регламентную выгрузку событий с уровнем ошибки, администраторы и разработчики могут оперативно реагировать на инциденты.
  2. Подсистемы БСП: Использование стандартных подсистем Библиотеки стандартных подсистем позволяет отправлять отчеты об ошибках со стеком вызовов на корпоративную почту или сервис разработчиков в фоновом режиме.
← На главную