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