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

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

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

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

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


 

 

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

См. также

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

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

24.10.2024    1088    PROSTO-1C    0    

12

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

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

08.10.2024    978    PROSTO-1C    4    

10

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

В статье рассмотрим пошаговую инструкцию создания дополнительного отчета с фоновым формированием результата.

04.10.2024    1829    MadRave    11    

24

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

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

10.09.2024    1816    MadRave    1    

17

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

А что, если долгожданная реализация Паузы в 1С смутно напоминает старую, проверенную? А?!

06.09.2024    1254    n_mezentsev    10    

8

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

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

02.09.2024    4105    John_d    10    

52

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

Всё больше организаций выбирает для серверов под 1С операционные системы Linux. Одним из отличий систем Windows и Linux является отсутствие COM объектов, которые зачастую использовались для формирования печатных форм офисных документов (Word). Конечно, можно выполнять печать и на клиенте, но есть риск импортозамещения. В работе у меня случались проблемы с зависанием процесса Word, поэтому я не люблю его использовать.

29.07.2024    5354    PROSTO-1C    12    

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

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

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

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