Как настроить запуск регламентного задания в конце суток, чтобы оно не пропускало выполнение при переходе через полночь?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто перед разработчиками встает задача: запустить длительную операцию ровно в 23:59:59. Проблема заключается в том, что если процесс выполняется долго и «захватывает» начало следующих суток, стандартный механизм РегламентныеЗадания может интерпретировать это как уже выполненную задачу для текущего дня. В результате на следующие сутки задание может просто не стартовать. Рассмотрим, как эффективно решить эту проблему, используя различные подходы.

Вариант 1: Использование нескольких расписаний

Самый простой и эффективный способ «обмануть» планировщик — это распределить нагрузку между двумя заданиями или настроить одно задание с несколькими расписаниями. Если нам нужно гарантировать запуск каждый день, мы можем создать два расписания, каждое из которых срабатывает через день, но с небольшим сдвигом по времени.

  1. Создаем два расписания: первое для четных дней, второе — для нечетных.
  2. Настраиваем каждое на запуск в 23:59:59.
  3. Таким образом, даже если процесс «зависнет» до наступления следующего дня, второе задание будет иметь независимый график и сработает штатно.

Вариант 2: Контроль через Регистр сведений

Более надежный профессиональный подход — создание «умного» регламентного задания, которое запускается чаще, чем требуется, но само решает, нужно ли выполнять работу. Для этого заведем РегистрСведений, в котором будем фиксировать дату последнего успешного запуска.

Алгоритм действий:

  1. Устанавливаем расписание задания, например, каждый час в конце часа.
  2. Внутри кода процедуры выполняем проверку:
    
    Процедура ВыполнитьДлительнуюОперацию()
        ПоследнийЗапуск = РегистрыСведений.ЖурналВыполнения.ПолучитьПоследнийЗапуск();
        Если (ТекущаяДата() - ПоследнийЗапуск) < 86400 Тогда
            Возврат; // Выполняли менее суток назад
        КонецЕсли;
        
        // Выполняем основную логику
        // ...
        
        РегистрыСведений.ЖурналВыполнения.ЗаписатьДатуЗапуска(ТекущаяДата());
    КонецПроцедуры
    
  3. Такой подход позволяет избежать холостых запусков и гарантирует, что задача выполнится ровно один раз в сутки, независимо от того, в какое время она была запущена изначально.

Вариант 3: Программная проверка даты выполнения

Если нет возможности или желания заводить отдельный регистр, можно использовать функцию КонецПредыдущегоДня, чтобы ограничить выборку данных или условия старта. Это актуально, если задача заключается в обработке документов за прошедшие сутки.

Рассмотрим логику реализации:


// В модуле регламентного задания:
ДатаОтчета = КонецПредыдущегоДня(ТекущаяДата());
Если Не ЗначениеЗаполнено(ДатаОтчета) Тогда
    Возврат;
КонецЕсли;

// Далее идет обработка данных, привязанная к ДатаОтчета

Этот метод хорош тем, что логика обработки становится детерминированной: задание всегда знает, за какой период оно отвечает, что исключает ошибки при повторных запусках.

Вариант 4: Использование периодических проверок (паттерн «Планировщик»)

Для особо сложных случаев, когда процесс может занимать несколько часов, рекомендуется внедрить механизм проверки времени суток. Суть заключается в том, что задание стартует в конце каждого часа, но проверяет условие «эффективного запуска»:

  1. Если текущее время больше 23:00.
  2. И за текущие сутки еще не было успешного завершения операции.
  3. Тогда приступаем к выполнению немедленно.

Этот метод является наиболее гибким: даже если сервер был перезагружен или возникла критическая ошибка, система сама «подхватит» выполнение задания при первой же проверке в конце часа, обеспечивая отказоустойчивость всей системы.

Важные рекомендации

При настройке подобных заданий всегда учитывайте часовой пояс сервера. Регламентные задания в 1С зависят от настроек часового пояса сервера, на котором установлена служба 1C:Enterprise Server Agent. Если вы планируете перенос базы данных между серверами, обязательно убедитесь, что настройки времени идентичны, иначе вы столкнетесь с тем, что «конец суток» наступит на час раньше или позже запланированного.

Использование Регистра сведений или Констант для хранения меток времени — это стандарт индустрии при разработке сложных фоновых задач. Это позволяет администратору системы в любой момент увидеть через консоль, когда в последний раз задание отрабатывало успешно, что существенно упрощает отладку и поддержку системы.

← На главную