Почему регламентные задания в файловой базе 1С запускаются только раз в минуту и как это обойти?

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

При разработке и отладке механизмов автоматизации в платформе 1С:Предприятие разработчики часто сталкиваются с неожиданным поведением планировщика задач. Типичный сценарий: вы создаете новое регламентное задание, настраиваете его расписание на запуск каждые 10 секунд, но при тестировании в файловой базе обнаруживаете, что оно упорно запускается гораздо реже — примерно раз в 60 секунд. При этом база абсолютно пуста, другие процессы отсутствуют, а само задание выполняется мгновенно.

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

Выясняем причину: архитектурные ограничения файлового режима

Для того чтобы понять логику работы платформы, обратимся к официальной технической документации. В файловом варианте работы базы данных архитектура выполнения фоновых и регламентных заданий имеет ряд жестких ограничений, зашитых на уровне ядра платформы 1С:

  1. Интервал опроса планировщика: В файловой базе данных планировщик регламентных заданий осуществляет проверку таблицы расписаний строго один раз в 60 секунд. Платформа не проверяет очередь непрерывно, чтобы избежать избыточной нагрузки на файловую систему и предотвратить постоянные блокировки файла 1Cv8.1CD.
  2. Задержка при запуске системы: Инициализация планировщика фоновых заданий происходит не мгновенно. Она запускается только через 60 секунд после старта самого первого клиентского приложения (или первой попытки выполнить фоновое задание программно).
  3. Задержка планировщика регламентных заданий: Сам механизм планирования регламентных заданий инициализируется еще через 60 секунд после запуска планировщика фоновых заданий. Таким образом, после открытия программы регламентные задания начнут выполняться в штатном режиме максимум через 120 секунд.

Именно поэтому, какое бы маленькое значение интервала (например, 5 или 10 секунд) вы ни указали в настройках расписания регламентного задания, в файловом режиме оно физически не сможет запускаться чаще, чем один раз в минуту.

Почему ручное обновление списка ускоряет запуск?

Многие разработчики замечают интересную особенность: если открыть форму «Консоль регламентных заданий» или программный список фоновых заданий и активно нажимать кнопку «Обновить», то регламентное задание начинает выполняться вовремя — каждые 10 секунд, как и настроено в расписании.

Проанализируем эту ситуацию. Принудительное обновление интерфейса в администрирующих формах неявно вызывает системные механизмы платформы. Платформа воспринимает обращение к списку фоновых заданий как команду немедленно синхронизировать состояние планировщика и выполнить накопившиеся в очереди задачи. Происходит внеочередной «тик» таймера, игнорирующий стандартное 60-секундное ограничение. Однако оставлять открытую форму с автообновлением на рабочем сервере — крайне неэффективное решение.

Разберем способы обхода ограничения в 60 секунд

Если специфика вашей бизнес-логики (например, оперативный обмен с сайтом, постоянное получение данных из внешней системы или интеграция с оборудованием) требует выполнения кода чаще, чем один раз в минуту, стандартный механизм регламентных заданий в файловой базе использовать напрямую нельзя. Рассмотрим подробнее два эффективных обходных пути.

Вариант А: Использование обработчика ожидания (Рекомендуемый способ)

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

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

Рассмотрим по шагам реализацию данного подхода:

1. В модуле управляемого приложения пропишем инициализацию обработчика при старте системы:


Процедура ПриНачалеРаботыСистемы()
    #Если ТонкийКлиент Или ТолстыйКлиентУправляемоеПриложение Тогда
        // Проверяем, что это запуск под специальным техническим пользователем
        Если ИмяПользователя() = "РоботОбмена" Тогда
            ПодключитьОбработчикОжидания("ВыполнитьОперативноеДействие", 10, Ложь);
        КонецЕсли;
    #КонецЕсли;
КонецПроцедуры

2. Там же, в модуле управляемого приложения, опишем процедуру, которая будет вызываться каждые 10 секунд:


Процедура ВыполнитьОперативноеДействие() Экспорт
    // Вызываем процедуру общего модуля, выполняющую полезную работу на сервере
    Попытка
        ОбработкаОперативныхЗаданийСервер.ВыполнитьОбменДанными();
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка робота обмена",
            УровеньЖурналаРегистрации.Ошибка,,,
            ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;
КонецПроцедуры

Этот способ гарантирует стабильный запуск вашей процедуры строго каждые 10 секунд без каких-либо отклонений и задержек.

Вариант Б: Принудительный вызов обработки планировщика

Если вам принципиально важно использовать именно стандартный механизм регламентных заданий (например, чтобы иметь возможность гибко менять расписание через стандартные интерфейсы без изменения кода), вы можете использовать специальный метод платформы ВыполнитьОбработкуЗаданий().

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


Процедура ПриНачалеРаботыСистемы()
    #Если ТонкийКлиент Или ТолстыйКлиентУправляемоеПриложение Тогда
        Если ИмяПользователя() = "ПланировщикФайловый" Тогда
            ПодключитьОбработчикОжидания("ПринудительныйЗапускЗаданий", 5, Ложь);
        КонецЕсли;
    #КонецЕсли;
КонецПроцедуры

Процедура ПринудительныйЗапускЗаданий() Экспорт
    // Метод заставляет платформу проверить расписание регламентных заданий прямо сейчас
    ВыполнитьОбработкуЗаданий();
КонецПроцедуры

При вызове метода ВыполнитьОбработкуЗаданий() платформа немедленно проверяет таблицу регламентных заданий, находит те, у которых подошло время запуска (так как прошло уже 10 секунд с прошлого запуска), и запускает их, не дожидаясь наступления 60-секундного системного интервала.

Важные нюансы работы регламентных заданий в файловом режиме

Помимо ограничения по времени запуска, при проектировании системы в файловом варианте необходимо учитывать следующие критические особенности:

Понимание этих архитектурных особенностей позволит вам проектировать надежные и быстродействующие решения даже в рамках ограничений файлового режима работы 1С:Предприятия.

← На главную