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

08.07.25

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

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

Файлы

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

Наименование Скачано Купить файл
Асинхронное выполнение длительных операций с помощью фонового задания:
.cfe 10,07Kb
4 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

При разработке конфигураций все длительные серверные вызовы, которые могут выполняться более 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

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

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

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

1800 руб.

21.11.2024    9670    41    24    

47

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

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

23.09.2025    4142    AlexeyPROSTO_1C    1    

14

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

Уже заезженная тема с выводом в Word макетов при помощи БСП, но некоторые коллеги все равно спрашивают. Поэтому размещаю тут материал, как это сделать за три простых шага. Решение, которым я успешно пользуюсь в случаях, когда не нужна универсальность подключаемых внешних печатных форм.

16.09.2025    3372    _seerco2002    0    

32

Нейросети БСП (Библиотека стандартных подсистем) Инструментарий разработчика Программист 1С v8.3 1С:Библиотека стандартных подсистем Бесплатно (free)

Telegram-бот для разработчиков 1С, работающих с БСП. Если не знаете нужный под задачу метод или не помните название, то опишите боту задачу и получите список подходящих экспортных методов из общих модулей БСП.

02.09.2025    4798    krasnov322    22    

39

Анализ учета БСП (Библиотека стандартных подсистем) 1С v8.3 1С:Библиотека стандартных подсистем Бесплатно (free)

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

22.05.2025    3586    123    seperblunt    9    

25

Работа с интерфейсом БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист 1С v8.3 1C:ERP Бесплатно (free)

В этой статье я расскажу, как в конфигурации 1С:ERP 2.5 при начале работы системы настроить открытие своих нетиповых форм (в том числе и из внешних обработок). Данную методику можно использовать как на тонком клиенте, так и на мобильном или веб-клиенте, а также в мобильном приложении.

12.05.2025    4197    AlexeyPROSTO_1C    2    

18

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

Наткнулся на костыль по работе с ролями. Хочу поделиться, как не попасть на это странное поведение БСП.

07.05.2025    7511    dsdred    32    

89

БСП (Библиотека стандартных подсистем) Обновление 1С Программист 1C:ERP Бесплатно (free)

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

29.04.2025    4307    krasnoshchekovpavel    7    

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

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

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

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