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

31.08.22

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Шаблон внешней обработки на основе БСП с фоновым выполнением модуля обработки и выводом индикации фонового задания
.epf 10,01Kb
80
80 Скачать (1 SM) Купить за 1 850 руб.

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

Основная идея обработки взята из публикации //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

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

См. также

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

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

15500 руб.

02.09.2020    183139    1017    403    

965

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP, УНФ, КА и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку одновременно в несколько потоков. А так же автоматически, без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    23745    156    84    

155

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

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

22200 руб.

06.10.2023    20142    51    19    

86

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

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

15000 руб.

10.11.2023    13559    55    33    

76

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

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

9360 руб.

17.05.2024    30328    103    48    

147

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

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

1800 руб.

21.11.2024    5314    23    17    

27

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

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    2264    4    0    

7
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. triviumfan 99 08.09.22 12:39 Сейчас в теме
Кажется, что это единственная рабочая версия на сием ресурсе.
2. nomadon 369 13.09.22 17:56 Сейчас в теме
а какой в этом смысл, если БСП функцию внешней обработки выполняет в том же потоке?
3. VdZMWOnC 111 14.09.22 11:26 Сейчас в теме
(2) Как минимум не заблокирован интерфейс
Прикрепленные файлы:
4. virs 16.01.23 08:24 Сейчас в теме
Автор спасибо! Непонятно только, если код выложил - зачем Sманю просить?
5. WaterSmith 357 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
Сообщение было скрыто модератором.
...
Оставьте свое сообщение