Асинхронное выполнение длительных операций с помощью фонового задания
Разработка - БСП (Библиотека стандартных подсистем)
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
При разработке конфигураций все длительные серверные вызовы, которые могут выполняться более 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 = Ложь; КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат "Эмуляция фонового процесса завершилась";
КонецФункции
Код модуля формы обработки:
&НаКлиенте
Процедура ВыполнитьКоманду(Команда)
длительнаяОперация = НачатьВыполнениеНаСервере(); //Запуск фонового задания на Сервере
параметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
параметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
ПараметрыОжидания.Интервал = 2;
оповещение = Новый ОписаниеОповещения("ПриЗавершенииНачатьВыполнениеНаСервере", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(длительнаяОперация, оповещение, параметрыОжидания); //Подключение обработчика завершения фонового задания
КонецПроцедуры
&НаСервере
Функция НачатьВыполнениеНаСервере()
параметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
Количество = 450000;
возврат ДлительныеОперации.ВыполнитьФункцию(параметрыВыполнения, "МойОбщийМодуль.ЭмуляцияФоновыйПроцесс", Количество);
КонецФункции
&НаКлиенте
Процедура ПриЗавершенииНачатьВыполнениеНаСервере(Результат, ДопПараметры) Экспорт
Если Результат = Неопределено Тогда // Пользователь отменил задание
Возврат;
КонецЕсли;
Если Результат.Статус = "Ошибка" Тогда
ВызватьИсключение Результат.КраткоеПредставлениеОшибки;
КонецЕсли;
ответ = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
УдалитьИзВременногоХранилища(Результат.АдресРезультата);
ОбщегоНазначенияКлиент.СообщитьПользователю(ответ);
КонецПроцедуры
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.11.228
Вступайте в нашу телеграмм-группу Инфостарт