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

31.08.22

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

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

Скачать файлы

Наименование Файл Версия Размер
Шаблон внешней обработки на основе БСП с фоновым выполнением модуля обработки и выводом индикации фонового задания
.epf 10,01Kb
65
.epf 10,01Kb 65 Скачать

Добрый день, коллеги.

Основная идея обработки взята из публикации //infostart.ru/1c/articles/1112877/, т. е. чтобы запустить в фоновом задании процедуру модуля внешней обработки, надо создать копию этой обработки на сервере и уже запустить её методом "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки" через функцию БСП ДлительныеОперации.ВыполнитьВФоне. Впрочем БСП делает практически тоже самое для обработок подключенных к подсистеме "ДополнительныеОтчетыИОбработки".

 

Обработка писалась для себя как шаблон, что бы не вспоминать что и где надо исправить, ну и те примеры, которые уже есть на эту тему не очень удовлетворяли меня.

Собственно код:

Модуль обработки

#Область ПрограммныйИнтерфейс

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(СтандартныеПодсистемыСервер.ВерсияБиблиотеки());
	ПараметрыРегистрации.Наименование = НСтр("ru = 'ШаблонОбработкиДлительнойОперацииСПрогрессом'");
	ПараметрыРегистрации.Информация = НСтр("ru = 'Шаблон обработки с длительной операцией и выводом прогресса '");
	ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
	ПараметрыРегистрации.Версия = "1.1.1";
	ПараметрыРегистрации.БезопасныйРежим = Ложь;
	
	Команда = ПараметрыРегистрации.Команды.Добавить();
	Команда.Представление = НСтр("ru = 'Открытие формы обработки...'");
	
	//Для совместимости Идентификатор называем также как и процедуру модуля
	Команда.Идентификатор = "ВыполнитьДлительнуюОперацию";
	Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
	Команда.ПоказыватьОповещение = Ложь;
	Возврат ПараметрыРегистрации;
	
КонецФункции

//Имитация длительной операции
Процедура ВыполнитьДлительнуюОперацию(ПараметрыОбработки, АдресРезультата) Экспорт

	СчетчикШага = 0;
	Шаг = ПараметрыОбработки.КоличествоИтераций / 100;
	
	Для Счетчик = 1 По ПараметрыОбработки.КоличествоИтераций Цикл
		ДатаЗавершенияВМиллисекундах = ТекущаяУниверсальнаяДатаВМиллисекундах() + 1000;
		Пока ТекущаяУниверсальнаяДатаВМиллисекундах() < ДатаЗавершенияВМиллисекундах Цикл
		КонецЦикла;
		
		//БСП рекомендует вызывать ДлительныеОперации.СообщитьПрогресс не более 100 раз
		
		Если (Счетчик - СчетчикШага) >= Шаг Тогда
			СчетчикШага = Счетчик;
			ПроцентВыполнения = Цел(Счетчик * 100 / ПараметрыОбработки.КоличествоИтераций);
			ТестСообщения = СтрШаблон("Выполнено %1 из %2", Счетчик, ПараметрыОбработки.КоличествоИтераций);
			ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения, ТестСообщения);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры	

#КонецОбласти

В форме созданы следующие реквизиты:

  • ИдентификаторДлительнойОперации - ТИП "УникальныйИдентификатор" используется для поиска и управления фоновым заданием
  • ИдентификаторКомандыОбработки - ТИП "Строка"
  • ИмяФайлаОбработки - ТИП "Строка" эти два реквизита для универсальности использования обработки как с подключением к БСП "ДополнительныеОтчетыИОбработки" и так и без нее
  • ДлительнаяОперацияПроцент - Тип "Число" для вывода прогресса выполнения
  • ДлительнаяОперацияТекст - Тип "Строка" для вывода текста  прогресса выполнения, если использовать стандартный вывод БСП, то эти реквизиты не нужны.

Код модуля формы

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

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)

	Если ЗначениеЗаполнено(ИдентификаторДлительнойОперации) Тогда
		ПроверитьИОтменитьЕслиВыполняется(ИдентификаторДлительнойОперации);
	КонецЕсли;

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

