Запуск фонового задания во внешней обработке без регистрации в справочнике "Дополнительные отчеты и обработки"

09.03.20

Разработка - Инструментарий разработчика

Описал, как показать прогресс выполнения длительной операции во внешней обработке, и при этом не регистрировать обработку в справочнике "ДополнительныеОтчетыИОбработки". Проверял на БСП версии "3.1.2.264".

Файлы

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

Наименование Скачано Купить файл
(только для физ. лиц)
Запуск фонового задания во внешней обработке без регистрации в справочнике "ДополнительныеОтчетыИОбработки"
.epf 10,48Kb ver:1.0
142 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

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

В качестве базового шаблона для решения моей задачи я использовал пример, опубликованный здесь: https://wiki.programstore.ru/zapusk-fonovogo-zadaniya-vo-vneshnej-obrabotke-s-indikaciei/ 

Изменения, которые я внес в этот пример, минимальны - в основном, причесал код, распределил процедуры и функции по областям, добавил комментарии и исправил пару мелких ошибок. Работоспособность проверял в конфигурации "Зарплата и управление персоналом 3.1.12.144", версия БСП "3.1.2.264".

Важное замечание

Этот пример рассчитан на работу в двух вариантах:

1. Без подключения к подсистеме внешних отчетов/обработок;

2. С подключением к подсистеме.


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


Модуль объекта внешней обработки

На случай, если вы планируете подключать обработку к подсистеме внешних отчетов/обработок, я оставил экспортный метод "СведенияОВнешнейОбработке". 

За реализацию длительной операции отвечает экспортный метод "ДлительнаяОперация", в которой организовано заполнение массива по тысяче строк, а в первом параметре передается количество таких заполнений (итераций). Рекомендую устанавливать количество итераций от 10 000.

 

// Процедура - выполняет некоторые действия, которые длятся долго
//
// Параметры:
//  СтруктураПараметров	 - Структура - содержит исходные данные для расчетов
//  АдресРезультата		 - Строка	 - адрес во временном хранилище, пот которому нужно поместить результат расчетов
//
Процедура ДлительнаяОперация(СтруктураПараметров, АдресРезультата) Экспорт
	
	Результат = 0;
	ПредыдущийПроцент = -1;
	Для Сч = 1 по СтруктураПараметров.КоличествоИтераций Цикл
		
		// выполнить нечто долгое
		Стр = "";
		Для i=1 По 1000 Цикл
			Стр = Стр + ?(i=1, "", ",") + "Подстрока"+Строка(i);
		КонецЦикла;
		М = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр, ",");
		
		Если Сч/100 - Цел(Сч/100) = 0 Тогда
			Результат = Результат + 1;
		КонецЕсли;
		
		ПроцентВыполнения = Мин(100, Окр(100 * Сч / СтруктураПараметров.КоличествоИтераций, 0, РежимОкругления.Окр15как20));
		Если ПроцентВыполнения>ПредыдущийПроцент Тогда
			ДлительныеОперации.СообщитьПрогресс(ПроцентВыполнения, СтрШаблон("Выполняется итерация %1", Сч));
		КонецЕсли;
		ПредыдущийПроцент = ПроцентВыполнения;
	КонецЦикла;	
	
	ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
	
КонецПроцедуры


Модуль формы внешней обработки

На форму добавлен собственный индикатор и строка состояния, а также реквизит "Количество итераций" и кнопка запуска длительной операции. В этом примере прогресс работает достаточно наглядно, если количество итераций от 10 000.

Подготовка данных для длительной операции

В этом примере исходные данные - это количество итераций и расположение файла внешней обработки.

Обратите внимание на код процедуры "ПодготовитьДанныеДляДлительнойОперации":
1. Если обработка подключена к подсистеме внешних отчетов/обработок, то в нее при создании передана ссылка на справочник доп. отчетов/обработок, и параметры готовятся так, чтобы запустить подключенную в подсистему обработку;

2. Если же обработка не подключена к подсистеме, то определяется имя файла этой обработки, а ссылка устанавливается пустая.
 

#Область СлужебныеПроцедурыИФункции

// Функция - возвращает имя файла этой внешней обработки.
//           Внимание!!! В клиент-серверном варианте файл обработки должен быть виден с сервера,
//           либо вы должны позаботиться самостоятельно о переносе файла обработки с клиента на сервер,
//           в этом случае результат работы этой функции - имя файла, которое вы поместили на сервер самостоятельно
// 
// Возвращаемое значение:
//   - Строка
//
&НаСервере
Функция ИспользуемоеИмяФайла()
	Возврат РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;
КонецФункции

// Функция - создает структуру, содержащую исходные данные для выполнения длительной операции
// 
// Возвращаемое значение:
//   - Структура
//
&НаКлиенте
Функция ПодготовитьДанныеДляДлительнойОперации()
Перем Рез;

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

Обработчик команды "ЗапуститьВыполнение"

Выполняется при нажатии на кнопку "Запустить выполнение", и выполняет следующие действия:
1. Обнуляет индикатор прогресса;
2. Создает фоновое задание и запоминает его идентификатор в реквизите формы;

3. Подключает обработчики ожидания, отвечающие за обновление прогресса.

В этом примере используется отображение и через индикатор на форме, и через стандартное окно отображения состояния. Я бы не рекомендовал отключать стандартное окно, так как в нем есть кнопка "Отмена", которая позволяет прервать исполнение длительной операции.

#Область ОбработчикиКомандФормы

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

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

Когда длительная операция завершится, будет исполнен клиентский метод формы "ФоновоеЗаданиеЗавершение".

