При разработке регламентных процедур разработчики нередко сталкиваются с ситуацией: в конфигураторе задается новое расписание, например выполнение раз в час, однако после обновления конфигурации базы данных задание продолжает запускаться с прежней периодичностью или уходит в бесконечный цикл, стартуя заново сразу же после завершения предыдущей итерации. Проанализируем, почему так происходит, как устроена работа планировщика заданий платформы 1С и какими способами можно применить актуальное расписание.
Разберем типичную ситуацию: в расписании было установлено повторение каждые 120 секунд, а сама процедура фонового задания выполняется от 3 до 5 минут. В таком случае задание перезапускается сразу же после окончания своей работы с интервалом буквально в одну секунду. Выясним причину такого поведения планировщика.
В настройках расписания существуют два принципиально разных параметра повторения внутри дня:
ПериодПовтораВТечениеДня) — интервал отсчитывается строго от момента начала выполнения предыдущего фонового задания. Если регламентная процедура выполняется 5 минут (300 секунд), а интервал задан в 120 секунд, то к моменту завершения сеанса контрольное время следующего запуска уже наступило в прошлом. Планировщик сервера 1С немедленно инициирует новый фоновый сеанс без какой-либо паузы.ПаузаПовтора) — интервал отсчитывается строго от момента завершения выполнения предыдущего фонового задания. Если для длительных процедур требуется гарантированный перерыв между выполнениями, необходимо использовать именно этот параметр.Главная архитектурная особенность заключается в том, что регламентное задание в дереве метаданных конфигуратора и регламентное задание как рабочий объект информационной базы — это разные сущности. Значения параметров, заданные разработчиком в конфигураторе (включая флаг использования и расписание), выступают исключительно в роли значений по умолчанию.
Механизм платформы устроен следующим образом:
1С:Предприятие.Если конфигурация создана на базе Библиотеки стандартных подсистем (БСП), в ней уже присутствует готовый инструмент для управления расписаниями без необходимости поиска внешних обработок. Разберем порядок действий:
1С:Предприятие под пользователем с полными административными правами.Когда требуется программно вернуть регламентному заданию то расписание, которое разработчик настроил в конфигураторе, воспользуемся объектом РегламентныеЗадания. Напишем код для внешней обработки или процедуры обновления базы данных:
МетаданныеЗадания = Метаданные.РегламентныеЗадания.ИмяВашегоРегламентногоЗадания;
Задание = РегламентныеЗадания.НайтиПредопределенное(МетаданныеЗадания);
Если Задание <> Неопределено Тогда
Задание.Расписание = МетаданныеЗадания.Расписание;
Задание.Записать();
КонецЕсли;
Посмотрим на логику работы данного фрагмента: функция НайтиПредопределенное находит рабочий экземпляр задания в базе данных по объекту описания метаданных, после чего свойству Расписание присваивается расписание из конфигурации и вызывается метод Записать(). Новое расписание вступает в силу мгновенно.
Если доступ к режиму предприятия для выполнения кода или интерактивной настройки ограничен, можно принудительно заставить платформу пересоздать запись в базе данных: