vypolnenie_procedury_v_fone_cherez_dlitelnye_operacii

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
vypolnenie_procedury_v_fone_cherez_dlitelnye_operacii [2021/02/26 11:44]
tro
vypolnenie_procedury_v_fone_cherez_dlitelnye_operacii [2021/02/26 11:54] (текущий)
tro
Строка 1: Строка 1:
 +**Блок с фоновым заданием**
 +
 Первая вызываемая функция на клиенте. Первая вызываемая функция на клиенте.
   * "Элементы.ИндикаторОбработкиExcel" - это элемент на форме типа "индикатор". В качестве источника данных у него реквизит формы "ИндикаторОбработкиExcel"   * "Элементы.ИндикаторОбработкиExcel" - это элемент на форме типа "индикатор". В качестве источника данных у него реквизит формы "ИндикаторОбработкиExcel"
Строка 16: Строка 18:
  
  
 +
 +----
  
 "ID_ФоновогоЗадания" - ревизит формы или объекта. Будет хранить в себе ГУИД фонового задания чтобы потом можно было по нему обращаться к фоновому заданию и проверять его состояние "ID_ФоновогоЗадания" - ревизит формы или объекта. Будет хранить в себе ГУИД фонового задания чтобы потом можно было по нему обращаться к фоновому заданию и проверять его состояние
