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

28.04.23

Разработка - Работа с интерфейсом

Внешняя обработка с фоновым выполнением и индикацией процесса для любой конфигурации на основе БСП >= 2.3 без изменения конфигурации и встраивания обработки в "Дополнительные отчеты и обработки".

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

Наименование Файл Версия Размер
ИндикацияУФФайловыйВариант.epf
.epf 8,41Kb
61
.epf 8,41Kb 61 Скачать
ИндикацияУФКлиентСерверныйВариант.epf
.epf 8,92Kb
59
.epf 8,92Kb 59 Скачать

Развитие функциональности БСП поражает, то что раньше приходилось реализовывать через "костыли", теперь можно сделать парой строк кода, используя штатные механизмы БСП. Данная внешняя обработка использует пару процедур общих модулей "Длительные операции", входящих в состав БСП.

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

Отличие данной обработки от других в том, что максимально упрощен код, использующий механизмы БСП для индикации процесса выполнения длительного процесса, и это все реализовано на внешней обработке, которую не нужно встраивать в справочник "Дополнительные отчеты и обработки". Отладку можно производить прям в самом теле обработки, предварительно прописав параметр "РежимОтладки" (раздел "Отладка длительных операций").

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

и получения результатов выполнения фонового задания на клиент

Код модуля обработки

 

 

&НаСервере

//здесь имитация длительной операции на сервере
Процедура ВыполнитьПримерНаСервере(СтруктураПараметров, АдресРезультата) Экспорт

    //проверим структуру входящих параметров (задаются на форме)

    Если ТипЗНЧ(СтруктураПараметров) = Тип("Структура") 
            И НЕ ЗначениеЗаполнено(СтруктураПараметров.ТекущийПользователь) Тогда
        Возврат;
    КонецЕсли;
    
    ТекущийПользователь = СтруктураПараметров.ТекущийПользователь;
    КоличествоИтераций   = 0;
    МассивИтераций         = Новый Массив;
    
    //формируем возвращаемую структуру на клиент

    СтруктураВозврата = Новый Структура("ТекущийПользователь, ВремяНачала, ВремяОкончания, КоличествоИтераций, МассивИтераций");
    СтруктураВозврата.Вставить("ТекущийПользователь", "Тек. пользователь: "+ ТекущийПользователь);
    СтруктураВозврата.Вставить("ВремяНачала",          "Время начала: "+ ТекущаяДата());
    

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

    //помещаем в ВХ данные для клиента
    ПоместитьВоВременноеХранилище(СтруктураВозврата, АдресРезультата);

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


 

 

создаем форму обработки, в модуль формы помещаем

 


 

//здесь понадобится для примера заполнить текущего пользователя,

// параметры естественно могут быть другими, все что можно поместить в структуру

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

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

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



// здесь также понадобится обработать возвращаемый массив ЗаполнитьМассивИтераций(Данные.МассивИтераций), 
// если например, нужно вывести какой-нибудь список обработанных документов, можно закомментить

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

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

 

 

UPD: По наработкам данной статьи добавлена возможность запуска обработки в клиент-серверном варианте.

Длительная операция прогресс отладка дополнительная обработка индикация процесса фоновое задание отслеживание статуса выполнения индикатор управляемые формы БСП ВнешняяОбработка ДлительныеОперации ФоновыеЗадания

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

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

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61793    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

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

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

5000 руб.

14.01.2016    54398    16    21    

42

Управление дашбордами

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

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

2400 руб.

29.06.2020    16695    21    4    

35

Конструктор HTML, CSS и javascript

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

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

2 стартмани

10.04.2023    9607    151    acces969    31    

118

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3665    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12077    1    5    

10

Модули общего назначения - готовые полезные функции и процедуры конфигураций на БСП

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

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

25.04.2022    14974    quazare    11    

138
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 27.12.19 09:26 Сейчас в теме
В общих модулях итак код выполнения в фоне максимально упрощен и примеры запуска можно найти в конфигах.

Так что очередная попытка халтуры в стиле сухариков, когда крошки хлеба крошат в пакетик и вопят, что это крута.

