Запуск почти любых процедур и функций конфигураций в асинхронном режиме - БСП - Длительные операции [Часть 2]

22.03.22

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

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

Введение

Привет всем! Продолжаем цикл статей по возможностям асинхронной работы платформы 1с в рамках конфигурации разработчика - Библиотеки стандартных подсистем (БСП).

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

Согласно последним рекомендациям БСП (версия 3.1.3.303) предлагается использовать более современные функции для работы с длительными операциями - это ВыполнитьПроцедуру и ВыполнитьФункцию.

Но, а кто хочет научиться работать с функционалом длительных операций вообще в рамках БСП - прошу ознакомиться с первой частью моей статьи - Гарантированно рабочий пример использования длительных операций на БСП с отображением прогресса. [Часть 1].

Итак, перейдем к рассмотрению функции БСП ВыполнитьПроцедуру:

 

Рабочий пример функционала БСП "ВыполнитьПроцедуру"

В данном разделе я привожу рабочий код внешней обработки для запуска метода "Выполнить процедуру". Будем "отлавливать" статус методом формы "выполнить процедуру" (без излишеств).

В общем виде "на входе" данная функция выглядит вот так (до 7 параметров):

ВыполнитьПроцедуру(Знач ПараметрыВыполнения = Неопределено, ИмяПроцедуры, Знач Параметр1 = Неопределено,
	Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено,
	Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено) Экспорт

а вот и код обработки:

 
 Код внешней обработки с примером "ВыполнитьПроцедуру"

 

&НаКлиенте
Процедура ЗапуститьОперацию(Команда)
	
	
	ПараметрыЗапуска = Новый Структура;
	ПараметрыЗапуска.Вставить("ДатаНачала1", НачалоДня(ЭтаФорма.ДатаНачала));
	ПараметрыЗапуска.Вставить("ДатаОкончания1",КонецДня(ЭтаФорма.ДатаОкончания));
	ПараметрыЗапуска.Вставить("Организация1",	  ЭтаФорма.Организация);
	
	СтруктураФоновогоЗадания = ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор);
	ИДЗадания 	= СтруктураФоновогоЗадания.ИдентификаторЗадания;
	
	ПараметрыОжидания  = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	//ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
	ПараметрыОжидания.Интервал 	= 2;
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(СтруктураФоновогоЗадания, Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект), ПараметрыОжидания);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьДанные(Результат, ДополнительныеПараметры) Экспорт

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

&НаСервере
Функция ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор)
	
	НаименованиеЗадания = "Запуск длительной операции";
	ВыполняемыйМетод = "ДлительныйМодуль.ПроведемДокументыМетодомСуществующейПроцедуры";
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры();
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
	ПараметрыВыполнения.ЗапуститьВФоне = Истина;
	
	СтруктураФоновогоЗадания = ДлительныеОперации.ВыполнитьПроцедуру(ПараметрыВыполнения, ВыполняемыйМетод, ПараметрыЗапуска.ДатаНачала1, ПараметрыЗапуска.ДатаОкончания1, ПараметрыЗапуска.Организация1); 
	
	Возврат СтруктураФоновогоЗадания;
	
КонецФункции

 

Вышенаписанного кода достаточно. Все будет работать.

 

Структура выполняемой процедуры для длительной операции "ВыполнитьПроцедуру"

В данном разделе, я привожу пример процедуры для общего серверного модуля, чтобы код из раздела выше - отработал. Это - самая обычная процедура - фактически - это любая процедура из конфигурации (расширения):

 
 Процедура общего модуля для длительной операции

 

&НаСервере
Процедура ПроведемДокументыМетодомСуществующейПроцедуры(ДатаНачала, ДатаОкончания, Организация) Экспорт
	
	МассивВозврат = Новый Массив;
	
	ПоискДляПроведения = Новый Запрос("ВЫБРАТЬ
	                                  |	РеализацияТоваровУслуг.Ссылка КАК Ссылка
	                                  |ИЗ
	                                  |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
	                                  |ГДЕ
	                                  |	РеализацияТоваровУслуг.Дата МЕЖДУ &Дата1 И &Дата2
	                                  |	И РеализацияТоваровУслуг.Организация = &Организация
	                                  |
	                                  |УПОРЯДОЧИТЬ ПО
	                                  |	РеализацияТоваровУслуг.Дата");
	
	ПоискДляПроведения.УстановитьПараметр("Дата1", 		 ДатаНачала);
	ПоискДляПроведения.УстановитьПараметр("Дата2", 		 ДатаОкончания);
	ПоискДляПроведения.УстановитьПараметр("Организация", Организация);
	
	НашлиДокументы = ПоискДляПроведения.Выполнить().Выгрузить();
	
	ВсегоДокументов = НашлиДокументы.Количество();
	
	ТекДок = 1;
	
	Для Каждого Стр11 ИЗ НашлиДокументы Цикл
				
		Док = Стр11.Ссылка.ПолучитьОбъект();
		
		Док.Проведен 		= Ложь;
		Док.ПометкаУдаления = Ложь;
		
		Попытка
			Док.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
		Исключение
			Док.Записать(РежимЗаписиДокумента.Запись);
		КонецПопытки;
		
		ПроцентВыполнения = (ТекДок/ВсегоДокументов)*100;
		ПроцентВыполнения = Окр(ПроцентВыполнения,0);
		
		МассивВозврат.Добавить(ПроцентВыполнения);
		
		// сообщаем "процент" и "текст сообщения"
		ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения,СокрЛП(Док.Ссылка));
		
		ТекДок = ТекДок + 1;
		
	КонецЦикла;
	
