vypolnenie_procedury_v_fone_cherez_dlitelnye_operacii

Это старая версия документа!


Блок с фоновым заданием

Первая вызываемая функция на клиенте.

  • «Элементы.ИндикаторОбработкиExcel» - это элемент на форме типа «индикатор». В качестве источника данных у него реквизит формы «ИндикаторОбработкиExcel»
  • «ИндикаторОбработкиExcel» - реквизит формы. чило. туда будем закидывать число
&НаКлиенте
Процедура ЗапуститьВыгрузкНаСервере(РезультатВопроса, параметры) Экспорт 	
	Если РезультатВопроса = КодВозвратаДиалога.ok Тогда
		Элементы.ИндикаторОбработкиExcel.Видимость=Истина;
		ИндикаторОбработкиExcel	=	0;
		ВыполнитьФоновоеПолнуюВыгрузкуНаСервере();
		ПодключитьОбработчикОжидания("ПроверитьВыполнениеЗадания1", 1);
	КонецЕсли;
КонецПроцедуры

«ID_ФоновогоЗадания» - ревизит формы или объекта. Будет хранить в себе ГУИД фонового задания чтобы потом можно было по нему обращаться к фоновому заданию и проверять его состояние

&НаСервере
Процедура ВыполнитьФоновоеПолнуюВыгрузкуНаСервере()
	
	ID_ФоновогоЗадания = Неопределено;
	ПолнаяВыгрузкаВФоновом(ID_ФоновогоЗадания);
	Объект.ID_ФоновогоЗадания1 = ID_ФоновогоЗадания; 
	
	Мсооб	=	новый СообщениеПользователю;
	Мсооб.Текст	=	""+ТекущаяДата()+": Запущенна выгрузка в фоновом режиме. Вы можете продолжать работать. Прогресс будет отображаться в этом окне.";
	Мсооб.Сообщить();	
	
КонецПроцедуры

&НаСервере
Процедура ПолнаяВыгрузкаВФоновом(ID_ФоновогоЗадания)
	
	//Если нужно передат параметры в фоновое задание - формируем его в структуре
        СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("УИДНастройки",ОбщийМодульОбменСPromUa.ПолучитьУИДобъекта(Объект.Ссылка));
	СтруктураПараметров.Вставить("РучнойВызов",истина);
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(ЭтаФорма.УникальныйИдентификатор);
	ПараметрыВыполнения.ЗапуститьВФоне   = Истина;
	ПараметрыВыполнения.ЗапуститьНеВФоне = Ложь;
	ПараметрыВыполнения.НаименованиеФоновогоЗадания  = "ПолнаяВыгрузка_ВызовСФормы";
	ПараметрыВыполнения.ОжидатьЗавершение   = Ложь;	

	//тут путь уже непосредственно к самой процедуре которую нужно выполить в фоне**
        СтрокаЗапуска="ОбщийМодульОбменСPromUa.ОбменСPromUa_толькотовары";
	СтруктураЗадания = ДлительныеОперации.ВыполнитьВФоне(СтрокаЗапуска,СтруктураПараметров,ПараметрыВыполнения);
	
	ID_ФоновогоЗадания = СтруктураЗадания.ИдентификаторЗадания;
	
КонецПроцедуры

Блок с проверкой на каком этапе это фоновое задание

&НаКлиенте
Процедура ПроверитьВыполнениеЗадания1()
	
	ПоследняяОбработаннаяСтрока = Неопределено;
	
	ОбработаннаяСтрока  = ПоследняяОбработаннаяСтрока;
	
	ОбработаннаяСтрока  = ПроверитьФоновыеЗадания(Объект.ID_ФоновогоЗадания1);
	
	Если ОбработаннаяСтрока = Неопределено Тогда
		
		ПрекратитьВыполнениеНаСервере(Объект.ID_ФоновогоЗадания);          
		ОтключитьОбработчикОжидания("ПроверитьВыполнениеЗадания1");
		
		Элементы.ИндикаторОбработкиExcel.Видимость=ложь;
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = "Ошибка при выполнении задания ....";   	
		Сообщение.Сообщить();
		
	КонецЕсли; 
	ЧислоСтрокВТаблице = 100;
	Если ТипЗнч(ОбработаннаяСтрока) = Тип("Число") Тогда
		
		ПоследняяОбработаннаяСтрока =  ОбработаннаяСтрока;		
		Процент =  ПоследняяОбработаннаяСтрока/ЧислоСтрокВТаблице*100;	
		Состояние("Обработано " + Строка(ПоследняяОбработаннаяСтрока),Процент,"из " + Строка(ЧислоСтрокВТаблице));
		
	Иначе
		
		Если ОбработаннаяСтрока = Истина Тогда
			
			ОтключитьОбработчикОжидания("ПроверитьВыполнениеЗадания1");
			
			Элементы.ИндикаторОбработкиExcel.Видимость=ложь;
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = ""+ТекущаяДата()+": Задание выполнено";   	
			Сообщение.Сообщить();
			
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры
  • /sites/data/attic/vypolnenie_procedury_v_fone_cherez_dlitelnye_operacii.1614340298.txt.gz
  • Последнее изменение: 2021/02/26 11:51
  • tro