При разработке в конфигурациях «старой школы», таких как УПП, мы часто сталкиваемся с тем, что стандартные механизмы Библиотеки стандартных подсистем (БСП) либо отсутствуют, либо слишком сложны для интеграции из-за древнего режима совместимости. Одной из частых задач является запуск длительной процедуры внешней обработки в фоновом режиме, чтобы пользователь мог продолжать работу с программой, не дожидаясь окончания выполнения кода. Для решения этой задачи можно использовать пример организации длительных операций через фоновые задания без БСП.
Давайте разберем, почему это вызывает сложности и как решить данную задачу на практике.
Главная трудность заключается в том, что фоновое задание — это абсолютно отдельный сеанс работы с базой данных. Оно не «видит» контекст формы вашей внешней обработки и объекты, которые находятся у вас в оперативной памяти. Поэтому попытка просто вызвать процедуру модуля объекта внешней обработки напрямую из фонового задания приведет к ошибке.
Если в вашей конфигурации все же присутствует модуль ДлительныеОперации (пусть даже не самой последней версии), мы можем попробовать воспользоваться его штатным механизмом. Суть метода заключается в передаче имени метода в виде строки.
Для этого сформируем структуру параметров и вызовем процедуру, которая умеет выполнять методы модулей объектов обработок:
СтруктураПараметров = Новый Структура;
СтруктураПараметров.Вставить("ИмяМетода", "ИмяВашейЭкспортнойПроцедуры");
// Параметры для передачи в саму процедуру
СтруктураПараметров.Вставить("Параметры", ВашиДанные);
ДлительныеОперации.ВыполнитьВФоне("ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки", СтруктураПараметров, ПараметрыВыполнения);
Если готовых функций в конфигурации нет, мы можем создать свой собственный Общий модуль (назовем его, например, ФоновоеВыполнение), который позволит запускать любой код в фоновом режиме. Это решение универсально для любой конфигурации.
Разберем реализацию по шагам:
Общий модуль, установите у него флаги «Сервер», «Вызов сервера» и «Внешнее соединение».Вот пример кода для общего модуля:
Функция ЗапуститьФоновоеВыполнение(ТекстПроцедуры, СтруктураПараметров = Неопределено) Экспорт
УникальныйИдентификатор = Новый УникальныйИдентификатор;
ПараметрыВыполнения = Новый Массив;
ПараметрыВыполнения.Добавить(ТекстПроцедуры);
ПараметрыВыполнения.Добавить(СтруктураПараметров);
ФоновыеЗадания.Выполнить("ФоновоеВыполнение.ФоноваяПроцедура", ПараметрыВыполнения, УникальныйИдентификатор);
Возврат УникальныйИдентификатор;
КонецФункции
Процедура ФоноваяПроцедура(ТекстМодуля, ПараметрыВыполнения) Экспорт
ПолныйТекстМодуля = "";
// Разбираем параметры для контекста выполнения
Для Каждого ТекПараметр Из ПараметрыВыполнения Цикл
ПолныйТекстМодуля = ПолныйТекстМодуля + ТекПараметр.Ключ + "=ПараметрыВыполнения." + ТекПараметр.Ключ + ";" + Символы.ПС;
КонецЦикла;
ПолныйТекстМодуля = ПолныйТекстМодуля + ТекстМодуля;
Выполнить(ПолныйТекстМодуля);
КонецПроцедуры
Работая с фоновыми заданиями в старых конфигурациях, помните о следующих нюансах:
Выполнить() — это мощный, но требующий осторожности инструмент. Ваш код внутри фонового задания должен быть полностью автономным. Не пытайтесь обращаться к элементам формы (кнопкам, полям ввода), так как их в фоновом сеансе просто не существует.УникальныйИдентификатор задания. На форме внешней обработки можно использовать ОбработчикОжидания, который будет проверять состояние задания через метод ФоновыеЗадания.НайтиПоУникальномуИдентификатору().Таким образом, даже в «голой» УПП вы можете организовать асинхронную работу, создав простой и эффективный механизм передачи кода на сервер.