//	ПоместитьВоВременноеХранилище(МассивВозврат, АдресРезультата);
	
КонецПроцедуры	

 

 

Рабочий пример функционала БСП "ВыполнитьФункцию"

Теперь, рассмотрим еще одну функцию выполнения длительной операции "ВыполнитьФункцию". В общем виде она выглядит вот так - до 7-ми входящих параметров:

Функция ВыполнитьФункцию(Знач ПараметрыВыполнения, ИмяФункции, Знач Параметр1 = Неопределено,
	Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, Знач Параметр4 = Неопределено,
	Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, Знач Параметр7 = Неопределено) Экспорт
 
 Код внешней обработки с примером "ВыполнитьФункцию"

 

&НаКлиенте
Процедура ЗапуститьОперацию(Команда)
	
	//ИДЗадания 	= "";
	//Индикатор 		= 0;
	//СтрокаСостояния = "";
	
	ПараметрыЗапуска = Новый Структура;
	ПараметрыЗапуска.Вставить("ДатаНачала1", НачалоДня(ЭтаФорма.ДатаНачала));
	ПараметрыЗапуска.Вставить("ДатаОкончания1",КонецДня(ЭтаФорма.ДатаОкончания));
	ПараметрыЗапуска.Вставить("Организация1",	  ЭтаФорма.Организация);
	
	СтруктураФоновогоЗадания 	= ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор);
	ИДЗадания 	= СтруктураФоновогоЗадания.ИдентификаторЗадания;
	
	ПараметрыОжидания 	= ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	//ПараметрыОжидания.ВыводитьОкноОжидания = Ложь;
	ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
	ПараметрыОжидания.Интервал  = 2;
	
	ДлительныеОперацииКлиент.ОжидатьЗавершение(СтруктураФоновогоЗадания, Новый ОписаниеОповещения("ОбработатьДанные", ЭтотОбъект), ПараметрыОжидания);
	
КонецПроцедуры


&НаСервере
Функция ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор)
	
	НаименованиеЗадания = "Запуск длительной операции";
	ВыполняемыйМетод = "ДлительныйМодуль.ПроведемДокументыМетодомСуществФункцией";
	
	ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор);
	ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
	ПараметрыВыполнения.ЗапуститьВФоне = Истина;
	
	СтруктураФоновогоЗадания = ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, ВыполняемыйМетод, ПараметрыЗапуска.ДатаНачала1, ПараметрыЗапуска.ДатаОкончания1, ПараметрыЗапуска.Организация1); 
	
	Возврат СтруктураФоновогоЗадания;
	
КонецФункции


&НаКлиенте
Процедура ОбработатьДанные(Результат, ДополнительныеПараметры) Экспорт

    Если Результат = Неопределено Тогда
      Возврат;
    КонецЕсли;
    Сообщить(ПолучитьИЗВременногоХранилища(Результат.АдресРезультата));

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


 

 

Структура выполняемой процедуры для длительной операции "ВыполнитьФункцию"

Функция в общем модуле будет выглядеть вот так (тоже "любая" функция из конфигурации или расширения):

 
 Функция общего модуля для длительной операции

 

&НаСервере
Функция ПроведемДокументыМетодомСуществФункцией(ДатаНачала, ДатаОкончания, Организация) Экспорт
	
	МассивВозврат = Новый Массив;
	
	ПоискДляПроведения = Новый Запрос("ВЫБРАТЬ
	                                  |	РеализацияТоваровУслуг.Ссылка КАК Ссылка
	                                  |ИЗ
	                                  |	Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
	                                  |ГДЕ
	                                  |	РеализацияТоваровУслуг.Дата МЕЖДУ &Дата1 И &Дата2
	                                  |	И РеализацияТоваровУслуг.Организация = &Организация
	                                  |
	                                  |УПОРЯДОЧИТЬ ПО
	                                  |	РеализацияТоваровУслуг.Дата");
	
	ПоискДляПроведения.УстановитьПараметр("Дата1", 		 ДатаНачала);
	ПоискДляПроведения.УстановитьПараметр("Дата2", 		 ДатаОкончания);
	ПоискДляПроведения.УстановитьПараметр("Организация", Организация);
	
	НашлиДокументы = ПоискДляПроведения.Выполнить().Выгрузить();
	
	ВсегоДокументов = НашлиДокументы.Количество();
	
	ТекДок = 1;
	
	Для Каждого Стр11 ИЗ НашлиДокументы Цикл
				
		Док = Стр11.Ссылка.ПолучитьОбъект();
		
		Док.Проведен 		= Ложь;
		Док.ПометкаУдаления = Ложь;
		
		Попытка
			Док.Записать(РежимЗаписиДокумента.Проведение, РежимПроведенияДокумента.Неоперативный);
		Исключение
			Док.Записать(РежимЗаписиДокумента.Запись);
		КонецПопытки;
		
		ПроцентВыполнения = (ТекДок/ВсегоДокументов)*100;
		ПроцентВыполнения = Окр(ПроцентВыполнения,0);
		
		МассивВозврат.Добавить(ПроцентВыполнения);
		
		ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения,СокрЛП(Док.Ссылка));
		
		ТекДок = ТекДок + 1;
		
	КонецЦикла;
	
	//Возвращаем количество элементов в массиве (просто для примера)
	Возврат МассивВозврат.Количество();
	
