На первый взгляд делов-то - подключить внешнюю обработку и вызвать метод в фоне.
Сложность в том, что функция ФоновыеЗадания.Выполнить(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>) требует в первом параметре указать имя процедуры, доступной отовсюду. А его такого нету.
Благо в БСП есть ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки, которой можно передать имя файла внешней обработки, имя вызываемой процедуры и параметры.
// Собственно ради этой процедуры разработка и затеяна
ИмяФайлаНаСервере = ПолучитьИмяВременногоФайла("epf");
ДанныеФайла = ПолучитьИзВременногоХранилища(АрдесФайлаНаСервере);
ДанныеФайла.Записать(ИмяФайлаНаСервере) ;
ИмяОбработки = "ПримерВнешнейОбработкиВФоне";
ИмяМетода = "ТестовыйМетод";
ПараметрыВыполнения = Новый Структура("КоличествоЦиклов,ВызыватьИсключение",
КоличествоЦиклов, ВызыватьИсключение);
ПараметрыВыполнитьПроцедуруМодуляОбъектаОбработки = Новый Структура;
ПараметрыВыполнитьПроцедуруМодуляОбъектаОбработки.Вставить("БезопасныйРежим", Ложь);
ПараметрыВыполнитьПроцедуруМодуляОбъектаОбработки.Вставить("ЭтоВнешняяОбработка", Истина);
ПараметрыВыполнитьПроцедуруМодуляОбъектаОбработки.Вставить("ИмяОбработки", ИмяФайлаНаСервере); // ИмяОбработки);
ПараметрыВыполнитьПроцедуруМодуляОбъектаОбработки.Вставить("ИмяМетода", ИмяМетода);
ПараметрыВыполнитьПроцедуруМодуляОбъектаОбработки.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
МассивПараметры = Новый Массив;
МассивПараметры.Добавить(ПараметрыВыполнитьПроцедуруМодуляОбъектаОбработки);
МассивПараметры.Добавить(Неопределено); // АдресХранилища - непонятный второй параметр функции ВыполнитьПроцедуруМодуляОбъектаОбработки
Задание = ФоновыеЗадания.Выполнить("ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки",
МассивПараметры,
, "Запуск тестового задания");
ИдентификаторЗадания = Задание.УникальныйИдентификатор;
Оказалось, что БСП 3.1.10.226 ждёт не имя подключённой внешней обработки, а имя файла.
Процедура в модуле обработки должна принимать два параметра. Первый типа Структура - собственно параметры. Второй - непонятный идентификатор.
Процедура ТестовыйМетод(ПараметрыВыполнения, НекийПараметр = Неопределено) Экспорт
В прикреплении пример обработки.
Обновление от 02.04.2025.
Ещё один вариант исполнения метода внешней обработки в фоне.
Возможно использовать процедуру ОбщегоНазначения.ВыполнитьВБезопасномРежиме
Для этого в форме обработки помещаем эту обработку во временное хранилище. В фоне вызываем метод ВыполнитьВБезопасномРежиме, которому передаём программный код для подключения этой внешний обработки и исполнения её метода.
ДвоичныеДанныеОбработки = ПолучитьИзВременногоХранилища(АдресВХранилище);
ПараметрыВыполнения = Новый Структура("ДвоичныеДанныеОбработки", ДвоичныеДанныеОбработки);
ПараметрыВыполнения.Вставить("КоличествоЦиклов", КоличествоЦиклов);
ПараметрыВыполнения.Вставить("ВызыватьИсключение", ВызыватьИсключение);
КодДляВыполнения = "
|
|АдресВХранилище = ПоместитьВоВременноеХранилище(Параметры.ДвоичныеДанныеОбработки);
|ВнешниеОбработки.Подключить(АдресВХранилище, ""ПримерВыполненияВнешнейОбработкиВФоне"", Истина);
|МояОбработка = ВнешниеОбработки.Создать(""ПримерВыполненияВнешнейОбработкиВФоне"");
|МояОбработка.ТестовыйМетод(Параметры);
|";
// ОбщегоНазначения.ВыполнитьВБезопасномРежиме(КодДляВыполнения, ПараметрыВыполнения);
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(КодДляВыполнения);
ПараметрыЗадания.Добавить(ПараметрыВыполнения);
Задание = ФоновыеЗадания.Выполнить("ОбщегоНазначения.ВыполнитьВБезопасномРежиме",
ПараметрыЗадания,
"ПримерВыполненияВнешнейОбработкиВФоне",
"Пример выполнения внешней обработки в фоне");
Пример в файле ПримерЗапускаМетодаВнешнейОбработкиВФоне2.epf
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 11, релизы 11.5.17.117