vypolnenie_procedury_v_fone_cherez_dlitelnye_operacii_provereno_na_1s_unf_1.6

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

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

  • «Элементы.ИндикаторОбработки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.Видимость=ложь;
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = ""+ТекущаяДата()+": Задание выполнено";   	
			Сообщение.Сообщить();
			
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры
&НаСервере
Функция  ПроверитьФоновыеЗадания(ИдЗадания)

	Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдЗадания); 
    СтрокаТаблицы = ИдЗадания; 
	
	Если Задание = Неопределено Тогда
		//Выполнено = Выполнено + СтрокаТаблицы.КоличествоСтрокВЗадании;
		Выполнено = Истина;
		//Объект.ID_ФоновогоЗадания = "";
		Возврат Выполнено; //Продолжить;
	КонецЕсли;  
      
    Состояние = Задание.Состояние;
    
    Если Состояние = СостояниеФоновогоЗадания.Завершено Тогда
		
		МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина);
		Если МассивСообщений = Неопределено Тогда
		Иначе
			Если МассивСообщений.Количество() > 0 Тогда
				
				ПоследняяЗапись = МассивСообщений.Количество()-1;
				
				Для Каждого Сообщ Из МассивСообщений Цикл    
					//Сообщение = Новый СообщениеПользователю;
					//Сообщение.Текст = Сообщ.Текст;//МассивСообщений[ПоследняяЗапись].Текст;
					//Сообщение.Сообщить();
				КонецЦикла;
				
			КонецЕсли; 
		КонецЕсли;

      ВыполненыВсеЗадания = Истина;
	  
	  Сообщение = Новый СообщениеПользователю;
	  Сообщение.Текст = "Выполнено!";
	  Сообщение.Сообщить();
      
    ИначеЕсли Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда

      ОшибкаЗадания = Задание.ИнформацияОбОшибке;
      Если ОшибкаЗадания <> Неопределено Тогда
        ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительная операция'"),
        УровеньЖурналаРегистрации.Ошибка,,,
        ПодробноеПредставлениеОшибки(ОшибкаЗадания));
      Иначе
        ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительная операция'"),
        УровеньЖурналаРегистрации.Ошибка,,,
        НСтр("ru = 'Задание завершилось с неизвестной ошибкой.'"));
      КонецЕсли;
      
      МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина);
      Если МассивСообщений = Неопределено Тогда
        //Ничего нет
      Иначе
        Если МассивСообщений.Количество() > 0 Тогда
          ПоследняяЗапись = МассивСообщений.Количество()-1;
        КонецЕсли;
        
        ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительная операция'"),
        УровеньЖурналаРегистрации.Ошибка,,,
        Строка(ПоследняяЗапись));// + " Количество строк в задании: " +Строка(СтрокаТаблицы.КоличествоСтрокВЗадании));
		
		//Выведем ошибку пользователю
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ПодробноеПредставлениеОшибки(ОшибкаЗадания);
		Сообщение.Сообщить();

      КонецЕсли;          
            ВыполненыВсеЗадания = Ложь;
      Возврат Неопределено;

    Иначе
      
      МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина);
      Если МассивСообщений = Неопределено Тогда
        //Ничего нет
      Иначе
        Если МассивСообщений.Количество() > 0 Тогда
          
          ПоследняяЗапись = МассивСообщений.Количество()-1;
          
		  Для Каждого Сообщ Из МассивСообщений Цикл    
			  
			  Если СтрНайти(Сообщ.Текст,"Не определен режим запуска приложения")>0 ИЛИ
				  СтрНайти(Сообщ.Текст,"Запуск выбранного драйвера не поддерживается в текущем режиме")>0 Тогда 
				  //Ничего не выводим	  
			  ИначеЕсли СтрНайти(Сообщ.Текст,"%")>0 Тогда 
				  //Выводим проценты
				  попытка
					  ИндикаторОбработкиExcel	=	число(СтрЗаменить(Сообщ.Текст,"%",""));
				  Исключение
				  КонецПопытки;
			  Иначе 
				  Сообщение = Новый СообщениеПользователю;
				  Сообщение.Текст = Сообщ.Текст;//МассивСообщений[ПоследняяЗапись].Текст;
				  Сообщение.Сообщить();
			  КонецЕсли;
			  
		  КонецЦикла;
            
        КонецЕсли; 
      КонецЕсли;
      ВыполненыВсеЗадания = Ложь;
      
    КонецЕсли;
  
  Возврат ВыполненыВсеЗадания;

КонецФункции
&НаСервере
Процедура ПрекратитьВыполнениеНаСервере(ИдЗадания)
  
  //Для каждого СтрокаТаблицы Из ТаблицаИдентификаторовЗаданий Цикл
    Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдЗадания);  
    Задание.Отменить();
  //КонецЦикла;
  
КонецПроцедуры
  • /sites/data/pages/vypolnenie_procedury_v_fone_cherez_dlitelnye_operacii_provereno_na_1s_unf_1.6.txt
  • Последнее изменение: 2021/02/26 11:55
  • tro