Вариант 1 (БСП с отслеживанием результата выполнения)
В общем виде процесс запуска и обработки результата длительной операции в модуле формы выглядит следующим образом:
- 1) Процедура, которая будет исполняться в фоне, располагается в модуле менеджера объекта или в серверном общем модуле:
- P.S. ОБЯЗАТЕЛЬО ТОЛЬКО ДВА ПАРАМЕТРА ДОЛЖА ПРИНИМАТЬ ВІПОЛНЯЕМАЯ В ФОНЕ ПРОЦЕДУРА
Процедура ПроверитьИОбновитьДанныеКонтрагентаСПактумаСУчетомПериодаАктуальности(СтруктураПараметровПроцедуры, СтруктураПараметровФоновогоВызова) Экспорт
//1. проверки
Если СтруктураПараметровПроцедуры.отказ ИЛИ СтруктураПараметровПроцедуры.мКОнтрагентСсылка.Ссылка.Пустая() ИЛИ СтруктураПараметровПроцедуры.мКОнтрагентСсылка.НеКонтролироватьАктуальностьПоПактум Тогда
Возврат;
КонецЕсли;
Пактум_ПериодАктуальностиОбновленияДанныхКонтрагентов_дней = РегистрыСведений.РегистрКонстант.ПолучитьЗначениеКонстанты("Пактум_ПериодАктуальностиОбновленияДанныхКонтрагентов_дней");
Если не ЗначениеЗаполнено(Пактум_ПериодАктуальностиОбновленияДанныхКонтрагентов_дней) Тогда Возврат; КонецЕсли;
//2. Получаем данные по последнему обновлению и проверяем актуальность по колич ву пройденноных дней с последнего обновления с пактум
Пактум_МассивНазванийРеквизитовЧтоНеМеняютсяПриАвтоОбновлении = РегистрыСведений.РегистрКонстант.ПолучитьЗначениеКонстанты("Пактум_МассивНазванийРеквизитовЧтоНеМеняютсяПриАвтоОбновлении").Получить();
КолВоДнейСПоследнегоОбновления = РегистрыСведений.ИсторияОбновленияДанныхСПактум.ПолучитьКоличествоДнейОтДатыОбновленияДаныхСПактум(СтруктураПараметровПроцедуры.мКОнтрагентСсылка);
//3. Перезаполняем контрагента по данным пактум
Если КолВоДнейСПоследнегоОбновления > Пактум_ПериодАктуальностиОбновленияДанныхКонтрагентов_дней Тогда
ОшибкиПриЗаполнении = "";
Пактум_Сервер.ПроверитьИПерезаполнитьКОнтрагентаДаннымиСПактум(СтруктураПараметровПроцедуры.мКОнтрагентСсылка, Истина,СтруктураПараметровПроцедуры.ДатаПолученияДанныхСПактум, СтруктураПараметровПроцедуры.ИсточникПолученияДанныхСПактум, ОшибкиПриЗаполнении, Пактум_МассивНазванийРеквизитовЧтоНеМеняютсяПриАвтоОбновлении);
КонецЕсли;
КонецПроцедуры
2) Вызов на клиенте запуска фонового:
&НаКлиенте
Процедура ПроверитьИОбновитьДанныеКонтрагентаСПактумаСУчетомПериодаАктуальности_НаКлиенте()
СтруктураФоновогоЗадания = НачатьВыполнениеОбновленияПактумНаСервере(ЭтотОбъект.УникальныйИдентификатор);
ИДЗадания = СтруктураФоновогоЗадания.ИдентификаторЗадания;
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
ПараметрыОжидания.Интервал = 2;
ДлительныеОперацииКлиент.ОжидатьЗавершение(СтруктураФоновогоЗадания, Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект), ПараметрыОжидания);
КонецПроцедуры
&НаСервере
Функция НачатьВыполнениеОбновленияПактумНаСервере(УникальныйИдентификатор)
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Получение данных в ПАКТУМ при смене контрагента в заказе клиента";
ПараметрыВыполнения.КлючФоновогоЗадания = ""+ЭтаФорма.УникальныйИдентификатор+", "+XMLСтрока(Объект.Контрагент);
ПараметрыВыполнения.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
СтруктураПараметровПроцедуры = Новый Структура;
СтруктураПараметровПроцедуры.Вставить("отказ",Ложь);
СтруктураПараметровПроцедуры.Вставить("мКОнтрагентСсылка",Объект.Контрагент);
СтруктураПараметровПроцедуры.Вставить("ДатаПолученияДанныхСПактум",ТекущаяДата());
СтруктураПараметровПроцедуры.Вставить("ИсточникПолученияДанныхСПактум","При смене контрагента в заказе клиента");
СтруктураФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне("Пактум_Сервер.ПроверитьИОбновитьДанныеКонтрагентаСПактумаСУчетомПериодаАктуальности", СтруктураПараметровПроцедуры, ПараметрыВыполнения);
Возврат СтруктураФоновогоЗадания;
КонецФункции
3) Обработка результата длительной операции:
&НаКлиенте
Процедура ОбработатьДанные(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
ИначеЕсли Результат.Статус = "Ошибка" Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Произошла ошибка при получении данных по контрагенту с сервиса ПАКТУМ'; uk = 'Відбулася помилка при отриманні даних щодо контрагенту з сервісу ПАКТУМ'"));
ИначеЕсли Результат.Статус = "Выполнено" Тогда
ПоказатьПредупреждениеПоПроблемномуПартнеруКОнтрагенту();
КонецЕсли;
КонецПроцедуры
Вариант 2 (БСП. Для вызова с сервера без отслеживания выполнения)
1. Необходимая на выоплнение процедура должна быть экспортной и обязательно иметь два параметра
Процедура ОтправитьДанныеООтмеченныхВхНДПоЗаказам(знач парам1=Неопределено, знач парам2=Неопределено) Экспорт //код КонецПроцедуры
2. Где необходимо на сервере вызываем
&НаСервере
Процедура тестАсинхроннойОтправкиНаСервере()
результат = ДлительныеОперации.ВыполнитьВФоне("Доработки_Сервер.ОтправитьДанныеООтмеченныхВхНДПоЗаказам",Структура_ПередаваемыеПараметрыПроцедуры,ДлительныеОперации.ПараметрыВыполненияВФоне(Неопределено));
КонецПроцедуры