Каталог решений - Асинхронное выполнение длительных операций с помощью фонового задания

Асинхронное выполнение длительных операций с помощью фонового задания

Асинхронное выполнение длительных операций с помощью фонового задания

В наличии

Пример использования длительных операций. БСП 3.1.5.

Категория:

Описание

При разработке конфигураций все длительные серверные вызовы, которые могут выполняться более 8 секунд в обычных сценариях работы пользователя, следует выполнять асинхронно, с помощью фонового задания.

Код, выполняющий длительную обработку данных, располагается в общем модуле или модуле менеджера объекта. Результат своей работы он помещает во временное хранилище.

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

В качестве примера буду использовать обработку "ДлительнаяОперация_v01"  и общий модуль  в расширении:

Фоновое задание будет выполняться в МойОбщийМодуль.ЭмуляцияФоновыйПроцесс()

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

1) Запуск фонового задания  &НаСервере;

2) Подключение обработчика завершения фонового задания &НаКлиенте;

3) Обработка результата выполнения фонового задания.\

Пример можно использовать любых современных типовых конфигурациях и нетиповых, использующих БСП.

Код: МойОбщийМодуль.ЭмуляцияФоновыйПроцесс()

Функция ЭмуляцияФоновыйПроцесс( Параметр1 = Неопределено, Параметр2 = Неопределено) Экспорт 
	
	Если Параметр1 = Неопределено Тогда
		Параметр1 = 300000;
	КонецЕсли;
	пв1 = Истина; пв2 = Истина; пв3 = Истина; пв4 = Истина; пв5 = Истина;
	Для счетчик = 0 По Параметр1 Цикл
		пакет = Новый Структура("Счетчик, Количество", счетчик, Параметр1);
		процент = ОКР(100*счетчик / Параметр1,0);	
		Если  процент > 8 И процент < 10 Тогда 
			Если пв1 Тогда	ДлительныеОперации.СообщитьПрогресс(процент, "Идет длительная операция"); пв1 = Ложь; КонецЕсли;
		ИначеЕсли процент > 28 И процент < 30 Тогда
			Если пв2 Тогда ДлительныеОперации.СообщитьПрогресс(процент, "Идет длительная операция"); пв2 = Ложь; КонецЕсли;
		ИначеЕсли процент > 49 И процент < 51 Тогда
			Если пв3 Тогда ДлительныеОперации.СообщитьПрогресс(процент, "Идет длительная операция"); пв3 = Ложь; КонецЕсли;
		ИначеЕсли процент > 70 И процент < 72 Тогда
			Если пв4 Тогда пв4 = Ложь; КонецЕсли; 
		ИначеЕсли процент > 89 И процент < 92 Тогда
			Если пв5 Тогда ДлительныеОперации.СообщитьПрогресс(процент, "Идет длительная операция"); пв5 = Ложь; КонецЕсли;	
		КонецЕсли;	
	КонецЦикла;
	Возврат "Эмуляция фонового процесса завершилась"; 
	
КонецФункции

Код модуля формы обработки:


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

&НаСервере
Функция НачатьВыполнениеНаСервере()

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

&НаКлиенте
Процедура ПриЗавершенииНачатьВыполнениеНаСервере(Результат, ДопПараметры) Экспорт 

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

КонецПроцедуры


 

has been added to your cart:
Оформление заказа