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

28.04.23

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
ИндикацияУФФайловыйВариант.epf
.epf 8,41Kb
62
62 Скачать (1 SM) Купить за 1 850 руб.
ИндикацияУФКлиентСерверныйВариант.epf
.epf 8,92Kb
78
78 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

 

 

&НаСервере

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

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

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

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

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

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

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


 

 

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

 


 

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

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

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

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

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



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

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

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

 

 

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

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

См. также

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

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

1800 руб.

21.11.2024    4280    17    15    

20

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

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

5000 руб.

14.01.2016    55604    17    23    

43

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

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

2400 руб.

29.06.2020    19918    28    6    

44

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

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

20.08.2024    23341    mrXoxot    44    

130

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    18327    1228    elcoan    53    

125

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

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

3 стартмани

10.04.2023    12857    167    acces969    31    

126

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

05.07.2022    7911    kalyaka    6    

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

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

Да и перестаньте обманывать надуманными отличиями от сотен подобных костылей, кроме "Пожалуйста, подождите..." и индикатора времени в сообщение нечего вывести, т.к. в 90% случаев вычислить результирующую коллекцию в фоне до старта задания невозможно.
1giga; fokin; Evg-Lylyk; dime2; user1274438; +5 5 Ответить
2. 1sig 253 27.12.19 09:29 Сейчас в теме
(1) во внешней обработке, чтобы все это взлетело без встраивания в "Дополнительные внешние отчеты и обработки"?
4. webester 26 27.12.19 10:24 Сейчас в теме
Не показывать код жлобство конечно) Но спасибо и на том, что есть.
5. 1sig 253 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 253 29.12.19 09:22 Сейчас в теме
(6) хороший вопрос, нагрузочное тестирование не проводилось, по времени ограничений не было, пользователь просто хотел видеть - на каком этапе идет обработка пакетов документов. Пример длительной операции в данном задании - только пример, он не хорош с точки зрения холостой загрузки проца, в 1С к сожалению так и не появился встроенный метод Delay, поэтому проц грузится большую часть времени впустую в данном условии цикла "ТекущаяДата() < ВремяЗавершения"
15. serverstar 69 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 3426 09.01.20 07:56 Сейчас в теме
Меня смущает вот эта строка:
ПараметрыЗадания.Вставить("ИмяОбработки", РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла);

Передается путь и имя файла на клиенте, а выполняться серверный код будет на сервере и файл не найдет.
MaxTolya; maksa2005; +2 Ответить
11. 1sig 253 09.01.20 09:29 Сейчас в теме
(10) для серверной базы верное замечание! но как вариант, расшарить на машине-сервере, где крутится сервер 1С, общедоступную сетевую папку, поместить файл внешней обработки туда и запускать с нее - найдет файл, проверено :)
12. Xershi 1262 13.01.20 21:00 Сейчас в теме
(10) ну код кривой у автора что поделать. Я давно использую в своих наработках такой подход.
Единственный момент в старых бсп 2.3 процент без допила не выводится.
serverstar; +1 Ответить
16. serverstar 69 14.09.21 18:22 Сейчас в теме
13. maksa2005 556 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 253 14.08.20 18:54 Сейчас в теме
(13)
запускайте обработку с общедоступной сетевой папки,
PowerBoy в (10) сообщении написал, в чем причина такой ошибки.
17. zels 175 13.06.22 08:49 Сейчас в теме
Как вывести "палку" индикатора?
18. triviumfan 98 18.08.22 11:41 Сейчас в теме
Нерабочая, как пример не подойдёт.
19. 1sig 253 18.08.22 13:19 Сейчас в теме
(18) обработка рабочая, на какой конфигурации запускаете?
20. triviumfan 98 18.08.22 14:26 Сейчас в теме
(19) Нету передачи обработки на сервер, это решение лишь для файловой базы, которая по сути нигде не используется.
Пришлось самому пилить.
21. 1sig 253 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 253 28.04.23 09:31 Сейчас в теме
(24) подстава :) спасибо за найденную очепятку, исправлено
26. gosizo 38 03.05.23 16:58 Сейчас в теме
Все хорошо, только если обработку прикрепить в справочнике дополнительные отчеты и обработки, то вываливается ошибка
https://ibb.co/LNDTyGP

Как можно исправить?
29. 1sig 253 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 Сейчас в теме
Оставьте свое сообщение