Как выполнить процедуру из внешней обработки в фоновом режиме?

Программист 1С v8.3 (Обычные формы) Промышленность, строительство и АПК
← На главную

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

Давайте разберем, почему это вызывает сложности и как решить данную задачу на практике.

Основные причины проблемы

Главная трудность заключается в том, что фоновое задание — это абсолютно отдельный сеанс работы с базой данных. Оно не «видит» контекст формы вашей внешней обработки и объекты, которые находятся у вас в оперативной памяти. Поэтому попытка просто вызвать процедуру модуля объекта внешней обработки напрямую из фонового задания приведет к ошибке.

Вариант 1: Использование модуля длительных операций (если он есть)

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

Для этого сформируем структуру параметров и вызовем процедуру, которая умеет выполнять методы модулей объектов обработок:


СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("ИмяМетода", "ИмяВашейЭкспортнойПроцедуры");
// Параметры для передачи в саму процедуру
СтруктураПараметров.Вставить("Параметры", ВашиДанные);

ДлительныеОперации.ВыполнитьВФоне("ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки", СтруктураПараметров, ПараметрыВыполнения);

Вариант 2: Создание универсального механизма через общий модуль

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

Разберем реализацию по шагам:

  1. Создайте Общий модуль, установите у него флаги «Сервер», «Вызов сервера» и «Внешнее соединение».
  2. Добавьте в него функцию для запуска задания и процедуру, которая будет исполнять ваш код.

Вот пример кода для общего модуля:


Функция ЗапуститьФоновоеВыполнение(ТекстПроцедуры, СтруктураПараметров = Неопределено) Экспорт
    УникальныйИдентификатор = Новый УникальныйИдентификатор;
    ПараметрыВыполнения = Новый Массив;
    ПараметрыВыполнения.Добавить(ТекстПроцедуры);
    ПараметрыВыполнения.Добавить(СтруктураПараметров);
    
    ФоновыеЗадания.Выполнить("ФоновоеВыполнение.ФоноваяПроцедура", ПараметрыВыполнения, УникальныйИдентификатор);
    Возврат УникальныйИдентификатор;
КонецФункции

Процедура ФоноваяПроцедура(ТекстМодуля, ПараметрыВыполнения) Экспорт
    ПолныйТекстМодуля = "";
    // Разбираем параметры для контекста выполнения
    Для Каждого ТекПараметр Из ПараметрыВыполнения Цикл
        ПолныйТекстМодуля = ПолныйТекстМодуля + ТекПараметр.Ключ + "=ПараметрыВыполнения." + ТекПараметр.Ключ + ";" + Символы.ПС;
    КонецЦикла;
    
    ПолныйТекстМодуля = ПолныйТекстМодуля + ТекстМодуля;
    Выполнить(ПолныйТекстМодуля);
КонецПроцедуры

Важные замечания по реализации

Работая с фоновыми заданиями в старых конфигурациях, помните о следующих нюансах:

Таким образом, даже в «голой» УПП вы можете организовать асинхронную работу, создав простой и эффективный механизм передачи кода на сервер.

← На главную