Часто перед разработчиками встает задача: запустить длительную операцию ровно в 23:59:59. Проблема заключается в том, что если процесс выполняется долго и «захватывает» начало следующих суток, стандартный механизм РегламентныеЗадания может интерпретировать это как уже выполненную задачу для текущего дня. В результате на следующие сутки задание может просто не стартовать. Рассмотрим, как эффективно решить эту проблему, используя различные подходы.
Самый простой и эффективный способ «обмануть» планировщик — это распределить нагрузку между двумя заданиями или настроить одно задание с несколькими расписаниями. Если нам нужно гарантировать запуск каждый день, мы можем создать два расписания, каждое из которых срабатывает через день, но с небольшим сдвигом по времени.
Более надежный профессиональный подход — создание «умного» регламентного задания, которое запускается чаще, чем требуется, но само решает, нужно ли выполнять работу. Для этого заведем РегистрСведений, в котором будем фиксировать дату последнего успешного запуска.
Алгоритм действий:
Процедура ВыполнитьДлительнуюОперацию()
ПоследнийЗапуск = РегистрыСведений.ЖурналВыполнения.ПолучитьПоследнийЗапуск();
Если (ТекущаяДата() - ПоследнийЗапуск) < 86400 Тогда
Возврат; // Выполняли менее суток назад
КонецЕсли;
// Выполняем основную логику
// ...
РегистрыСведений.ЖурналВыполнения.ЗаписатьДатуЗапуска(ТекущаяДата());
КонецПроцедуры
Если нет возможности или желания заводить отдельный регистр, можно использовать функцию КонецПредыдущегоДня, чтобы ограничить выборку данных или условия старта. Это актуально, если задача заключается в обработке документов за прошедшие сутки.
Рассмотрим логику реализации:
// В модуле регламентного задания:
ДатаОтчета = КонецПредыдущегоДня(ТекущаяДата());
Если Не ЗначениеЗаполнено(ДатаОтчета) Тогда
Возврат;
КонецЕсли;
// Далее идет обработка данных, привязанная к ДатаОтчета
Этот метод хорош тем, что логика обработки становится детерминированной: задание всегда знает, за какой период оно отвечает, что исключает ошибки при повторных запусках.
Для особо сложных случаев, когда процесс может занимать несколько часов, рекомендуется внедрить механизм проверки времени суток. Суть заключается в том, что задание стартует в конце каждого часа, но проверяет условие «эффективного запуска»:
Этот метод является наиболее гибким: даже если сервер был перезагружен или возникла критическая ошибка, система сама «подхватит» выполнение задания при первой же проверке в конце часа, обеспечивая отказоустойчивость всей системы.
При настройке подобных заданий всегда учитывайте часовой пояс сервера. Регламентные задания в 1С зависят от настроек часового пояса сервера, на котором установлена служба 1C:Enterprise Server Agent. Если вы планируете перенос базы данных между серверами, обязательно убедитесь, что настройки времени идентичны, иначе вы столкнетесь с тем, что «конец суток» наступит на час раньше или позже запланированного.
Использование Регистра сведений или Констант для хранения меток времени — это стандарт индустрии при разработке сложных фоновых задач. Это позволяет администратору системы в любой момент увидеть через консоль, когда в последний раз задание отрабатывало успешно, что существенно упрощает отладку и поддержку системы.