При разработке и сопровождении систем на базе платформы 1С:Предприятие часто возникает необходимость вынесения доработок в расширения конфигурации. Это позволяет сохранить типовую конфигурацию на поддержке и упростить процесс обновления. Однако, когда дело доходит до автоматизации процессов и запуска периодических задач, разработчики сталкиваются с важным вопросом: как правильно запустить регламентное задание, код которого находится внутри расширения?
Ранее эта задача требовала нетривиальных подходов и использования различных обходных путей, особенно если конфигурация работает локально, а не в облачном сервисе 1С:Фреш. В этой статье мы подробно разберем, почему стандартные инструкции для облака не работают на локальных базах, какие механизмы предлагает библиотека стандартных подсистем (БСП) для старых платформ, и как решить эту задачу изящно и современно в новых версиях платформы 1С.
Часто разработчики пытаются использовать рекомендации из документации к сервису 1С:Фреш. В этой документации предлагается создать в расширении общий модуль с экспортной процедурой ВыполнитьКоманду() и подключить расширение. Однако при попытке настроить такое задание в локальной файловой или клиент-серверной базе вкладка «Команды» попросту отсутствует.
Давайте проанализируем ситуацию. В облачной инфраструктуре 1С:Фреш за запуск и расписание таких команд отвечает специальный внешний компонент — Менеджер сервиса. Именно он считывает структуру расширения, находит нужные процедуры и берет на себя управление их периодическим вызовом. В локальной информационной базе (on-premise) Менеджера сервиса нет. Платформа 1С «из коробки» (в старых версиях) не умеет автоматически распознавать процедуры расширений как полноценные регламентные задания без явного указания в метаданных.
Начиная с версии платформы 8.3.23, фирма «1С» добавила полноценную возможность добавлять регламентные задания непосредственно в расширения конфигурации. Это кардинально изменило подход к разработке и избавило от необходимости использовать сторонние механизмы.
Разберем по шагам, как настроить регламентное задание в расширении на современной платформе:
РегламентноеЗадание_ОбработкаДанныхРасширения).Пример кода экспортного метода в общем модуле расширения РШ_РегламентныеПроцедуры:
Процедура ВыполнитьОбработкуДанных() Экспорт
// Код, который выполняет регламентные действия
ЗаписьЖурналаРегистрации(
"Расширение.РегламентноеЗадание",
УровеньЖурналаРегистрации.Информация,
,
,
"Запуск регламентного задания из расширения выполнен успешно!"
);
КонецПроцедуры
Этот способ является наиболее предпочтительным, так как он не зависит от БСП, работает максимально быстро и поддерживается платформой на уровне ядра.
Если вы работаете на более старых версиях платформы (например, 8.3.17), то напрямую добавить регламентное задание в расширение не получится — платформа выдаст ошибку или просто заблокирует эту возможность. В таком случае на помощь приходит интеграция с подсистемой БСП «Дополнительные отчеты и обработки».
Рассмотрим подробнее эту популярную методику. Суть подхода заключается в том, чтобы использовать существующее в БСП предопределенное регламентное задание ЗапускДополнительныхОбработок и программно перехватить логику его выполнения.
Разберем по шагам реализацию этого механизма:
РШ_БСП_Перехват).ДополнительныеОтчетыИОбработки и процедура ВыполнитьОбработкуПоРегламентномуЗаданию.&Вместо и опишите логику проверки: если система пытается запустить наше кастомное задание, мы перенаправляем управление на процедуру нашего расширения. В противном случае — передаем управление стандартному коду БСП через ПродолжитьВызов().Посмотрим на пример реализации такого перехвата в общем модуле расширения:
&Вместо("ВыполнитьОбработкуПоРегламентномуЗаданию")
Процедура РШ_ВыполнитьОбработкуПоРегламентномуЗаданию(ПараметрыВыполнения, РезультатВыполнения)
// Проверяем, относится ли задача к нашему расширению
Если ПараметрыВыполнения.Свойство("ИмяНашегоЗадания") И ПараметрыВыполнения.ИмяНашегоЗадания = "МояСпециальнаяПроцедура" Тогда
Попытка
// Вызываем процедуру из общего модуля нашего расширения
РШ_РегламентныеПроцедуры.ВыполнитьОбработкуДанных();
РезультатВыполнения = Истина;
Исключение
ЗаписьЖурналаРегистрации(
"Расширение.ОшибкаРегламентногоЗадания",
УровеньЖурналаРегистрации.Ошибка,
,
,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
);
РезультатВыполнения = Ложь;
КонецПопытки;
Иначе
// Передаем управление стандартному механизму БСП
ПродолжитьВызов(ПараметрыВыполнения, РезультатВыполнения);
КонецЕсли;
КонецПроцедуры
Этот метод требует аккуратности, так как при обновлении БСП структура передаваемых параметров (например, структура ПараметрыВыполнения) может измениться. Тем не менее, для старых версий платформы это надежное решение для интеграции логики расширения в расписание системы.
Поскольку базы часто работают в файловом режиме на локальных компьютерах, необходимо учитывать критически важное ограничение файловых баз 1С. В отличие от клиент-серверного варианта, где за расписанием следит служба Сервера 1С:Предприятия (агент сервера), в файловом режиме нет постоянно активного фонового процесса сервера.
Чтобы регламентные задания в файловой базе выполнялись стабильно, необходимо соблюдение одного из условий:
/AllowExecuteScheduledJobs.Пример строки запуска для планировщика Windows:
"C:\Program Files\1cv8\8.3.17.1386\bin\1cv8.exe" ENTERPRISE /F"C:\PathToMyDatabase" /N"ScheduledJobUser" /P"MyPassword" /AllowExecuteScheduledJobs -Force
Такой подход гарантирует, что регламентные процедуры будут отрабатывать строго по расписанию, не мешая реальным пользователям выполнять их повседневную работу в программе.