Работа с регламентными заданиями во внешних обработках — это стандартная задача при использовании Библиотеки стандартных подсистем (БСП). Однако часто возникают ситуации, когда код написан верно, расписание задано, но автоматический запуск не происходит. В рамках данной статьи мы подробно разберем, как правильно реализовать программную часть, как настроить систему и где искать причины, если задание «упорно» не хочет запускаться по расписанию.
Для того чтобы БСП «увидела» нашу обработку и позволила назначить ей расписание, необходимо правильно описать экспортную функцию СведенияОВнешнейОбработке. Важно понимать, что для регламентных заданий мы должны использовать тип команды ВызовСерверногоМетода. Рассмотрим пример реализации этой функции:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.5.12.64");
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка;
ПараметрыРегистрации.Версия = "1.0";
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Подтверждение заказов (регламент)'");
НоваяКоманда.Идентификатор = "РегламентноеПодтверждениеЗаказов";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода;
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
Обратим внимание на ключевой момент: ПараметрыРегистрации.БезопасныйРежим = Ложь. Если ваша обработка должна выполнять запись в базу или работать с файловой системой, безопасный режим может накладывать ограничения. Также крайне важно, чтобы Использование было установлено именно в значение ТипКомандыВызовСерверногоМетода, так как фоновые задания выполняются исключительно на сервере.
Теперь создадим основную процедуру, которую будет вызывать планировщик. В модуле объекта обязательно должна присутствовать экспортная процедура ВыполнитьКоманду. Именно она является точкой входа при запуске обработки из очереди заданий.
Процедура ВыполнитьКоманду(ИмяКоманды, ПараметрыВыполнения = Неопределено) Экспорт
// Диспетчеризация обработчиков команд
Если ИмяКоманды = "РегламентноеПодтверждениеЗаказов" Тогда
ПодтвердитьЗаказыПоставщикам(ПараметрыВыполнения);
КонецЕсли;
КонецПроцедуры
Процедура ПодтвердитьЗаказыПоставщикам(ПараметрыВыполнения)
// Пример логики: поиск и изменение документов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказПоставщику.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказПоставщику КАК ЗаказПоставщику
|ГДЕ
| ЗаказПоставщику.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовПоставщикам.Согласован)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектЗаказ = Выборка.Ссылка.ПолучитьОбъект();
ОбъектЗаказ.Комментарий = ОбъектЗаказ.Комментарий + " [Обработано регламентом]";
Попытка
ОбъектЗаказ.Записать();
Исключение
ЗаписьЖурналаРегистрации("Ошибка.Регламент", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Проанализируем этот код. Мы используем блок Попытка...Исключение внутри цикла. Это хорошая практика для регламентных заданий, так как ошибка в одном документе не должна прерывать выполнение всей обработки. Все ошибки мы фиксируем в Журнал Регистрации.
Если вы добавили обработку в справочник «Дополнительные отчеты и обработки», настроили расписание, но в журнале регистрации пусто, проанализируем следующие причины:
AllowExecuteScheduledJobs в файле default.vrd.Чтобы понять, доходит ли выполнение до вашего кода, добавим контрольные точки. Это поможет выяснить, запускается ли сама процедура ВыполнитьКоманду.
ЗаписьЖурналаРегистрации("ВнешняяОбработка.Старт",
УровеньЖурналаРегистрации.Информация, , ,
"Начало выполнения регламентного задания");
Разместим эту строку в самом начале процедуры ВыполнитьКоманду. Если после срабатывания расписания запись в журнале не появилась, значит проблема на уровне платформы или настроек БСП (блокировки, очередь заданий). Если запись есть, но результат работы отсутствует — ищите ошибку в логике внутри ПодтвердитьЗаказыПоставщикам.
Рассмотрим ситуацию с короткими интервалами, например, «каждые 60 секунд». Для файловых баз такой агрессивный график может привести к конфликтам, если предыдущее задание не успело завершиться. Проанализируем состояние через типовой отчет «Фоновые задания» (раздел Администрирование — Обслуживание). В списке заданий ищите те, у которых имя начинается с «Запуск дополнительных обработок...». Там же можно увидеть детальный текст ошибки компиляции, если в коде модуля объекта была допущена синтаксическая ошибка.
Для успешного запуска команды по расписанию мы должны убедиться в выполнении трех условий: корректный экспортный метод в модуле объекта, отсутствие административных блокировок в консоли кластера и активность планировщика заданий в самой конфигурации. Если база файловая — не забываем про необходимость активного сеанса или специальной настройки веб-сервера.