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