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

31.08.22

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Шаблон внешней обработки на основе БСП с фоновым выполнением модуля обработки и выводом индикации фонового задания
.epf 10,01Kb
75
75 Скачать (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

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

См. также

SALE! 15%

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

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

10000 руб.

02.09.2020    159428    872    399    

861

SALE! 15%

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

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

8400 7140 руб.

20.08.2024    7770    55    22    

66

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

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

9360 руб.

17.05.2024    23435    68    45    

117

SALE! 15%

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

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

10000 8500 руб.

10.11.2023    10425    36    22    

61

SALE! 15%

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

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

22200 19980 руб.

06.10.2023    15400    35    7    

70

SALE! 35%

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

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

4800 3120 руб.

14.01.2013    187984    1138    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17303    6    32    

42

Инструментарий разработчика Программист Платные (руб)

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

1800 руб.

21.02.2023    7694    8    35    

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