Как обеспечить точный запуск регламентных заданий в файловой базе 1С

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

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

Почему планировщик в файловой базе работает "неточно"?

Разберем внутренние механизмы платформы. В файловом режиме нет отдельного системного процесса, который бы постоянно мониторил таблицу регламентных заданий. Проверка "не пора ли что-то запустить" выполняется одним из активных сеансов. По умолчанию платформа проверяет наличие заданий к выполнению с определенной периодичностью (обычно это раз в 60 секунд). Если ваше задание должно было запуститься в 12:00:00, а проверка сеансом произошла в 12:00:45, вы получите ту самую задержку, на которую жалуются пользователи.

Более того, настройка "Повторять через" в интерфейсе 1С часто интерпретируется системой как пауза между выполнениями. Если задание работало 2 минуты, а интервал установлен в 5 минут, то следующий запуск произойдет через 7 минут от начала первого. Для таких задач, как получение котировок или обмен данными в реальном времени, это критично. Рассмотрим, как это исправить.

Решение 1: Имитация функции Sleep через фоновые задания

Наиболее элегантный программный способ — создать "вечное" фоновое задание, которое само контролирует моменты своей активности. В 1С нет штатной функции Пауза() или Sleep(), которая бы не блокировала интерфейс и не нагружала процессор. Однако мы можем использовать метод ОжидатьЗавершения() объекта ФоновоеЗадание.

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


Процедура Пауза(Секунд) Экспорт
    
    ТекущийСеансИнформационнойБазы = ПолучитьТекущийСеансИнформационнойБазы();
    ФоновоеЗадание = ТекущийСеансИнформационнойБазы.ПолучитьФоновоеЗадание();
    
    // Если мы не в фоновом задании, создадим вспомогательное
    Если ФоновоеЗадание = Неопределено Тогда
        Параметры = Новый Массив;
        Параметры.Добавить(Секунд);
        // Вызываем пустую экспортную процедуру из общего модуля
        ФоновоеЗадание = ФоновыеЗадания.Выполнить("ОбщегоНазначенияСервер.ПустаяПроцедура", Параметры);
    КонецЕсли;
        
    Попытка
        // Платформа будет ждать указанное количество секунд
        ФоновоеЗадание.ОжидатьЗавершения(Секунд);
    Исключение
        // Исключение по таймауту — это и есть окончание нашей паузы
        Возврат;
    КонецПопытки;
    
КонецПроцедуры

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

Решение 2: Выделенный сеанс "Менеджера регламентных заданий"

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

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

Решение 3: Использование внешнего планировщика задач Windows

Если требуется гарантированная точность запуска "секунда в секунду", стоит рассмотреть вариант выноса управления процессом на уровень операционной системы. Планировщик Windows (Task Scheduler) работает гораздо точнее встроенного механизма 1С в файловом режиме.

Разберем по шагам, как это реализовать:

  1. Создаем внешнюю обработку (.epf), в которой в процедуре ПриОткрытии (или в модуле объекта для программного вызова) прописана логика получения котировок.
  2. В конце логики обязательно добавляем команду ЗавершитьРаботуСистемы(Ложь).
  3. В планировщике Windows создаем задачу, которая запускает 1cv8.exe с параметрами: ENTERPRISE /F "ПутьКБазе" /Execute "ПутьКОбработке" /N "ИмяПользователя" /P "Пароль".
  4. Настраиваем расписание в Windows: "Повторять каждые 5 минут".

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

Решение 4: Переход на современные протоколы (WebSockets)

Проанализируем специфику задачи автора — получение котировок с биржи. Традиционный метод опроса (polling) раз в 5 минут постепенно уходит в прошлое. Если API биржи поддерживает протокол WebSockets, это полностью снимает вопрос настройки расписания.

Начиная с версии 8.3.20, в платформе 1С появилась нативная поддержка WebSockets. Вместо того чтобы "дергать" сервер каждые 5 минут, мы можем один раз установить соединение. Сервер сам будет присылать данные в 1С в момент их изменения. Рассмотрим преимущества:

Подведение итогов

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

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

← На главную