#КонецОбласти

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

	Если СтруктураДлительнойОперации.Статус = "Выполняется" Тогда
		ИдентификаторДлительнойОперации = СтруктураДлительнойОперации.ИдентификаторЗадания;
		//Если требуется стандарный вывод БСП тогда закомментировать следующие 4 строки
		Элементы.Страницы.ТекущаяСтраница = Элементы.ДлительныеОперации;
		Элементы.ГруппаКнопки.Видимость = Ложь;
		ДлительнаяОперацияПроцент = 0;
		ДлительнаяОперацияТекст = НСтр("ru = 'Пожалуйста подождите...'");
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции
&НаСервере
Функция СоздатьКопиюНаСервере()
	
	Попытка
		ИмяФайлаОбработки = ПолучитьИмяВременногоФайла("epf");
		//Если у пользователя ИБ установлен режим "Защита от опасных действий"
		//следующие 2 строчки вызывют ошибку поскольку в этом режиме они блокируются
		//Решение: подключать обработку к подсистеме "ДополнительныеОтчетыИОбрабоки"
		ДвоичныеДанные = Новый ДвоичныеДанные(РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла);
		ДвоичныеДанные.Записать(ИмяФайлаОбработки);
		Результат = Истина;
	Исключение
		ИмяФайлаОбработки = "";
		Результат = Ложь;
	КонецПопытки;
	Возврат Результат;
	
КонецФункции

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

&НаКлиенте
// Если используется стандартный вывод БСП  в процедуре нет необходимости
Процедура ПрогрессВыполнения(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат.Статус = "Выполняется" Тогда
		Прогресс = ПрочитатьПрогресс(Результат.ИдентификаторЗадания);
		Если Прогресс <> Неопределено Тогда
			ДлительнаяОперацияПроцент = Прогресс.Процент;
			ДлительнаяОперацияТекст = Прогресс.Текст;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПрочитатьПрогресс(ИдентификаторЗадания)
	Возврат ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторЗадания);
КонецФункции

&НаКлиенте
Процедура ПослеЗавершенияДлительнойОперации(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Результат.Статус = "Выполнено" Тогда
		// Если используется стандартный вывод БСП закомментировать следующие 3 строчки
		ДлительнаяОперацияПроцент = 100;
		Элементы.Страницы.ТекущаяСтраница = Элементы.НастройкиОбработки;
		Элементы.ГруппаКнопки.Видимость = Истина;
	Иначе
		ПоказатьПредупреждение(, Результат.КраткоеПредставлениеОшибки);
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура  ПроверитьИОтменитьЕслиВыполняется(ИдентификаторЗадания)
	
	ДлительнаяОперация = ДлительныеОперации.ОперацияВыполнена(ИдентификаторЗадания);
	Если ДлительнаяОперация.Статус = "Выполняется" Тогда
		ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
	КонецЕсли;

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

#КонецОбласти

Обработка тестировалась на версиях БСП 3.1.5.385 и 3.1.7.37 платформа 1с версии 8.3.20.1710

БСП фоновое выполнение внешней обработки

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122178    670    389    

714

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

18000 15300 руб.

06.10.2023    7297    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

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

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

10000 8000 руб.

10.11.2023    3544    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

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

3600 2520 руб.

14.01.2013    177759    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99349    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18117    6    8    

40

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28111    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23605    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 92 08.09.22 12:39 Сейчас в теме
Кажется, что это единственная рабочая версия на сием ресурсе.
2. nomadon 367 13.09.22 17:56 Сейчас в теме
а какой в этом смысл, если БСП функцию внешней обработки выполняет в том же потоке?
3. VdZMWOnC 106 14.09.22 11:26 Сейчас в теме
(2) Как минимум не заблокирован интерфейс
Прикрепленные файлы:
4. virs 16.01.23 08:24 Сейчас в теме
Автор спасибо! Непонятно только, если код выложил - зачем Sманю просить?
5. WaterSmith 355 04.02.23 18:15 Сейчас в теме
(4) Видимо для тех, кто хочет отблагодарить, или тех, кому лень собирать обработку самому.
6. Nigmatul 12.06.23 16:16 Сейчас в теме
Код рабочий, спасибо.

Кто будет сам собирать обработку,

У Параметра "ДополнительнаяОбработкаСсылка" должен стоять флаг "Ключевой", иначе после процедуры "ПриСозданииНаСервере" параметр пропадет.

ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка", Параметры.ДополнительнаяОбработкаСсылка);

Иначе кешируйте в реквизит формы.
7. ciddex 01.09.23 15:43 Сейчас в теме
(6) Можешь скинуть, если не трудно обработку шаблона? У меня не заработал..( Флаг ключевой тоже поставил
9. пользователь 10.09.23 13:35
Сообщение было скрыто модератором.
...
8. пользователь 05.09.23 00:02
Сообщение было скрыто модератором.
...
Оставьте свое сообщение