Асинхронное выполнение длительных операций с помощью фонового задания

05.06.22

Разработка - БСП (Библиотека стандартных подсистем)

Пример использования длительных операций. БСП 3.1.5.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Асинхронное выполнение длительных операций с помощью фонового задания:
.cfe 9,49Kb
4
4 Скачать (1 SM) Купить за 1 850 руб.

При разработке конфигураций все длительные серверные вызовы, которые могут выполняться более 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;
	возврат ДлительныеОперации.ВыполнитьФункцию(параметрыВыполнения, "МойОбщийМодуль.ЭмуляцияФоновыйПроцесс", Количество);
	
КонецФункции 

&НаКлиенте
Процедура ПриЗавершенииНачатьВыполнениеНаСервере(Результат, ДопПараметры) Экспорт 

	Если Результат = Неопределено Тогда // Пользователь отменил задание
		Возврат;	
	КонецЕсли;	
	Если Результат.Статус = "Ошибка" Тогда
		ВызватьИсключение Результат.КраткоеПредставлениеОшибки;
	КонецЕсли;
	ответ = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
	УдалитьИзВременногоХранилища(Результат.АдресРезультата);
	ОбщегоНазначенияКлиент.СообщитьПользователю(ответ);

КонецПроцедуры


 

 

Пример Длительная операция

См. также

БСП (Библиотека стандартных подсистем) Программист Платные (руб)

Синтакс-помощник БСП - cправочник по библиотекам стандартных подсистем и электронных документов. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП и БЭД.

1800 руб.

21.11.2024    4727    19    15    

24

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

Добавим метки в новый документ средствами БСП.

10.02.2025    4430    John_d    24    

48

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

Расскажу, как использовать полезный функционал - инструментарий разработчика «1С:Библиотека стандартных подсистем» (БСП) в своих объектах метаданных. Статья будет полезна как шпаргалка при написании собственных объектов метаданных.

27.12.2024    4801    PROSTO-1C    16    

49

БСП (Библиотека стандартных подсистем) Программист Бесплатно (free)

Синтакс-помощник БСП - справочник по Библиотеке Стандартных Подсистем, профессиональный инструмент разработчика с интуитивно понятным интерфейсом. Читайте в статье как использовать все возможности справочника и сделать работу с БСП более комфортной и эффективной.

11.12.2024    4590    gorenski    0    

8

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

Некоторые нюансы, если вы захотите создавать свои расширения. Доработка отчета "Связанные документы" для отражения документов расширения. Печатные формы с шаблоном Word.

20.11.2024    3942    milkers    3    

14

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

В статье описан алгоритм для включения документа или справочника в систему БСП. Будет полезно программистам 1С, начинающим работать с БСП.

24.10.2024    2273    PROSTO-1C    0    

19

БСП (Библиотека стандартных подсистем) Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

В материале описан универсальный механизм работы с добавленными элементами на общую форму «ФормаОтчета». Думаю, облегчит работу многим разработчикам.

08.10.2024    1658    PROSTO-1C    4    

14
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Nikola23 707 06.06.22 01:12 Сейчас в теме
Коллега, а кто вас научил называть переменные "пв"? Я понимаю, что писать "ПроцентВыполнения1" да еще и в разных строках - это сложно, но все же.

Судя по-коду, вы каждые N секунд отправляете оповещение.
Для реализации этой задачи есть алгоритм, не требующий такого нагромождения "если".

К сожалению, по существу темы добавить ничего не могу. Материал прекрасно описан до вас не раз.
2. user1432326 75 06.06.22 06:19 Сейчас в теме
(1) Функция ЭмуляцияФоновыйПроцесс
цикл выполняется 450 000 раз либо N-раз переданный через Параметр1.
Для того что бы не выполнять код ДлительныеОперации.СообщитьПрогресс 450 000 раз, тем самым время выполнения задания могла бы значительно увеличиться. я ограничил его вывод. Вывод происходит не более 5 раз.
3. triviumfan 99 06.06.22 14:25 Сейчас в теме
(2) Я однажды делал замеры. У меня как раз цикл из 500к строк был, убрал ДлительныеОперации.СообщитьПрогресс() и время выполнения стало меньше на 10 секунд. Это несерьёзно, тем более выполнение в фоне. Я решил пускай лучше % точнее передаются, чем такой костыль.
maksa2005; +1 Ответить
4. user1432326 75 06.06.22 15:32 Сейчас в теме
(3) время выполнения на 150к строк 9.87 сек, если ограничение убрать, то код будет выполняться 1м.32с.(в файловом режиме)
5. Nikola23 707 08.06.22 13:53 Сейчас в теме
(2) Почему не надо сообщать прогресс каждую итерацию я в курсе.
Не понимаю, зачем вы это рассказываете - ведь я не спрашивал.

Мой комментарий выше был про стилистику кодирования.
Названия переменных, например, вызывают вопросы.
Оставьте свое сообщение