Здесь мы в первую очередь отключаем обработчик ожидания, который отвечает за обновление индикатора, а потом анализируем результат выполнения фонового задания. Если задание завершилось с ошибкой, можно организовать выполнение длительной операции без отображения индикатора. Для этого нужно вызвать экспортный метод объекта обработки "ДлительнаяОперация", передав в него исходные данные самостоятельно.

// Процедура - выполняется после завершения фонового задания
//             Выполнить анализ завершения, в случае успеха получить данные результата из временного хранилища и обработать их
//
// Параметры:
//  Результат				 - Структура - результат выполнения фонового задания
//  ДополнительныеПараметры	 - Произвольный	 - дополнительные параметры фонового задания
//
&НаКлиенте
Процедура ФоновоеЗаданиеЗавершение(Результат, ДополнительныеПараметры) Экспорт

	ОтключитьОбработчикОжидания("ОбработчикОжиданияИндикатор");
	
	Если ТипЗнч(Результат) <> Тип("Структура") Тогда
		Возврат;
	КонецЕсли;
	
	Если Результат.Статус = "Ошибка" Тогда
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Результат.ПодробноеПредставлениеОшибки);
		СтрокаСостояния = "Задание завершено с ошибками.";
		
		// здесь можно запустить выполнение задания не в фоне, без отображения состояния и сообщить об этом в строке состояния
		
	ИначеЕсли Результат.Статус = "Выполнено" Тогда
		
		// успешное выполнение - получить результат из временного хранилища и обработать его
		
		Данные = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
		ВозвратноеЗначение = Данные;
		Индикатор = 100;
		СтрокаСостояния = "Задание завершено.";
		
	КонецЕсли;
КонецПроцедуры

 

А теперь самое главное - запуск фонового задания без использования справочника "ДополнительныеОтчетыИОбработки"

Код практически не отличается от базового шаблона, изменений всего два, и оба при заполнении структуры "ПараметрыЗадания".
1. В исходном примере имя обработки всегда было такое: "ВнешняяОбработка.ДлительныеОперацииВоВнешнейОбработке"
    Я же заполняю это значение из параметров запуска - это либо имя файла внешней обработки, либо строка из исходного примера;

2. В исходном примере "ДополнительнаяОбработкаСсылка" всегда была заполнена ссылкой на подключенную к подсистеме внешнюю обработку.

    У меня это либо пустая ссылка (если не было подключения к подсистеме), либо ссылка на подключенную обработку.

&НаСервереБезКонтекста
Функция ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор)

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

Вот, собственно, и все.

Надеюсь, что эта статья поможет разобраться с проблемой отображения состояния длительной операции тем, кто такую проблему еще не решал.
Кроме того, эту ссылку могу использовать и я сам, не так ли? ))

Удачи в работе!

Вступайте в нашу телеграмм-группу Инфостарт

Внешняя обработка индикация прогресса фоновое задание

См. также

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

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

15500 руб.

02.09.2020    201439    1114    410    

1018

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

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

8400 руб.

20.08.2024    35267    203    104    

194

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

Расширение для создания и редактирования печатных форм в системе 1С:Предприятие 8.3. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и прозрачность разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    23813    63    26    

92

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

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

16000 руб.

10.11.2023    16348    70    39    

88

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

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

9360 руб.

17.05.2024    34500    122    53    

165

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

Инструмент для генерации OpenApi (Swagger) спецификаций на основании файлов конфигураций 1С. Это консольное и десктопное приложение на языке Rust с полноценным редактором кода, содержащим автозамену и подсвечивание ошибок для быстрого и безошибочного написания документирующего комментария.

18000 руб.

22.11.2024    1555    1    0    

8

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

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

6000 руб.

07.02.2018    107057    249    100    

313
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. PowerBoy 3465 10.03.20 05:51 Сейчас в теме
Внимание!!! В клиент-серверном варианте файл обработки должен быть виден с сервера,
// либо вы должны позаботиться самостоятельно о переносе файла обработки с клиента на сервер,


Ну так добавили бы пару строчек - сделали бы уже решение до конца!
2. 1sig 256 10.03.20 08:22 Сейчас в теме
(1)
по сути тоже самое https://infostart.ru/public/1174382/ :)
там же в комментариях про то, что в клиент-серверном режиме работы файл обработки должен быть "виден" на сервере.
PowerBoy, вы предлагаете помещать файл внешней обработки в хранилище,
потом получить навигационную ссылку по адресу и уже после этого подключать объект обработки?
user931955; COMPER; +2 Ответить
4. VinnieThePOOH 162 10.03.20 08:52 Сейчас в теме
(2) Да, действительно, но мне эта разработка не попалась в поиске. Если бы нашел - сэкономил бы себе массу времени..
3. VinnieThePOOH 162 10.03.20 08:51 Сейчас в теме
(1) Должны же юные падаваны хоть что-то делать самостоятельно!
5. Aleksey81 1192 10.03.20 13:35 Сейчас в теме
Спасибо огромное. Очень полезная публикация!!!
adhocprog; +1 Ответить
6. burgomister 61 14.11.21 19:45 Сейчас в теме
1112877 - сделано всё и работает.
7. triviumfan 102 18.08.22 11:47 Сейчас в теме
Я так понимаю ни один не удосужился сделать передачу внешней обработки на сервер? Уже 3тью обработку скачиваю и опять то же самое.
8. siamagic 12.04.23 08:09 Сейчас в теме
(7)В клиенте кидаешь в хранилище далее на сервеер из хранилища достаешь и работаешь с ней
9. gosizo 38 03.05.23 10:57 Сейчас в теме
10. an1c 25.05.23 15:57 Сейчас в теме
Спасибо большое, помогли реально!!!
Оставьте свое сообщение