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

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

Приветствуем вас! Сегодня мы подробно разберем одну из самых частых и нетривиальных задач, с которой сталкиваются системные администраторы и программисты 1С при миграции на Linux. Речь идет об автоматическом запуске регламентных задач, скриптов и внешних обработок на серверах под управлением Ubuntu или Debian, на которых полностью отсутствует графическое окружение (иксы / X-сервер).

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


"C:\Program Files (x86)\1cv8\8.3.8.1964\bin\1cv8.exe" ENTERPRISE /IBName "Delta" /N "Reglament" /P "12345" /Execute "C:\Scripts\Task.epf"

Однако при попытке выполнить аналогичный вызов на «чистом» консольном сервере Linux нас ожидает неудача. Платформа 1С спроектирована так, что ее толстый и тонкий клиенты (файлы 1cv8 и 1cv8c) по умолчанию требуют наличия графической системы для инициализации своего интерфейса. Без этого процесс аварийно завершается. Давайте проанализируем ситуацию и разберем по шагам наиболее эффективные и современные способы решения этой задачи.

Способ 1. Эмуляция графического окружения с помощью виртуального дисплея (Xvfb)

Если вам обязательно нужно запустить именно клиентское приложение 1С для выполнения внешней обработки (например, содержащей интерактивные элементы или завязанной на логику клиентских процедур), мы можем обмануть платформу. Для этого мы создадим виртуальный графический буфер в оперативной памяти сервера с помощью утилиты Xvfb (X Virtual Frame Buffer).

Рассмотрим по шагам процесс установки и настройки этого решения на сервере под управлением Debian или Ubuntu:

  1. Установка необходимых пакетов. Для начала обновим списки пакетов и установим сам виртуальный дисплей, а также шрифты Microsoft. Без установки шрифтов клиент 1С при запуске в консоли часто падает с ошибкой Segmentation Fault:

    
    sudo apt-get update
    sudo apt-get install xvfb xauth ttf-mscorefonts-installer libwebkitgtk-3.0-0
    
  2. Однократный или тестовый запуск задачи. Для разового выполнения обработки через планировщик cron отлично подойдет утилита xvfb-run. Она автоматически создает виртуальный дисплей на время работы команды, запускает 1С и корректно завершает работу окружения после закрытия программы. Пример такой команды:

    
    xvfb-run -a /opt/1cv8/x86_64/8.3.22.1709/1cv8 ENTERPRISE /S "server-1c\base_db" /N "Robot" /P "Pass123" /Execute "/opt/1cv8/scripts/update.epf"
    

    Обратите внимание на параметр -a — он указывает утилите автоматически подобрать свободный номер виртуального дисплея.

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

    sudo nano /etc/systemd/system/Xvfb.service

    Вставим в него следующее содержимое:

    
    [Unit]
    Description=X Virtual Frame Buffer Service
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/Xvfb :99 -screen 0 1024x768x24
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

    Запустим службу и добавим ее в автозапуск:

    
    sudo systemctl daemon-reload
    sudo systemctl enable Xvfb.service
    sudo systemctl start Xvfb.service
    

    Теперь в наших bash-скриптах, которые запускаются по планировщику cron, достаточно перед вызовом 1С объявить переменную окружения DISPLAY:

    
    export DISPLAY=:99
    /opt/1cv8/x86_64/8.3.22.1709/1cv8 ENTERPRISE /S "server-1c\base_db" /N "Robot" /P "Pass123" /Execute "/opt/1cv8/scripts/update.epf"
    

Способ 2. Выполнение обработок на стороне сервера (без запуска GUI-клиента)

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

Для реализации этой «мечты» (запускать только логику, а не весь клиент) мы можем использовать встроенный механизм Регламентных и фоновых заданий. Алгоритм действий выглядит так:

  1. Интегрируем нужную внешнюю обработку (файл .epf) непосредственно в информационную базу. Например, добавим ее в стандартный справочник «Дополнительные отчеты и обработки» (если конфигурация построена на базе БСП).

  2. Создаем в конфигураторе новое регламентное задание с собственным расписанием или используем предопределенное серверное задание для запуска произвольного кода.

  3. Программируем вызов нашей обработки на стороне сервера. Для этого пишем следующий код в серверном модуле:

    
    // Получаем двоичные данные файла обработки из хранилища базы данных
    ДвоичныеДанные = СправочникОбъект.ХранилищеВнешнейОбработки.Получить();
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("epf");
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    // Важно установить БезопасныйРежим в Ложь, если обработке требуются права на работу с файловой системой сервера
    ОбработкаОбъект = ВнешниеОбработки.Создать(ИмяВременногоФайла, Ложь);
    ОбработкаОбъект.ВыполнитьКоманду(); // Вызов экспортной процедуры вашей обработки
    
    // Удаляем временный файл после выполнения работы
    УдалитьФайлы(ИмяВременногоФайла);
    

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

Способ 3. Легковесный триггер через HTTP-сервис и планировщик Cron

Что делать, если регламентным заданием внутри 1С управлять неудобно, и вы хотите контролировать весь процесс именно из планировщика операционной системы Linux (cron), но при этом избегая запуска GUI-клиента? Выясним, как построить красивую архитектуру с использованием веб-технологий.

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

  1. В конфигураторе создаем HTTP-сервис с именем SchedulerTrigger и шаблоном URL /run_task. Добавляем метод POST (или GET).

  2. В модуле этого HTTP-сервиса пишем серверный код запуска обработки:

    
    Функция ЗапуститьЗадачуPOST(Запрос)
        
        // Вызываем код нашей обработки или общего модуля
        Попытка
            ВыполнитьНужноеРегламентноеДействиеНаСервере();
            
            Ответ = Новый HTTPСервисОтвет(200);
            Ответ.УстановитьТелоИзСтроки("Выполнено успешно");
        Исключение
            Ответ = Новый HTTPСервисОтвет(500);
            Ответ.УстановитьТелоИзСтроки("Ошибка: " + ОписаниеОшибки());
        КонецПопытки;
        
        Возврат Ответ;
        
    КонецФункции
    
  3. Публикуем базу данных на веб-сервере (Apache или Nginx).

  4. Теперь в планировщике Linux (crontab) нам достаточно прописать выполнение простейшего и невероятно легкого сетевого запроса с помощью утилиты curl:

    
    */10 * * * * curl -u "Admin:Password" -X POST http://localhost/ib_name/hs/SchedulerTrigger/run_task
    

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

Способ 4. Выполнение административных задач через утилиту ibcmd (для платформы 8.3.14 и выше)

Если ваши периодические задачи под Linux связаны не с бизнес-логикой, а с системным администрированием (например, выгрузка информационной базы, загрузка обновлений конфигурации из файлов .cf или применение изменений базы данных), то вам вообще не нужно использовать клиентскую часть 1cv8.

Начиная с версии платформы 8.3.14, в распоряжении администраторов появился мощный инструмент — утилита автономного сервера ibcmd. Она изначально спроектирована для работы в режиме командной строки Linux и совершенно не требует графического окружения.

Рассмотрим примеры использования этой утилиты в ваших bash-скриптах автоматизации:

Подводя итог, можно сказать следующее: выбор конкретного способа зависит от специфики вашей задачи. Для административных задач лучше всего подходит утилита ibcmd. Для сложных регулярных вычислений и обработок идеальным решением будет запуск логики на стороне сервера через HTTP-сервисы или регламентные задания 1С. Ну а в случае, если без запуска толстого или тонкого клиента обойтись никак нельзя, на выручку всегда придет эмуляция дисплея с помощью Xvfb.

← На главную