При работе с механизмами автоматизации в 1С программисты часто сталкиваются с неочевидным поведением планировщика регламентных заданий. Казалось бы, простая задача — запускать обработку в 5 минут каждого часа — превращается в настоящую проблему: задание либо стартует немедленно после нажатия кнопки «ОК», либо со временем начинает «съезжать» по графику. В этой статье мы подробно разберем, почему так происходит, и какими методами можно добиться прецизионной точности запуска.
Рассмотрим ситуацию: вы создаете новое регламентное задание, указываете время начала 00:05:00 и ставите интервал повторения 3600 секунд (1 час). Как только вы устанавливаете флаг Использование и сохраняете настройки, система инициирует выполнение немедленно. Проанализируем причину такого поведения.
В платформу «1С:Предприятие» заложен механизм «наверстывания» пропущенных заданий. Если дата начала в расписании указана в прошлом (например, стоит текущее число, но время 00:05 уже прошло), планировщик считает, что сеанс был пропущен по техническим причинам, и пытается выполнить его как можно скорее. Чтобы избежать этого эффекта, выполним следующие шаги:
Многие разработчики используют настройку «Повторять через...». Однако при использовании простого интервала (например, каждые 60 минут) возникает эффект накопленного смещения. Выясним причину: планировщик 1С в стандартном режиме отсчитывает интервал до следующего запуска не от планового времени старта, а от момента завершения предыдущего фонового задания.
Пример ситуации:
Задание должно стартовать в 12:05. Если оно выполнялось 3 минуты и завершилось в 12:08, то при интервале в 3600 секунд следующий запуск произойдет в 13:08. Через сутки время запуска сместится на целый час. Это критично для обменов данными и регламентных операций, привязанных к бизнес-циклам.
Самый надежный способ заставить 1С работать по строгому графику без использования сторонних утилит — это настройка детального дневного расписания. Разберем по шагам, как это сделать:
В этом случае платформа будет использовать жесткие временные метки. Даже если предыдущее задание завершилось позже или произошел сбой, следующий запуск будет инициирован ровно в указанное время начала новой строки расписания. Это полностью исключает «дрейф» времени.
Если вы не хотите прописывать 24 строки в расписании вручную, можно применить «хитрость» на уровне кода. Настроим расписание на запуск раз в минуту, а внутри самой процедуры добавим проверку времени. Проанализируем пример кода:
Процедура ВыполнитьРегламентноеЗадание() Экспорт
ТекущееВремя = ТекущаяДата();
МинутаЗапуска = Минута(ТекущееВремя);
// Нам нужно, чтобы полезная работа выполнялась только в 5 минут
Если МинутаЗапуска <> 5 Тогда
Возврат;
КонецЕсли;
// Далее идет основной код задания
ВыполнитьОбменДанными();
КонецПроцедуры
Этот метод гарантирует, что даже если планировщик инициирует фоновое задание чуть раньше или позже (в пределах одной минуты), выполнение основной логики произойдет только в целевой интервал. Однако стоит учитывать, что это создает лишние записи в журнале регистрации каждую минуту. Чтобы этого избежать, можно использовать ПараметрыСеанса или запись в константу времени последнего успешного запуска.
Рассмотрим еще один лайфхак, который упоминали опытные пользователи на форуме. Чтобы избежать запуска задания в момент нажатия кнопки «ОК» (когда вы редактируете расписание в середине дня), можно временно ограничить время завершения в расписании так, чтобы текущий момент не попадал в рабочий диапазон.
Например, если сейчас 12:00, а вы хотите, чтобы задание начало работать с 00:05 следующего дня:
Система увидит, что текущее время (12:00) не входит в интервал между 00:05 и 00:10, и не станет запускать задание немедленно.
Важно помнить, что точность работы планировщика зависит от режима работы базы данных:
Использование РегламентныеЗадания — это мощный инструмент, но он требует понимания внутренней логики платформы. Применяя детальное дневное расписание и контролируя дату старта, вы сможете избежать «дичи» с расписанием и обеспечить стабильную работу ваших автоматизированных процессов.