Автоматизация рутинных процессов в 1С — задача полезная и необходимая. Однако часто разработчики сталкиваются с тем, что при выполнении фоновых заданий или роботов, проводящих документы, возникает критическая ошибка. В таких случаях платформа 1С автоматически отменяет все действия, выполненные в рамках транзакции. В результате любые попытки записать текст ошибки в регистры, константы или отправить сообщение через систему взаимодействия «откатываются» вместе с документом, и администратор или пользователь остается в неведении относительно причин сбоя.
Рассмотрим, как правильно организовать диагностику и уведомление в таких ситуациях.
Когда вы оборачиваете процедуру проведения в блок Попытка...Исключение, вы ловите ошибку платформы, которая уже привела к пометке транзакции как «непригодной к фиксации» (abort). Попытка выполнить запись любых данных в базе данных внутри блока Исключение в этой же транзакции приведет к появлению сообщения об ошибке: «В данной транзакции происходили ошибки». Это фундаментальное поведение платформы, обеспечивающее целостность данных.
Наиболее надежным и архитектурно правильным способом фиксации ошибок, происходящих внутри транзакции, является использование ЖурналаРегистрации. Записи в журнале регистрации не зависят от транзакции, в которой был вызван метод их записи. Если транзакция проведения документа будет отменена, запись об ошибке в ЖР останется доступной для анализа.
Реализуем это следующим образом:
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ТекстОшибки = ОписаниеОшибки();
ЗаписьЖурналаРегистрации("Автоматическое проведение", УровеньЖурналаРегистрации.Ошибка,
ДокументОбъект.Метаданные(), ДокументОбъект.Ссылка,
"Ошибка при проведении: " + ТекстОшибки);
КонецПопытки;
Используя метод ЗаписьЖурналаРегистрации, вы гарантированно получите запись, которую можно просмотреть утром через стандартный интерфейс «Журнал регистрации» или вывести в отчет для пользователя.
Если вы запускаете процесс проведения через фоновое задание, у вас появляется еще один мощный инструмент. Все сообщения, отправленные методом Сообщить() внутри фонового задания, накапливаются платформой. Даже если задание завершилось с ошибкой, эти сообщения можно извлечь.
Рассмотрим, как это сделать программно:
// В вызывающем коде, где проверяется состояние задания
Результат = ФоновоеЗадание.ПолучитьСообщения();
Для Каждого Сообщение Из Результат Цикл
// Здесь мы можем отправить полученное сообщение
// в систему взаимодействия или по почте
ОтправитьУведомление(Сообщение.Текст);
КонецЦикла;
Частой ошибкой новичков является попытка хранить информацию об ошибке в Константах или временных регистрах. Важно понимать: как только транзакция проведения документа завершается с ошибкой и вызывает откат, любые изменения значений констант, произошедшие в блоке Исключение, также будут отменены платформой. Использование констант для передачи сообщений об ошибках в этом контексте бессмысленно, так как они всегда будут возвращаться в исходное состояние.
Помимо логирования, стоит обратить внимание на предотвращение ошибок. Если проведение «падает» из-за того, что не заполнены счета учета, рассмотрите следующие шаги:
Записать() выполняйте проверку ключевых данных документа. Если проверка не проходит, выводите сообщение и прерывайте операцию до начала транзакции.Подводя итог: для фиксации ошибок проведения всегда отдавайте предпочтение ЗаписьЖурналаРегистрации. Этот метод позволяет сохранить информацию даже при самых глубоких сбоях в логике проведения, что позволит вам оперативно находить причины проблем, не прибегая к сложным «костылям» с записью в базу данных.