Да и перестаньте обманывать надуманными отличиями от сотен подобных костылей, кроме "Пожалуйста, подождите..." и индикатора времени в сообщение нечего вывести, т.к. в 90% случаев вычислить результирующую коллекцию в фоне до старта задания невозможно.
1giga; fokin; Evg-Lylyk; dime2; user1274438; +5 5 Ответить
2. 1sig 244 27.12.19 09:29 Сейчас в теме
(1) во внешней обработке, чтобы все это взлетело без встраивания в "Дополнительные внешние отчеты и обработки"?
4. webester 26 27.12.19 10:24 Сейчас в теме
Не показывать код жлобство конечно) Но спасибо и на том, что есть.
5. 1sig 244 27.12.19 11:03 Сейчас в теме
(4) с замечанием согласен, принято, сам жлобство не люблю, чуть позже по примеру аналогичных публикаций будет оформлен и код обязательно, если что ловите на слове)
umy; user1804494; CodeNull; +3 Ответить
3. VmvLer 27.12.19 09:30 Сейчас в теме
Муся, не нервируй меня
(с)классика к/ф
6. Lancelot-2M 115 29.12.19 03:05 Сейчас в теме
А что с замерами производительности? Как оно работает с индикацией и без на конкретных таких рабочих выборках (ну хотя бы за 100 000 неважно чего)?
8. 1sig 244 29.12.19 09:22 Сейчас в теме
(6) хороший вопрос, нагрузочное тестирование не проводилось, по времени ограничений не было, пользователь просто хотел видеть - на каком этапе идет обработка пакетов документов. Пример длительной операции в данном задании - только пример, он не хорош с точки зрения холостой загрузки проца, в 1С к сожалению так и не появился встроенный метод Delay, поэтому проц грузится большую часть времени впустую в данном условии цикла "ТекущаяДата() < ВремяЗавершения"
15. serverstar 62 14.09.21 18:20 Сейчас в теме
(8) (почти) бесконечный цикл иногда тоже бывает полезен 🙃
7. webester 26 29.12.19 04:29 Сейчас в теме
(6)Я так понимаю,единственное, что влияет на производительность это вот эта строчка
ДлительныеОперации.СообщитьПрогресс(Процент, "Обработано: "+Строка(КоличествоИтераций));

В остальном разницы нет. 5 там строк или 55000
maksa2005; +1 Ответить
9. manlak 77 30.12.19 11:52 Сейчас в теме
Класс! Давно искал такую штуку.
10. PowerBoy 3350 09.01.20 07:56 Сейчас в теме
Меня смущает вот эта строка:
ПараметрыЗадания.Вставить("ИмяОбработки", РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла);

Передается путь и имя файла на клиенте, а выполняться серверный код будет на сервере и файл не найдет.
MaxTolya; maksa2005; +2 Ответить
11. 1sig 244 09.01.20 09:29 Сейчас в теме
(10) для серверной базы верное замечание! но как вариант, расшарить на машине-сервере, где крутится сервер 1С, общедоступную сетевую папку, поместить файл внешней обработки туда и запускать с нее - найдет файл, проверено :)
12. Xershi 1474 13.01.20 21:00 Сейчас в теме
(10) ну код кривой у автора что поделать. Я давно использую в своих наработках такой подход.
Единственный момент в старых бсп 2.3 процент без допила не выводится.
serverstar; +1 Ответить
16. serverstar 62 14.09.21 18:22 Сейчас в теме
13. maksa2005 530 14.08.20 15:23 Сейчас в теме
Каталог не обнаружен 'C:\Users\litvinov\Desktop\PUBID_1174382-ИндикацияУФ.epf'
{ОбщийМодуль.ДлительныеОперации.Модуль(649)}: Обработка = ВнешниеОбработки.Создать(Параметры.ИмяОбработки, БезопасныйРежим);
{(1)}:ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры[0],Параметры[1])
{ОбщийМодуль.ОбщегоНазначения.Модуль(4797)}: Выполнить ИмяМетода + "(" + ПараметрыСтрока + ")";
{ОбщийМодуль.ДлительныеОперации.Модуль(768)}: ОбщегоНазначения.ВыполнитьМетодКонфигурации(ИмяПроцедуры, ПараметрыПроцедуры);
{ОбщийМодуль.ДлительныеОперации.Модуль(759)}: ВыполнитьПроцедуру(ВсеПараметры.ИмяПроцедуры, ВсеПараметры.ПараметрыПроцедуры);