КонецФункции

 

Для примера использования данной функции - я возвращаю в ней количество элементов в массиве.

Все, мы рассмотрели базовое применение двух относительно новых методов библиотеки стандартных подсистем ВыполнитьПроцедуру и ВыполнитьФункцию. Переходим к выводам и итогам.

 

Выводы и итоги

В данной части материала о длительных операциях - мы рассмотрели новые и рекомендуемые методы БСП - "ВыполнитьПроцедуру" и "ВыполнитьФункцию". Рассмотрели как их запускать, какие параметры передавать, как отслеживать и получать результат выполнения. Надеюсь, что данный материал будет вам максимально полезен - методики современные, сэкономят вам время. Я постарался описать их наиболее просто и без излишеств.

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

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

 

Другие материалы

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

 

Так же прошу ознакомиться с другими моими статьями по БСП и типовым конфигурациям:

Честный знак - запрос содержания упаковки по ее коду [табачная продукция]

Гарантированно рабочий пример использования длительных операций на БСП с отображением прогресса. [Часть 1]

Работаем с контактной информацией в конфигурациях на БСП

Типовые методы конфигурации "Зарплата и управление персоналом", которые пригодятся каждому ЗУП программисту и не только

Полезные встроенные функции для работы с печатными формами и не только на УТ 11.4 и БП 3.0 (сравнение)

Возможности работы со строками при помощи БСП, которые должен знать каждый программист

БСП фоновые задания длительные операции ВыполнитьПроцедуру ВыполнитьФункцию

См. также

БСП. Добавляем отчет в меню Отчеты

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

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

02.04.2024    3200    John_d    10    

89

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1747    dimanich70    8    

14

Заполнение поля адреса в своей обработке [БСП]

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

Небольшая шпаргалка по функциям БСП касательно адреса. Так скажем, еще один способ помимо https://infostart.ru/1c/articles/1060970/

12.02.2024    806    FilippovRI    0    

15

Расширяем возможности дополнительных обработок и настраиваем их отладку

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

Уже не одна веб-страница исписана знаниями о дополнительных обработках, как создать, как подключить. Есть масса вариантов, как их можно отладить. Я разобрался в кишках работы библиотеки и покажу, как можно расширить возможности дополнительных отчетов, а также покажу удобный способ отладки.

07.02.2024    2656    YA_418728146    11    

44

1С:БСП Дополнительные реквизиты и сведения

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

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

19.01.2024    6480    PROSTO-1C    5    

46

Бесплатный митап 9 февраля «Библиотеки и фреймворки на 1С и всё, что с этим связано»

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

Митап посвящен вопросам создания, использования и поддержке переиспользуемого кода при разработке решений на платформе 1С:Предприятие 8.

15.01.2024    3897    0    Infostart    0    

21
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Plotks2017 268 30.10.20 13:28 Сейчас в теме
А в чем преимущество перед ВыполнитьВФоне? +- одно и тоже.
davdykin; +1 Ответить
2. mikl79 118 30.10.20 13:43 Сейчас в теме
Не понятно, зачем они нужны эти 2 функции!

Какая разница, передать структуру данных в одном параметре через ВыполнитьВФоне
или передать кучу параметров через ВыполнитьПроцедуру и ВыполнитьФункцию

Если знаете, лучше опишите как запустить в фоне внешнюю обработку через файл-открыть
5. Xershi 1484 30.10.20 20:29 Сейчас в теме
(2) уже описано. Если речь про их методы. Предварительно добавить в доп обработку.
3. quazare 3607 30.10.20 14:56 Сейчас в теме
как ни странно, разница в передаче параметров конечно. все кто не ознакомился с первой частью описания - можете сделать здесь https://infostart.ru/1c/articles/1260411/
4. suepifanov 964 30.10.20 17:50 Сейчас в теме
(2) ну видимо не надо "готовить" функцию специально для фонового выполнения. Можно использовать и для обычного вызова и для фонового.
ubnkfl; PowerBoy; Xershi; quazare; +4 Ответить
6. Гость 14.07.23 08:57
В параметрах запуска передается структура. А если потребуется таблицу значений передать?
7. quazare 3607 14.07.23 10:44 Сейчас в теме
(6) на счет "таблицы значений" не уверен - но, вы можете скачать примеры https://infostart.ru/1c/tools/1318496/ - чтобы понять как происходит процесс
Оставьте свое сообщение