dlitelnye_operacii._fonovye_vypolnenija_bsp

Вариант 1 (БСП с отслеживанием результата выполнения)

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

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

	
	//3. Перезаполняем контрагента по данным пактум
	Если КолВоДнейСПоследнегоОбновления > Пактум_ПериодАктуальностиОбновленияДанныхКонтрагентов_дней Тогда 
		ОшибкиПриЗаполнении	=	"";
		Пактум_Сервер.ПроверитьИПерезаполнитьКОнтрагентаДаннымиСПактум(СтруктураПараметровПроцедуры.мКОнтрагентСсылка, Истина,СтруктураПараметровПроцедуры.ДатаПолученияДанныхСПактум, СтруктураПараметровПроцедуры.ИсточникПолученияДанныхСПактум, ОшибкиПриЗаполнении, Пактум_МассивНазванийРеквизитовЧтоНеМеняютсяПриАвтоОбновлении);	
	КонецЕсли;
	
КонецПроцедуры 

2) Вызов на клиенте запуска фонового:

&НаКлиенте
Процедура ПроверитьИОбновитьДанныеКонтрагентаСПактумаСУчетомПериодаАктуальности_НаКлиенте()
		
		СтруктураФоновогоЗадания 	= НачатьВыполнениеОбновленияПактумНаСервере(ЭтотОбъект.УникальныйИдентификатор);
		ИДЗадания 					= СтруктураФоновогоЗадания.ИдентификаторЗадания;
		
		ПараметрыОжидания  								= ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
		ПараметрыОжидания.ВыводитьПрогрессВыполнения 	= Истина;
                ПараметрыОжидания.ВыводитьОкноОжидания          = Ложь;
		ПараметрыОжидания.Интервал  					= 2;
		
		ДлительныеОперацииКлиент.ОжидатьЗавершение(СтруктураФоновогоЗадания, Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект), ПараметрыОжидания);
		
КонецПроцедуры
&НаСервере
Функция НачатьВыполнениеОбновленияПактумНаСервере(УникальныйИдентификатор) 
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Получение данных в ПАКТУМ при смене контрагента в заказе клиента"; 
	ПараметрыВыполнения.КлючФоновогоЗадания         = ""+ЭтаФорма.УникальныйИдентификатор+", "+XMLСтрока(Объект.Контрагент);
	ПараметрыВыполнения.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
	
	СтруктураПараметровПроцедуры	=	Новый Структура;
	СтруктураПараметровПроцедуры.Вставить("отказ",Ложь);
	СтруктураПараметровПроцедуры.Вставить("мКОнтрагентСсылка",Объект.Контрагент); 
	СтруктураПараметровПроцедуры.Вставить("ДатаПолученияДанныхСПактум",ТекущаяДата());
	СтруктураПараметровПроцедуры.Вставить("ИсточникПолученияДанныхСПактум","При смене контрагента в заказе клиента");
	
	СтруктураФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне("Пактум_Сервер.ПроверитьИОбновитьДанныеКонтрагентаСПактумаСУчетомПериодаАктуальности", СтруктураПараметровПроцедуры, ПараметрыВыполнения);
	
	Возврат СтруктураФоновогоЗадания;
	
	
КонецФункции

3) Обработка результата длительной операции:

&НаКлиенте
Процедура ОбработатьДанные(Результат, ДополнительныеПараметры) Экспорт

	Если Результат = Неопределено Тогда
		Возврат;
	ИначеЕсли Результат.Статус = "Ошибка" Тогда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Произошла ошибка при получении данных по контрагенту с сервиса ПАКТУМ'; uk = 'Відбулася помилка при отриманні даних щодо контрагенту з сервісу ПАКТУМ'"));
	ИначеЕсли Результат.Статус = "Выполнено" Тогда
		ПоказатьПредупреждениеПоПроблемномуПартнеруКОнтрагенту();		
	КонецЕсли;
	
КонецПроцедуры

Вариант 2 (БСП. Для вызова с сервера без отслеживания выполнения)

1. Необходимая на выоплнение процедура должна быть экспортной и обязательно иметь два параметра

Процедура ОтправитьДанныеООтмеченныхВхНДПоЗаказам(знач парам1=Неопределено, знач парам2=Неопределено) Экспорт 
//код
КонецПроцедуры

2. Где необходимо на сервере вызываем

&НаСервере
Процедура тестАсинхроннойОтправкиНаСервере()
	результат = ДлительныеОперации.ВыполнитьВФоне("Доработки_Сервер.ОтправитьДанныеООтмеченныхВхНДПоЗаказам",Структура_ПередаваемыеПараметрыПроцедуры,ДлительныеОперации.ПараметрыВыполненияВФоне(Неопределено));
КонецПроцедуры
  • /sites/data/pages/dlitelnye_operacii._fonovye_vypolnenija_bsp.txt
  • Последнее изменение: 2025/08/29 06:30
  • tro