Строка 33: Строка 37:
 </code> </code>
  
 +----
 +<code>
 +&НаСервере
 +Процедура ПолнаяВыгрузкаВФоновом(ID_ФоновогоЗадания)
 +
 + //Если нужно передат параметры в фоновое задание - формируем его в структуре
 +        СтруктураПараметров = Новый Структура;
 + СтруктураПараметров.Вставить("УИДНастройки",ОбщийМодульОбменСPromUa.ПолучитьУИДобъекта(Объект.Ссылка));
 + СтруктураПараметров.Вставить("РучнойВызов",истина);
 +
 + ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(ЭтаФорма.УникальныйИдентификатор);
 + ПараметрыВыполнения.ЗапуститьВФоне   = Истина;
 + ПараметрыВыполнения.ЗапуститьНеВФоне = Ложь;
 + ПараметрыВыполнения.НаименованиеФоновогоЗадания  = "ПолнаяВыгрузка_ВызовСФормы";
 + ПараметрыВыполнения.ОжидатьЗавершение   = Ложь;
  
 + //тут путь уже непосредственно к самой процедуре которую нужно выполить в фоне**
 +        СтрокаЗапуска="ОбщийМодульОбменСPromUa.ОбменСPromUa_толькотовары";
 + СтруктураЗадания = ДлительныеОперации.ВыполнитьВФоне(СтрокаЗапуска,СтруктураПараметров,ПараметрыВыполнения);
 +
 + ID_ФоновогоЗадания = СтруктураЗадания.ИдентификаторЗадания;
 +
 +КонецПроцедуры
 +
 +</code>
 +
 +----
 +**Блок с проверкой на каком этапе это фоновое задание**
 +
 +<code>
 +&НаКлиенте
 +Процедура ПроверитьВыполнениеЗадания1()
 +
 + ПоследняяОбработаннаяСтрока = Неопределено;
 +
 + ОбработаннаяСтрока  = ПоследняяОбработаннаяСтрока;
 +
 + ОбработаннаяСтрока  = ПроверитьФоновыеЗадания(Объект.ID_ФоновогоЗадания1);
 +
 + Если ОбработаннаяСтрока = Неопределено Тогда
 +
 + ПрекратитьВыполнениеНаСервере(Объект.ID_ФоновогоЗадания);          
 + ОтключитьОбработчикОжидания("ПроверитьВыполнениеЗадания1");
 +
 + Элементы.ИндикаторОбработкиExcel.Видимость=ложь;
 + Сообщение = Новый СообщениеПользователю;
 + Сообщение.Текст = "Ошибка при выполнении задания ....";   
 + Сообщение.Сообщить();
 +
 + КонецЕсли; 
 + ЧислоСтрокВТаблице = 100;
 + Если ТипЗнч(ОбработаннаяСтрока) = Тип("Число") Тогда
 +
 + ПоследняяОбработаннаяСтрока =  ОбработаннаяСтрока;
 + Процент =  ПоследняяОбработаннаяСтрока/ЧислоСтрокВТаблице*100;
 + Состояние("Обработано " + Строка(ПоследняяОбработаннаяСтрока),Процент,"из " + Строка(ЧислоСтрокВТаблице));
 +
 + Иначе
 +
 + Если ОбработаннаяСтрока = Истина Тогда
 +
 + ОтключитьОбработчикОжидания("ПроверитьВыполнениеЗадания1");
 +
 + Элементы.ИндикаторОбработкиExcel.Видимость=ложь;
 + Сообщение = Новый СообщениеПользователю;
 + Сообщение.Текст = ""+ТекущаяДата()+": Задание выполнено";   
 + Сообщение.Сообщить();
 +
 +
 + КонецЕсли;
 +
 + КонецЕсли;
 +
 +КонецПроцедуры
 +
 +</code>
 +
 +<code>
 +&НаСервере
 +Функция  ПроверитьФоновыеЗадания(ИдЗадания)
 +
 + Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдЗадания); 
 +    СтрокаТаблицы = ИдЗадания; 
 +
 + Если Задание = Неопределено Тогда
 + //Выполнено = Выполнено + СтрокаТаблицы.КоличествоСтрокВЗадании;
 + Выполнено = Истина;
 + //Объект.ID_ФоновогоЗадания = "";
 + Возврат Выполнено; //Продолжить;
 + КонецЕсли;  
 +      
 +    Состояние = Задание.Состояние;
 +    
 +    Если Состояние = СостояниеФоновогоЗадания.Завершено Тогда
 +
 + МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина);
 + Если МассивСообщений = Неопределено Тогда
 + Иначе
 + Если МассивСообщений.Количество() > 0 Тогда
 +
 + ПоследняяЗапись = МассивСообщений.Количество()-1;
 +
 + Для Каждого Сообщ Из МассивСообщений Цикл    
 + //Сообщение = Новый СообщениеПользователю;
 + //Сообщение.Текст = Сообщ.Текст;//МассивСообщений[ПоследняяЗапись].Текст;
 + //Сообщение.Сообщить();
 + КонецЦикла;
 +
 + КонецЕсли; 
 + КонецЕсли;
 +
 +      ВыполненыВсеЗадания = Истина;
 +   
 +   Сообщение = Новый СообщениеПользователю;
 +   Сообщение.Текст = "Выполнено!";
 +   Сообщение.Сообщить();
 +      
 +    ИначеЕсли Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда
 +
 +      ОшибкаЗадания = Задание.ИнформацияОбОшибке;
 +      Если ОшибкаЗадания <> Неопределено Тогда
 +        ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительная операция'"),
 +        УровеньЖурналаРегистрации.Ошибка,,,
 +        ПодробноеПредставлениеОшибки(ОшибкаЗадания));
 +      Иначе
 +        ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительная операция'"),
 +        УровеньЖурналаРегистрации.Ошибка,,,
 +        НСтр("ru = 'Задание завершилось с неизвестной ошибкой.'"));
 +      КонецЕсли;
 +      
 +      МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина);
 +      Если МассивСообщений = Неопределено Тогда
 +        //Ничего нет
 +      Иначе
 +        Если МассивСообщений.Количество() > 0 Тогда
 +          ПоследняяЗапись = МассивСообщений.Количество()-1;
 +        КонецЕсли;
 +        
 +        ЗаписьЖурналаРегистрации(НСтр("ru = 'Длительная операция'"),
 +        УровеньЖурналаРегистрации.Ошибка,,,
 +        Строка(ПоследняяЗапись));// + " Количество строк в задании: " +Строка(СтрокаТаблицы.КоличествоСтрокВЗадании));
 +
 + //Выведем ошибку пользователю
 + Сообщение = Новый СообщениеПользователю;
 + Сообщение.Текст = ПодробноеПредставлениеОшибки(ОшибкаЗадания);
 + Сообщение.Сообщить();
 +
 +      КонецЕсли;          
 +            ВыполненыВсеЗадания = Ложь;
 +      Возврат Неопределено;
 +
 +    Иначе
 +      
 +      МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина);
 +      Если МассивСообщений = Неопределено Тогда
 +        //Ничего нет
 +      Иначе
 +        Если МассивСообщений.Количество() > 0 Тогда
 +          
 +          ПоследняяЗапись = МассивСообщений.Количество()-1;
 +          
 +   Для Каждого Сообщ Из МассивСообщений Цикл    
 +   
 +   Если СтрНайти(Сообщ.Текст,"Не определен режим запуска приложения")>0 ИЛИ
 +   СтрНайти(Сообщ.Текст,"Запуск выбранного драйвера не поддерживается в текущем режиме")>0 Тогда 
 +   //Ничего не выводим   
 +   ИначеЕсли СтрНайти(Сообщ.Текст,"%")>0 Тогда 
 +   //Выводим проценты
 +   попытка
 +   ИндикаторОбработкиExcel = число(СтрЗаменить(Сообщ.Текст,"%",""));
 +   Исключение
 +   КонецПопытки;
 +   Иначе 
 +   Сообщение = Новый СообщениеПользователю;
 +   Сообщение.Текст = Сообщ.Текст;//МассивСообщений[ПоследняяЗапись].Текст;
 +   Сообщение.Сообщить();
 +   КонецЕсли;
 +   
 +   КонецЦикла;
 +            
 +        КонецЕсли; 
 +      КонецЕсли;
 +      ВыполненыВсеЗадания = Ложь;
 +      
 +    КонецЕсли;
 +  
 +  Возврат ВыполненыВсеЗадания;
 +
 +КонецФункции
 +</code>
 +
 +<code>
 +&НаСервере
 +Процедура ПрекратитьВыполнениеНаСервере(ИдЗадания)
 +  
 +  //Для каждого СтрокаТаблицы Из ТаблицаИдентификаторовЗаданий Цикл
 +    Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдЗадания);  
 +    Задание.Отменить();
 +  //КонецЦикла;
 +  
 +КонецПроцедуры
 +</code>
  • /sites/data/attic/vypolnenie_procedury_v_fone_cherez_dlitelnye_operacii.1614339887.txt.gz
  • Последнее изменение: 2021/02/26 11:44
  • tro