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

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

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

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

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

В файловом режиме действуют следующие жесткие правила:

  1. Один исполнитель на всю базу. Из всех активных пользовательских сеансов платформа выбирает только один сеанс (как правило, запущенный первым), который берет на себя роль менеджера регламентных заданий информационной базы.
  2. Один фоновый поток на клиентский сеанс. Клиентское приложение способно выделить для обработки фоновых задач только один дополнительный поток. Фоновые задания внутри одного сеанса выстраиваются в строгую очередь и обрабатываются строго по очереди.
  3. Блокировка очереди длительным процессом. Если в конфигурации запускается процедура с непрерывным циклом обработки (например, постоянный опрос торгового оборудования, весов или считывателей), единственный рабочий поток оказывается занят на 100% времени. Регламентные задания базы данных попадают в хвост этой очереди и никогда не получат управления, пока цикл не прервется.

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

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

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

    1cv8c.exe ENTERPRISE /F "C:\Bases\Trade" /N "Кассир" /AllowExecuteScheduledJobs -Off

    Параметр /AllowExecuteScheduledJobs -Off запретит данному сеансу брать на себя глобальные регламентные задания. Его фоновый поток будет занят исключительно локальным опросом оборудования.
  2. Запуск служебного сеанса для регламентных задач. На сервере или отдельном дежурном компьютере запускаем служебного пользователя с принудительным назначением роли исполнителя регламентных задач:

    1cv8c.exe ENTERPRISE /F "C:\Bases\Trade" /N "Робот" /P "Пароль" /AllowExecuteScheduledJobs -Force

    Ключ /AllowExecuteScheduledJobs -Force гарантирует, что данный сеанс сразу принудительно перехватит выполнение всех регламентных заданий по расписанию и не будет зависеть от рабочих мест пользователей.

Решение 2. Публикация файловой базы на веб-сервере

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

Для активации фоновых заданий в файле публикации default.vrd необходимо настроить специальную директиву:


<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       base="/Trade"
       ib="File="C:\Bases\Trade";">
    <scheduledJobs allowExecuteScheduledJobs="true"/>
</point>

Параметр allowExecuteScheduledJobs="true" (или со значением "force") переносит исполнение регламентных заданий в рабочий процесс веб-сервера. Это решает сразу две задачи: задания выполняются круглосуточно по расписанию и перестают зависеть от того, запущен ли клиент 1С у кого-либо из сотрудников.

Решение 3. Вынос непрерывного опроса оборудования во внешнюю службу

Проанализируем ситуацию с опросом оборудования каждую секунду. Постоянная запись данных в регистры 1С из бесконечного цикла внутри файловой базы — крайне опасная архитектурная ошибка. Файловая СУБД .1CD использует блокировки на уровне целых таблиц. Ежесекундные транзакции записи неизбежно приведут к взаимоблокировкам пользователей, медленной работе программы и риску повреждения файла базы данных.

Для решения этой задачи применим следующий подход:

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

Решение 4. Запуск конкретных заданий через планировщик Windows

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

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

  1. Создаем внешнюю обработку (файл .epf), в модуле формы или объекте которой размещаем вызов нужного алгоритма.
  2. В конце процедуры обязательно добавляем закрытие сеанса, чтобы база не оставалась занятой:
    
    Процедура ВыполнитьРассылкуИЗакрыть()
        // Выполняем алгоритм отправки расчетных листков
        СформироватьИОтправитьРасчетныеЛистки();
        
        // Завершаем работу сеанса без вывода диалоговых окон
        ЗавершитьРаботуСистемы(Ложь);
    КонецПроцедуры
    
  3. В планировщике задач Windows настраиваем запуск команды:

    "C:\Program Files\1cv8\current\bin\1cv8.exe" ENTERPRISE /F "C:\Bases\Trade" /N "Робот" /P "Пароль" /Execute "C:\Scripts\SendMails.epf"

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

Решение 5. Переход на «1С:Сервер МИНИ»

Если информационная база активно растет, а число параллельных фоновых процессов увеличивается, возможности файлового режима будут исчерпаны. В качестве бюджетной альтернативы полноценному серверу 1С следует рассмотреть официальную лицензию «1С:Предприятие 8.3. Сервер МИНИ».

Данная лицензия имеет ограничение до 5 одновременных пользовательских подключений (сеансов), но при этом предоставляет все преимущества полноценного клиент-серверного режима: работу с бесплатной СУБД (PostgreSQL), полноценный кластер серверов, изолированное параллельное исполнение регламентных заданий в отдельных потоках и отсутствие табличных блокировок всей базы при фоновых расчетах.

← На главную