Блок с фоновым заданием
Первая вызываемая функция на клиенте.
- «Элементы.ИндикаторОбработки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 = число(СтрЗаменить(Сообщ.Текст,"%","")); Исключение КонецПопытки; Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = Сообщ.Текст;//МассивСообщений[ПоследняяЗапись].Текст; Сообщение.Сообщить(); КонецЕсли; КонецЦикла; КонецЕсли; КонецЕсли; ВыполненыВсеЗадания = Ложь; КонецЕсли; Возврат ВыполненыВсеЗадания; КонецФункции
&НаСервере Процедура ПрекратитьВыполнениеНаСервере(ИдЗадания) //Для каждого СтрокаТаблицы Из ТаблицаИдентификаторовЗаданий Цикл Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдЗадания); Задание.Отменить(); //КонецЦикла; КонецПроцедуры