Почему не заполняется свойство ИнформацияОбОшибке фонового задания и как отслеживать ошибки регламентных заданий в 1С

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

При организации внешнего мониторинга регламентных и фоновых заданий в 1С разработчики часто сталкиваются с ситуацией: процедура завершилась некорректно (например, не подключилась внешняя COM-библиотека или упала выгрузка данных), однако свойство фонового задания ИнформацияОбОшибке остается пустым (Неопределено), а состояние задания фиксируется как Завершено, а не ЗавершенАварийно.

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

Причины отсутствия статуса «ЗавершенАварийно» и пустого свойства «ИнформацияОбОшибке»

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

Рассмотрим два типичных сценария, из-за которых статус сбоя не доходит до фонового задания:

  1. Наличие блока Попытка ... Исключение в коде процедуры:

    Если в коде обработчика регламентного задания ошибка перехвачена конструкцией Попытка ... Исключение, то с точки зрения платформы 1С процедура отработала полностью штатно. Исключительная ситуация была обработана разработчиком внутри алгоритма, выполнение кода дошло до конца процедуры, поэтому фоновое задание получает статус успешного завершения.

    
    Процедура ВыполнитьРегламентноеЗадание()
        Попытка
            // Основной алгоритм (например, подключение через COM)
            Соединение = Новый COMОбъект("V83.COMConnector");
        Исключение
            // Ошибка перехвачена и погашена внутри процедуры
            ЗаписьЖурналаРегистрации("Ошибка подключения", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
        КонецПопытки;
        // Фоновое задание завершится со статусом "Завершено", а не "ЗавершенАварийно"
    КонецПроцедуры
    
  2. Перехват ошибок механизмом Библиотеки стандартных подсистем (БСП):

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

Способы корректного мониторинга и фиксации ошибок

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

Вариант 1. Явная генерация исключения при обработке сбоя

Если требуется, чтобы фоновое задание гарантированно переходило в статус ЗавершенАварийно, а его свойство ИнформацияОбОшибке заполнялось системной структурой описания сбоя, необходимо после обработки ошибки повторно выбросить исключение с помощью оператора ВызватьИсключение:


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

В этом случае внешняя система мониторинга увидит состояние СостояниеФоновогоЗадания.ЗавершенАварийно и сможет получить детальный стек вызовов через свойство ИнформацияОбОшибке.

Вариант 2. Получение сообщений фонового задания

При использовании типовых обработок (например, УниверсальныйОбменДаннымиXML) ошибки часто не генерируют системное исключение, а выводятся через механизм сообщений пользователю или метод Сообщить(). Платформа 1С сохраняет все сообщения, выведенные в контексте фонового потока.

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


МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("УникальныйИдентификатор", ИДЗадания));
Если МассивЗаданий.Количество() > 0 Тогда
    ТекущееЗадание = МассивЗаданий[0];
    
    // Получаем массив объектов СообщениеПользователю, очищая очередь сообщений
    МассивСообщений = ТекущееЗадание.ПолучитьСообщенияПользователю(Истина);
    
    Для Каждого Сообщение Из МассивСообщений Цикл
        ТекстСообщения = Сообщение.Текст;
        // Анализируем текст на наличие ключевых слов ошибок
        Если СтрНайти(ВРег(ТекстСообщения), "ОШИБКА") > 0 Тогда
            // Обработка найденной ошибки мониторингом
        КонецЕсли;
    КонецЦикла;
КонецЕсли;

Вариант 3. Чтение системного Журнала регистрации

Если обработка выполняется под управлением БСП и гасит аварийное завершение, наиболее надежным способом программной проверки является выгрузка записей Журнала регистрации по идентификатору фонового задания за интервал его работы:


ОтборЖР = Новый Структура;
ОтборЖР.Вставить("ДатаНачала", Задание.Начало);
ОтборЖР.Вставить("ДатаОкончания", Задание.Конец);
ОтборЖР.Вставить("Уровень", УровеньЖурналаРегистрации.Ошибка);
ОтборЖР.Вставить("Сеанс", Задание.НомерСеанса);

ТаблицаОшибок = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(ТаблицаОшибок, ОтборЖР);

Если ТаблицаОшибок.Количество() > 0 Тогда
    // Задание завершилось с ошибками, зафиксированными в ЖР
    Для Каждого СтрЛога Из ТаблицаОшибок Цикл
        ТекстОшибки = СтрЛога.ПредставлениеДанных + " | " + СтрЛога.Комментарий;
    КонецЦикла;
КонецЕсли;

Вариант 4. Настройка протоколирования в УниверсальныйОбменДаннымиXML

При программной работе с обработкой УниверсальныйОбменДаннымиXML вывод ошибок подключения к COM-базе приемника не всегда попадает в стандартный протокол обмена без явного включения настроек. Для анализа результатов выгрузки необходимо программно включить запись протокола:


ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.РежимОбмена = "Выгрузка";
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Rules\ExchangeRules.xml";
ОбработкаОбмена.ИмяФайлаПротоколаСообщений = "C:\Logs\ExchangeLog.txt";
ОбработкаОбмена.ЗаписыватьВПротоколСообщений = Истина;
ОбработкаОбмена.ВыводВПротоколСообщений = Истина;

// Выполняем выгрузку
ОбработкаОбмена.ВыполнитьВыгрузку();

// Проверяем флаг ошибок и анализируем результат
Если ОбработкаОбмена.ФлагОшибок Тогда
    // Читаем сформированный файл протокола или реквизит с текстом ошибок
КонецЕсли;

Итог: для построения корректного мониторинга фоновых заданий недостаточно проверять только свойство ИнформацияОбОшибке. Необходимо комбинировать проверку статуса задания, получение накопленных пользовательских сообщений метода ПолучитьСообщенияПользователю() и анализ событий с уровнем Ошибка в Журнале регистрации.

← На главную