При интеграции 1С с внешними сервисами, мессенджерами (например, Telegram) или внешним оборудованием разработчики часто сталкиваются с необходимостью непрерывного опроса данных. Стандартное регламентное задание с интервалом запуска каждые 3–5 секунд способно перегрузить кластер серверов 1С постоянным созданием и уничтожением сеансов. Разберем основные подходы к организации режима работы 24/7, их преимущества, риски и правильные архитектурные практики.
Рассмотрим вариант реализации непрерывного процесса внутри одного фонового задания. В этом сценарии регламентное задание запускается один раз и работает в бесконечном цикле, выполняя периодический опрос с принудительной паузой. Чтобы процесс не загружал процессор сервера на 100%, между итерациями организуется задержка через вызов системной утилиты операционной системы.
Посмотрим на пример реализации процедуры с задержкой через объект WScript.Shell:
Процедура ВечныйДвигатель() Экспорт
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания();
УстановитьПривилегированныйРежим(Истина);
Shell = Новый COMОбъект("WScript.Shell");
Пока Истина Цикл
// Здесь выполняется логика опроса внешнего API или обработки очередей
ОбработатьВходящиеСобытия();
// Пауза между итерациями в 1-3 секунды
Подождать(1, Shell);
КонецЦикла;
КонецПроцедуры
Процедура Подождать(Секунд, Shell = Неопределено) Экспорт
Попытка
Если Shell = Неопределено Тогда
Shell = Новый COMОбъект("WScript.Shell");
КонецЕсли;
Shell.Run("timeout /T " + Секунд + " /nobreak", 0, Истина);
Исключение
// Исключение перехватывается, чтобы сбой ожидания не прерывал основной процесс
КонецПопытки;
КонецПроцедуры
Для настройки отказоустойчивости такого регламентного задания в конфигураторе задаются следующие параметры расписания:
Важные риски и архитектурные ограничения бесконечных циклов:
rphost. Рано или поздно процесс превысит лимиты кластера и будет принудительно завершен.WScript.Shell и утилиты timeout не будет работать на серверах под управлением Linux.Если используется классический периодический запуск по расписанию, необходимо гарантировать, что новый экземпляр задания не стартует до завершения предыдущего. Проанализируем, как программно проверить состояние фонового задания с помощью менеджера регламентных заданий:
Если ИнтерактивныйЗапуск Тогда
Попытка
ФоновоеЗадание = РегламентныеЗадания.НайтиПредопределенное(
Метаданные.РегламентныеЗадания.СКД_ЗагрузкаЖурналаСобытий
).ПоследнееЗадание;
Если ФоновоеЗадание <> Неопределено
И ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
Сообщить(НСтр("ru = 'Загрузка новых событий уже выполняется другим процессом.'"));
Возврат Ложь;
КонецЕсли;
Исключение
// Менеджер фоновых заданий может быть не активен, продолжаем выполнение кода
КонецПопытки;
КонецЕсли;
Этот метод исключает параллельную обработку одних и тех же очередей сообщений и защищает базу данных от избыточных блокировок.
В некоторых сценариях (например, когда логика требует клиентского контекста и метода ПодключитьОбработчикОжидания) запуск выполняется через командный файл операционной системы, который запускает сеанс 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 позволяет подавить стартовые диалоговые окна (например, о несоответствии сохраненной конфигурации), которые могут заблокировать автоматический запуск обработки.
Выясним, как построить надежную и масштабируемую работу с внешними сервисами без использования «вечных» циклов и bat-файлов:
Вместо постоянного опроса сервера (Polling) база 1С публикуется на веб-сервере (IIS или Apache). В конфигурации создается объект метаданных HTTP-сервис, а адрес метода регистрируется в мессенджере в качестве Webhook. В этом случае код 1С срабатывает только в момент реального поступления события от пользователя, не создавая фоновой нагрузки в моменты простоя.
Если использование Webhook невозможно, метод API getUpdates вызывается с параметром ожидания (таймаутом до 50–60 секунд). В объекте HTTPСоединение настраивается соответствующий таймаут. Сетевой сокет удерживается открытым на стороне внешнего сервера, а 1С не тратит ресурсы процессора на частые пустые запросы.
Статус авторизации пользователя, шаги диалога и временные данные никогда не следует хранить в переменных модуля или памяти открытой формы. Все состояния необходимо фиксировать в информационной базе (например, в объекте Регистр сведений с измерениями по идентификаторам чатов). Это делает систему устойчивой к любым перезапускам сеансов, регламентных заданий и рабочих процессов кластера.