При разработке конфигураций все длительные серверные вызовы, которые могут выполняться более 8 секунд в обычных сценариях работы пользователя, следует выполнять асинхронно, с помощью фонового задания.
Код, выполняющий длительную обработку данных, располагается в общем модуле или модуле менеджера объекта. Результат своей работы он помещает во временное хранилище.
На время выполнения длительной операции пользователю отображается индикатор с возможностью отмены выполнения.
В качестве примера буду использовать обработку "ДлительнаяОперация_v01" и общий модуль в расширении:
Фоновое задание будет выполняться в МойОбщийМодуль.ЭмуляцияФоновыйПроцесс().
В форме обработки вызов этой функции в фоновом задании будет выполняться в три этапа:
1) Запуск фонового задания &НаСервере;
2) Подключение обработчика завершения фонового задания &НаКлиенте;
3) Обработка результата выполнения фонового задания.\
Пример можно использовать любых современных типовых конфигурациях и нетиповых, использующих БСП.
Код: МойОбщийМодуль.ЭмуляцияФоновыйПроцесс()
Функция ЭмуляцияФоновыйПроцесс( Параметр1 = Неопределено, Параметр2 = Неопределено) Экспорт
Если Параметр1 = Неопределено Тогда
Параметр1 = 300000;
КонецЕсли;
пв1 = Истина; пв2 = Истина; пв3 = Истина; пв4 = Истина; пв5 = Истина;
Для счетчик = 0 По Параметр1 Цикл
пакет = Новый Структура("Счетчик, Количество", счетчик, Параметр1);
процент = ОКР(100*счетчик / Параметр1,0);
Если процент > 8 И процент < 10 Тогда
Если пв1 Тогда ДлительныеОперации.СообщитьПрогресс(процент, "Идет длительная операция"); пв1 = Ложь; КонецЕсли;
ИначеЕсли процент > 28 И процент < 30 Тогда
Если пв2 Тогда ДлительныеОперации.СообщитьПрогресс(процент, "Идет длительная операция"); пв2 = Ложь; КонецЕсли;
ИначеЕсли процент > 49 И процент < 51 Тогда
Если пв3 Тогда ДлительныеОперации.СообщитьПрогресс(процент, "Идет длительная операция"); пв3 = Ложь; КонецЕсли;
ИначеЕсли процент > 70 И процент < 72 Тогда
Если пв4 Тогда пв4 = Ложь; КонецЕсли;
ИначеЕсли процент > 89 И процент < 92 Тогда
Если пв5 Тогда ДлительныеОперации.СообщитьПрогресс(процент, "Идет длительная операция"); пв5 = Ложь; КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат "Эмуляция фонового процесса завершилась";
КонецФункции
Код модуля формы обработки:
&НаКлиенте
Процедура ВыполнитьКоманду(Команда)
длительнаяОперация = НачатьВыполнениеНаСервере(); //Запуск фонового задания на Сервере
параметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
параметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
оповещение = Новый ОписаниеОповещения("ПриЗавершенииНачатьВыполнениеНаСервере", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(длительнаяОперация, оповещение, параметрыОжидания); //Подключение обработчика завершения фонового задания
КонецПроцедуры
&НаСервере
Функция НачатьВыполнениеНаСервере()
параметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
Количество = 450000;
возврат ДлительныеОперации.ВыполнитьФункцию(параметрыВыполнения, "МойОбщийМодуль.ЭмуляцияФоновыйПроцесс", Количество);
КонецФункции
&НаКлиенте
Процедура ПриЗавершенииНачатьВыполнениеНаСервере(Результат, ДопПараметры) Экспорт
Если Результат = Неопределено Тогда // Пользователь отменил задание
Возврат;
КонецЕсли;
Если Результат.Статус = "Ошибка" Тогда
ВызватьИсключение Результат.КраткоеПредставлениеОшибки;
КонецЕсли;
ответ = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
УдалитьИзВременногоХранилища(Результат.АдресРезультата);
ОбщегоНазначенияКлиент.СообщитьПользователю(ответ);
КонецПроцедуры