Как организовать непрерывное выполнение фонового задания или обработку данных 24/7 в 1С?

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

При интеграции 1С с внешними сервисами, мессенджерами (например, Telegram) или внешним оборудованием разработчики часто сталкиваются с необходимостью непрерывного опроса данных. Стандартное регламентное задание с интервалом запуска каждые 3–5 секунд способно перегрузить кластер серверов 1С постоянным созданием и уничтожением сеансов. Разберем основные подходы к организации режима работы 24/7, их преимущества, риски и правильные архитектурные практики.

Решение 1. Регламентное задание с непрерывным циклом и паузой

Рассмотрим вариант реализации непрерывного процесса внутри одного фонового задания. В этом сценарии регламентное задание запускается один раз и работает в бесконечном цикле, выполняя периодический опрос с принудительной паузой. Чтобы процесс не загружал процессор сервера на 100%, между итерациями организуется задержка через вызов системной утилиты операционной системы.

Посмотрим на пример реализации процедуры с задержкой через объект WScript.Shell:


Процедура ВечныйДвигатель() Экспорт
    ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания();
    УстановитьПривилегированныйРежим(Истина);
    
    Shell = Новый COMОбъект("WScript.Shell");
    
    Пока Истина Цикл
        // Здесь выполняется логика опроса внешнего API или обработки очередей
        ОбработатьВходящиеСобытия();
        
        // Пауза между итерациями в 1-3 секунды
        Подождать(1, Shell);
    КонецЦикла;
КонецПроцедуры

Процедура Подождать(Секунд, Shell = Неопределено) Экспорт
    Попытка
        Если Shell = Неопределено Тогда
            Shell = Новый COMОбъект("WScript.Shell");
        КонецЕсли;
        Shell.Run("timeout /T " + Секунд + " /nobreak", 0, Истина);
    Исключение
        // Исключение перехватывается, чтобы сбой ожидания не прерывал основной процесс
    КонецПопытки;
КонецПроцедуры

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

  1. Расписание: каждый день, каждые 3–5 секунд.
  2. Повторять при ошибках: задается большое количество попыток (например, 1 000 000 раз через 1–2 секунды), чтобы в случае непредвиденного падения кластер серверов автоматически перезапустил процедуру.

Важные риски и архитектурные ограничения бесконечных циклов:

  1. Утечки памяти: Длительно работающий сеанс накапливает кэш и фрагментирует память рабочего процесса rphost. Рано или поздно процесс превысит лимиты кластера и будет принудительно завершен.
  2. Блокировка обновления метаданных: Постоянно активное фоновое задание удерживает блокировку и кэш метаданных, что мешает динамическому обновлению или реструктуризации базы.
  3. Зависимость от платформы Windows: Вызов WScript.Shell и утилиты timeout не будет работать на серверах под управлением Linux.
  4. Особенности файловых баз: В файловом режиме постоянное регламентное задание способно заблокировать запуск других фоновых процессов, если для него не выделен отдельный сеанс.

Решение 2. Контроль активности и защита от наложения фоновых заданий

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


Если ИнтерактивныйЗапуск Тогда
    Попытка
        ФоновоеЗадание = РегламентныеЗадания.НайтиПредопределенное(
            Метаданные.РегламентныеЗадания.СКД_ЗагрузкаЖурналаСобытий
        ).ПоследнееЗадание;
        
        Если ФоновоеЗадание <> Неопределено 
            И ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
            Сообщить(НСтр("ru = 'Загрузка новых событий уже выполняется другим процессом.'"));
            Возврат Ложь;
        КонецЕсли;
    Исключение
        // Менеджер фоновых заданий может быть не активен, продолжаем выполнение кода
    КонецПопытки;
КонецЕсли;

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

Решение 3. Внешний скрипт для запуска толстого/тонкого клиента (bat-файл)

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

Разберем структуру батника для перезапуска и поддержания сеанса:


:m0
start "1cv8" "C:\Program Files\1cv8\8.3.10.2639\bin\1cv8.exe" ENTERPRISE /S"SERVER\BASE" /N"BotUser" /P"Pass123" /Execute"C:\epf\start_all_bots.epf" /DisableStartupMessages

:m1
TIMEOUT /T 45 /NOBREAK
TaskList /FI "username EQ BotUser" /FI "IMAGENAME eq 1cv8.exe" | Find /I "1cv8.exe"
If %ErrorLevel% NEQ 0 goto :m0
goto :m1

Ключ запуска /DisableStartupMessages позволяет подавить стартовые диалоговые окна (например, о несоответствии сохраненной конфигурации), которые могут заблокировать автоматический запуск обработки.

Оптимальные архитектурные решения для работы с API мессенджеров

Выясним, как построить надежную и масштабируемую работу с внешними сервисами без использования «вечных» циклов и bat-файлов:

  1. Переход на Webhook через встроенные HTTP-сервисы 1С:

    Вместо постоянного опроса сервера (Polling) база 1С публикуется на веб-сервере (IIS или Apache). В конфигурации создается объект метаданных HTTP-сервис, а адрес метода регистрируется в мессенджере в качестве Webhook. В этом случае код 1С срабатывает только в момент реального поступления события от пользователя, не создавая фоновой нагрузки в моменты простоя.

  2. Использование метода Long Polling:

    Если использование Webhook невозможно, метод API getUpdates вызывается с параметром ожидания (таймаутом до 50–60 секунд). В объекте HTTPСоединение настраивается соответствующий таймаут. Сетевой сокет удерживается открытым на стороне внешнего сервера, а 1С не тратит ресурсы процессора на частые пустые запросы.

  3. Stateless-архитектура и хранение контекста:

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

← На главную