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

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

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

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

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

В файловой же информационной базе механизм работает совершенно иначе:

  1. Один рабочий поток на клиентское приложение. Начиная с версии платформы 8.3.3, при запуске клиентского приложения выделяется ровно один дополнительный поток для исполнения фоновых задач. Параллельное выполнение двух фоновых заданий внутри одного запущенного сеанса файловой базы платформой не поддерживается.
  2. Один сеанс — планировщик регламентных заданий. Регламентные задания в файловой базе поручаются ровно одному из активных клиентских приложений (как правило, первому стартовавшему пользователю). Планировщик периодически проверяет очередь регламентных заданий и запускает их только тогда, когда завершены все текущие фоновые задачи этого сеанса.
  3. Проблема бесконечных циклов. Если регламентное задание или обработка запускает бесконечный цикл вида Пока Истина Цикл для непрерывного опроса сканера, весов или внешнего сервиса, единственный фоновый поток оказывается занят навсегда. Планировщик никогда не перейдет к выполнению других регламентных процедур (загрузка курсов валют, обмен данными, закрытие счетов и т.д.).

Рассмотрим подробнее способы обхода этого ограничения и правильные варианты архитектуры.

Вариант 1. Изменение логики опроса через расписание регламентного задания

Частая ошибка разработчика — реализация ожидания внутри самого кода задания с помощью циклов или пауз. Регламентное задание не должно постоянно висеть в оперативной памяти. Пересмотрим подход к расписанию:

  1. Удаляем из процедуры бесконечный цикл. Задание должно выполнять только одну итерацию: проверить состояние оборудования, зафиксировать результаты в регистре сведений и сразу завершить свою работу.
  2. Настраиваем расписание регламентного задания в конфигураторе или в пользовательском режиме. Указываем ежедневное расписание с повторением каждые несколько секунд или минут (например, с интервалом в 10–30 секунд) в течение рабочего дня.

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

Вариант 2. Использование обработчика ожидания на клиенте

Если задача заключается в опросе оборудования, подключенного непосредственно к локальному рабочему месту, использовать регламентные задания на сервере не рекомендуется. Оборудование доступно в контексте клиентского приложения, поэтому логичнее использовать метод платформы ПодключитьОбработчикОжидания().

Посмотрим на пример организации периодического опроса в модуле управляемого приложения или в открытой форме рабочего места:


&НаКлиенте
Процедура ПриНачалеРаботыСистемы()
    // Подключаем опрос оборудования каждые 5 секунд
    ПодключитьОбработчикОжидания("ОпроситьЛокальноеОборудование", 5, Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ОпроситьЛокальноеОборудование() Экспорт
    // Читаем данные с устройства и передаем на сервер для записи
    ДанныеОпроса = ПолучитьСостояниеУстройства();
    Если ДанныеОпроса <> Неопределено Тогда
        ЗаписатьДанныеОборудованияНаСервере(ДанныеОпроса);
    КонецЕсли;
КонецПроцедуры

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

Вариант 3. Разделение сеансов с помощью ключей командной строки

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

Разберем по шагам распределение ролей между сеансами:

  1. Запуск специализированного рабочего места: запуск сеанса для опроса оборудования или отдельной служебной обработки производим через командный файл (bat-скрипт) с параметром /AllowExecuteScheduledJobs -Off. Этот ключ жестко запрещает данному сеансу выступать в роли планировщика регламентных задач. Даже если внутри него выполняется длительный процесс или фоновое задание, общая очередь базы не пострадает.
  2. Запуск выделенного планировщика: на компьютере, где физически хранится файловая база данных (или на выделенном сервере/ПК), настраиваем запуск сервисного сеанса 1С с ключом /AllowExecuteScheduledJobs -Force. Этот параметр принудительно назначает сеанс ответственным за запуск и исполнение всех стандартных регламентных заданий.

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


"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F "C:\Bases\Trade" /N "РоботОборудования" /P "Пароль" /AllowExecuteScheduledJobs -Off

Вариант 4. Вынос сбора данных во внешнее приложение

Посмотрим на задачу шире: постоянный опрос физических портов компьютера (COM-порты, USB, драйверы весов и сканеров) силами файловой 1С создает избыточную нагрузку на файл базы данных 1Cv8.1CD из-за регулярных блокировок таблиц при записи. В архитектурном плане оптимальным решением является написание легковесной внешней службы или утилиты (на C#, Go, Python), которая взаимодействует с оборудованием и передает уже готовые агрегированные данные в 1С через HTTP-сервис базы либо сохраняет их в промежуточный файл обмена.

Вариант 5. Переход на платформу «1С:Предприятие 8.3 Сервер МИНИ»

Если параллельное исполнение нескольких фоновых потоков критично для бизнес-логики компании, но бюджет ограничен, полноценный переход на тяжелый сервер предприятия не обязателен. Решением может стать лицензия «1С:Сервер МИНИ» (поддерживает до 5 пользовательских сеансов) в связке с бесплатной СУБД PostgreSQL. Это полностью устраняет проблему однопоточности файловой базы и переводит регламентные задания в полноценный многопоточный серверный режим.

← На главную