Как оповестить пользователя об ошибке при проведении документа, если транзакция откатывается?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет Торговля и дистрибуция
← На главную

Автоматизация рутинных процессов в 1С — задача полезная и необходимая. Однако часто разработчики сталкиваются с тем, что при выполнении фоновых заданий или роботов, проводящих документы, возникает критическая ошибка. В таких случаях платформа 1С автоматически отменяет все действия, выполненные в рамках транзакции. В результате любые попытки записать текст ошибки в регистры, константы или отправить сообщение через систему взаимодействия «откатываются» вместе с документом, и администратор или пользователь остается в неведении относительно причин сбоя.

Рассмотрим, как правильно организовать диагностику и уведомление в таких ситуациях.

Понимание природы ошибки

Когда вы оборачиваете процедуру проведения в блок Попытка...Исключение, вы ловите ошибку платформы, которая уже привела к пометке транзакции как «непригодной к фиксации» (abort). Попытка выполнить запись любых данных в базе данных внутри блока Исключение в этой же транзакции приведет к появлению сообщения об ошибке: «В данной транзакции происходили ошибки». Это фундаментальное поведение платформы, обеспечивающее целостность данных.

Решение: использование Журнала регистрации

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

Реализуем это следующим образом:


Попытка
    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    ТекстОшибки = ОписаниеОшибки();
    ЗаписьЖурналаРегистрации("Автоматическое проведение", УровеньЖурналаРегистрации.Ошибка, 
        ДокументОбъект.Метаданные(), ДокументОбъект.Ссылка, 
        "Ошибка при проведении: " + ТекстОшибки);
КонецПопытки;

Используя метод ЗаписьЖурналаРегистрации, вы гарантированно получите запись, которую можно просмотреть утром через стандартный интерфейс «Журнал регистрации» или вывести в отчет для пользователя.

Работа с фоновыми заданиями

Если вы запускаете процесс проведения через фоновое задание, у вас появляется еще один мощный инструмент. Все сообщения, отправленные методом Сообщить() внутри фонового задания, накапливаются платформой. Даже если задание завершилось с ошибкой, эти сообщения можно извлечь.

Рассмотрим, как это сделать программно:


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

Почему не стоит использовать константы

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

Комплексный подход к диагностике

Помимо логирования, стоит обратить внимание на предотвращение ошибок. Если проведение «падает» из-за того, что не заполнены счета учета, рассмотрите следующие шаги:

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

Подводя итог: для фиксации ошибок проведения всегда отдавайте предпочтение ЗаписьЖурналаРегистрации. Этот метод позволяет сохранить информацию даже при самых глубоких сбоях в логике проведения, что позволит вам оперативно находить причины проблем, не прибегая к сложным «костылям» с записью в базу данных.

← На главную