Запуск почти любых процедур и функций конфигураций в асинхронном режиме - БСП - Длительные операции [Часть 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 Абонемент ($m)

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

2 стартмани

03.05.2024    997    16    Hitcher    3    

10

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

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

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

01.03.2024    2822    dimanich70    8    

15

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

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

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

12.02.2024    1005    FilippovRI    0    

17

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

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

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

07.02.2024    3118    YA_418728146    11    

51

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

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

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

19.01.2024    9195    PROSTO-1C    5    

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

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

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