по причине:
Ошибка подключения внешних метаданных
по причине:
Каталог не обнаружен 'C:\Users\litvinov\Desktop\PUBID_1174382-ИндикацияУФ.epf'
14. 1sig 244 14.08.20 18:54 Сейчас в теме
(13)
запускайте обработку с общедоступной сетевой папки,
PowerBoy в (10) сообщении написал, в чем причина такой ошибки.
17. zels 171 13.06.22 08:49 Сейчас в теме
Как вывести "палку" индикатора?
18. triviumfan 92 18.08.22 11:41 Сейчас в теме
Нерабочая, как пример не подойдёт.
19. 1sig 244 18.08.22 13:19 Сейчас в теме
(18) обработка рабочая, на какой конфигурации запускаете?
20. triviumfan 92 18.08.22 14:26 Сейчас в теме
(19) Нету передачи обработки на сервер, это решение лишь для файловой базы, которая по сути нигде не используется.
Пришлось самому пилить.
21. 1sig 244 18.08.22 17:13 Сейчас в теме
(20) добавлена возможность запуска обработки в клиент-серверном варианте
22. Dakaskas1 20.12.22 08:37 Сейчас в теме
Единственный рабочий пример, который реально работает без подключения к доп обработкам и работает отладка.
23. gosizo 38 26.04.23 16:49 Сейчас в теме
(22) Согласен полностью, столько стартмани потратил скачивая не работающие обработки , а эта работает. Низкий поклон автору
24. user756806 27.04.23 13:08 Сейчас в теме
Если СтруктураПараметров = Тип("Структура")

Чел, не делай так больше никогда!
фоновые задания на сервере крайне сложно отладчиком ловить!
Я понимаю, что надо смотреть что копируешь... но блин... подстава!
25. 1sig 244 28.04.23 09:31 Сейчас в теме
(24) подстава :) спасибо за найденную очепятку, исправлено
26. gosizo 38 03.05.23 16:58 Сейчас в теме
Все хорошо, только если обработку прикрепить в справочнике дополнительные отчеты и обработки, то вываливается ошибка
https://ibb.co/LNDTyGP

Как можно исправить?
29. 1sig 244 04.05.23 10:32 Сейчас в теме
(26)
если обработку прикрепить в справочнике дополнительные отчеты и обработки

Добрый день, обработка изначально разрабатывалась на внешний запуск, из файла, по ходу без изменения кода не получится ее сделать встроенной доп. обработкой
27. gosizo 38 03.05.23 17:00 Сейчас в теме
обработку прописывал:
Функция СведенияОВнешнейОбработке() Экспорт

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

ТаблицаКоманд = ПолучитьТаблицуКоманд();

// Добавим команду в таблицу
ДобавитьКоманду(ТаблицаКоманд, Синоним, "1" , "ОткрытиеФормы", Истина, );

// Сохраним таблицу команд в параметры регистрации обработки
РегистрационныеДанные.Вставить("Команды", ТаблицаКоманд);

Возврат РегистрационныеДанные;

КонецФункции

Функция ПолучитьТаблицуКоманд()

// Создадим пустую таблицу команд и колонки в ней
Команды = Новый ТаблицаЗначений;

// Как будет выглядеть описание печатной формы для пользователя
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));

// Имя нашего макета, что бы могли отличить вызванную команду в обработке печати
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));

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

// Следующий параметр указывает, необходимо ли показывать оповещение при начале и завершению работы обработки. Не имеет смысла при открытии формы
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));

// Для печатной формы должен содержать строку ПечатьMXL
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;

КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование = "ОткрытиеФормы", ПоказыватьОповещение = Ложь, Модификатор)

// Добавляем команду в таблицу команд по переданному описанию.
// Параметры и их значения можно посмотреть в функции ПолучитьТаблицуКоманд
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;

КонецПроцедуры
28. gosizo 38 04.05.23 10:28 Сейчас в теме
Оставьте свое сообщение