Как запустить параллельные фоновые задания из внешней обработки 1С через БСП?

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

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

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

Анализ проблемы: почему нельзя просто вызвать метод обработки в фоне?

Для платформы 1С контекст внешней обработки является временным. Чтобы запустить фоновый процесс, сервер должен иметь возможность инициализировать объект и вызвать его метод в новом сеансе. Стандартный механизм фоновых заданий ориентирован на общие модули с установленным флагом Сервер. Когда же мы работаем с дополнительными внешними обработками, подключенными через БСП, нам нужен "посредник", который знает, как найти файл обработки в хранилище, подключить его и запустить нужный код.

Решение через стандартный механизм БСП

В составе БСП есть подсистема "Дополнительные отчеты и обработки". Именно она предоставляет необходимый нам мост. Основная идея заключается в использовании общего модуля ДополнительныеОтчетыИОбработки, который содержит экспортный метод ВыполнитьКоманду. Этот метод специально спроектирован для работы в фоновых заданиях.

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

  1. Основное регламентное задание запускает внешнюю обработку (метод-диспетчер).
  2. Метод-диспетчер обходит список целевых баз (или других объектов обработки).
  3. Для каждого объекта вызывается метод БСП ДлительныеОперации.ЗапуститьВыполнениеВФоне.
  4. В качестве имени выполняемой процедуры передается стандартная строка "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду".
  5. В параметры фонового задания передается ссылка на саму внешнюю обработку и уникальные параметры для конкретного потока.

Подготовка модуля объекта внешней обработки

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


Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
    
    Если ИдентификаторКоманды = "ОсновнойЗапускПоРасписанию" Тогда
        // Это точка входа регламентного задания
        ЗапуститьПотокиПараллельно(ПараметрыВыполненияКоманды);
        
    ИначеЕсли ИдентификаторКоманды = "ВыполнитьОбменСБазой" Тогда
        // Это код, который будет выполняться ВНУТРИ фонового задания
        ВыполнитьЛогикуОбмена(ПараметрыВыполненияКоманды);
    КонецЕсли;

КонецПроцедуры

Реализация диспетчера потоков

Теперь разберем, как именно запустить несколько фоновых заданий из модуля обработки. Нам понадобится метод ДлительныеОперации.ЗапуститьВыполнениеВФоне. Важно правильно сформировать структуру параметров, чтобы БСП смогла идентифицировать нашу обработку.

Рассмотрим пример серверного кода диспетчера:


Процедура ЗапуститьПотокиПараллельно(ПараметрыВыполнения)
    
    МассивБаз = ПолучитьСписокБазДляОбмена(); // Ваша логика получения настроек
    УникальныйИдентификатор = Новый УникальныйИдентификатор;
    
    Для Каждого ТекущаяБаза Из МассивБаз Цикл
        
        // Формируем параметры для конкретного фонового задания
        ПараметрыФона = Новый Структура;
        ПараметрыФона.Вставить("ДополнительнаяОбработкаСсылка", ПараметрыВыполнения.ДополнительнаяОбработкаСсылка);
        ПараметрыФона.Вставить("ИдентификаторКоманды", "ВыполнитьОбменСБазой");
        
        // Добавляем специфичные данные для обмена
        НастройкиОбмена = Новый Структура("Адрес, Логин, Пароль", ТекущаяБаза.Адрес, ТекущаяБаза.Логин, ТекущаяБаза.Пароль);
        ПараметрыФона.Вставить("ПараметрыВыполненияКоманды", НастройкиОбмена);
        
        // Запускаем фоновое задание через посредника БСП
        НаименованиеЗадания = СтрШаблон("Обмен с базой %1", ТекущаяБаза.Наименование);
        
        ЗаданиеРезультат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
            УникальныйИдентификатор, 
            "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду", 
            ПараметрыФона, 
            НаименованиеЗадания
        );
        
        Если ЗаданиеРезультат.Статус = "Выполняется" Тогда
            ЗаписьЖурналаРегистрации("ФоновыйОбмен", УровеньЖурналаРегистрации.Информация, , , 
                "Запущено задание для базы: " + ТекущаяБаза.Наименование);
        КонецЕсли;
        
    КонецЦикла;

КонецПроцедуры

Технические нюансы и ограничения

При использовании этого подхода следует учитывать несколько критически важных моментов:

1. Сериализация параметров. Все данные, которые вы передаете в структуру ПараметрыФона, должны быть сериализуемыми. Нельзя передавать ссылки на объекты, созданные в памяти (например, открытые COM-соединения или файлы). Используйте структуры, массивы и простые типы. Если нужно передать сложную таблицу значений, упакуйте её в ХранилищеЗначения и передайте в виде строки или двоичных данных.

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

3. Ссылка на дополнительную обработку. Чтобы метод ДополнительныеОтчетыИОбработки.ВыполнитьКоманду сработал, в параметрах обязательно должна быть ссылка на элемент справочника ДополнительныеОтчетыИОбработки. Если вы запускаете обработку через регламентное задание БСП, эта ссылка обычно уже содержится в ПараметрыВыполненияКоманды.ДополнительнаяОбработкаСсылка.

4. Управление нагрузкой. Запуск 50 фоновых заданий одновременно может привести к исчерпанию ресурсов сервера 1С и снижению производительности всей системы. Рекомендуется внедрять механизм ограничения количества одновременно работающих потоков. Это можно реализовать, анализируя текущие активные задания через ФоновыеЗадания.ПолучитьФоновыеЗадания() перед запуском нового потока.

Мониторинг завершения

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


// МассивИдентификаторовЗаданий - массив, собранный при запуске
ДлительныеОперации.ОжидатьЗавершенияВыполнения(МассивИдентификаторовЗаданий, 600); // Тайм-аут 10 минут

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

Таким образом, мы выяснили, что барьер вызова методов внешней обработки в фоне легко преодолевается с помощью штатных механизмов БСП. Это позволяет создавать масштабируемые и быстрые решения, сохраняя при этом удобство управления кодом внутри одного объекта — внешней обработки.

← На главную