УФ как сделать прогресс-бар
Есть обработка, которая может выполняться несколько часов. Попросили добавить на форму ПолеИндикатора (прогресс бар) для визуального отображения сколько уже сделано и вообще не повисла ли программа. УФ. Код обработки выполняется в модуле формы. Компиляция &НаСервере. Если делать то же самое на клиенте индикатор плавно ползет «в реальном времени». Все ок. А у меня получается так.Запускаешь обработку. 0 процентов выполнено. Зависон на время цикла. 100 выполнено.
Вопрос. Умные и талантливые, скажите можно ли добиться «плавности хода))» Возможно я не то что-то делаю
Ниже добавлю код в отдельном сообщении для читаемости
(2) я об этом думал, но у меня все на сервере. С клиента не получается. У меня цикл на сервере. Можно конечно еще один на клиенте конечно сделать, но это уже будет грубо.
(3) спасибо за комментарий
(4) овчинка выделки не стоит
можно каждые хх итераций на сервере сохранять прогресс во временное хранилище, возвращаться на клиента, обновлять индикатор, и уходить обратно на сервер. типа так:
В идеале, конечно, фоновым заданием, обработкой ожидания и, например, получитьСообщенияПользователя, но это уже без изменения конфигурации нельзя сделать.
(32) Блин, вот ты делал? Понятно, что не делал, разуй свои глаза и перечитай (30), для тебя выделю:
«Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания.»
Не будут доступны понимаешь?
Отображение прогресса длительных операций в 8.3.10 (и более ранних версиях)
При разработке прикладного решения большую роль играет функциональность. Но для достижения коммерческого успеха не менее важна дружелюбность интерфейса или эргономичность. И в этой статье мы осветим важный момент эргономики – информирование пользователя о ходе длительного процесса.
Данный материал будет полезен и начинающим программистам 1С, и тем, кто хочет сделать свои разработки удобнее для пользователей. Кроме того, рассмотрим некоторые новшества платформы 8.3.10.
Начнём с того, что условимся о некоторых ограничениях:
В статье последовательно будет рассмотрено: как было в обычных формах, что случилось с приходом управляемых форм и какие сюрпризы нам преподнесла платформа 8.3.10.
Итак, давайте приступим.
Думаю, никого не требуется убеждать, что информирование о ходе выполнения длительного процесса в программе очень важно. Каждый пользователь может привести примеры, когда смотришь в экран и думаешь – «перезагружать не надо ждать» (пишите в комментариях – где вы предпочитаете ставить запятую).
И платформа «1С:Предприятие 8» в этом не исключение – в ней для отображения хода процесса имеется специальный элемент обычных форм «Индикатор» (или вид поля управляемой формы «Поле индикатора»). Давайте рассмотрим нюансы его использования.
Обычные формы
Придумать что-то проще, чем вывод индикатора выполнения процесса в обычных формах – сложная задача. А всё это благодаря тому, что в режиме толстого клиента в «1С:Предприятие 8» по умолчанию отсутствуют границы между клиентской частью и серверной частью. То есть выполнение программного кода и интерфейсных методов происходит, как правило, в одном контексте. Поэтому у разработчика не возникает необходимости задумываться о доступности необходимых свойств, процедур и функций.
Схематично работу «1С:Предприятие» в толстом клиенте можно представить следующим образом:
В обычном режиме клиентский сеанс открывает постоянное соединение с базой данных, а выполнение программного кода на встроенном языке преимущественно происходит на стороне клиента.
В связи с этим в любой строчке кода, описывающего длительный процесс, можно оценить объем обработанных данных, получить процент его выполнения и поместить полученное значение в реквизит формы, связанный с выведенным на форму элементом «Индикатор». В этот момент пользователь увидит графическое изменение отображения полосы индикатора в интерфейсе – опять же, благодаря тому, что всё действие происходит на клиенте.
Самый простой «длительный процесс» с выводом процента выполнения в обычном режиме может выглядеть следующим образом:
Как говорится – «проще не придумаешь». Никакого «лишнего» кода, всё максимально прозрачно, понятно и самое главное – работает!
На этом моменте кто-то из читателей ностальгично вздохнёт, так как мы переходим к следующей части статьи – к управляемым формам.
Управляемые формы
С приходом платформы 8.2 и управляемых форм ситуация с индикатором в корне изменилась. Но дело совсем не в версии платформы и не в новых формах, а в появлении новых видов клиентов для «1С:Предприятие» – тонкого и web-клиента. Схематично работу в управляемом режиме можно представить в следующем виде:
Если провести сравнение с обычным режимом, то сразу бросаются следующие отличия:
Есть ещё один важный, но не отображённый на схеме нюанс – серверный вызов, посредством которого происходит взаимодействие клиентской части и серверной. Он может быть инициирован только клиентом. А это значит, что со стороны сервера отправить данные на сторону клиента можно только в том случае, если с соответствующего клиентского сеанса пришёл запрос.
Как всё это повлияло на использование индикатора для отображения информации о ходе выполнения длительного процесса? Давайте подробно в этом разберёмся.
Обычно длительный процесс заключается в сложной обработке данных. Будь то групповое проведение документов, проведение сложных расчётов или выборка данных и заполнение ими отчётной формы.
Получается, что в том или ином виде всегда требуется доступ к базе данных и/или выполнение методов, доступных только на стороне сервера. Для этого на него необходимо передать управление.
Во время выполнения серверного вызова клиентская часть 1С становится неактивной и блокируется для дальнейшей работы до тех пор, пока вызов не завершится и управление не вернётся на сторону клиента. Поэтому, даже если во время выполнения процедуры на сервере производить изменение значения реквизита, отвечающего за данные индикатора, то на клиент вернётся только финальная величина.
Получается, что если взять код из предыдущего примера и просто разбить его на клиентскую и серверную часть, то получим долгое подвисание приложения, после чего индикатор резко установится в значение «100%».
При таком использовании индикатора от него пользы никакой нет. Поэтому разработчики идут на различные хитрости – выполняют длительные процессы «порционно» с отображением на полосе индикатора значений относительно «порций»; используют динамическое уменьшение скорости движения индикатора в зависимости от времени выполнения процесса; или придумывают другие варианты. Но ни один из них не имеет ничего общего с отображением выполнения конкретного процесса в режиме реального времени.
Именно поэтому при обновлении типовых конфигураций рядом с индикатором мы наблюдаем фразу примерно следующего содержания: «эта операция может занять длительное время – от нескольких минут до нескольких часов». И отчасти поэтому при формировании отчётов крутятся «безликие» круги-индикаторы, которые в виде простой анимации указывают на то, что программа вовсе не зависла.
Не знаю, как на счет настроения, но понимания о планируемом времени окончания выполнения процесса этот котёнок точно не прибавляет.
Один из вариантов вывода индикатора для отображения хода выполнения длительного процесса заключается в следующем:
Программный код будет состоять из двух частей: из кода интерфейсной части (в нашем случае – обработки) и кода общего модуля. Модуль формы обработки будет выглядеть примерно так:
А общий модуль будет содержать процедуру для запуска в фоновом режиме:
Для тех, кто захочет проверить работоспособность данного примера, дополнительно приведём скриншот формы обработки:
Несмотря на то, что индикатор будет «живым», сказать, что эффект достигнут и пример рабочий, на сто процентов нельзя. Потому что между реальным состоянием выполнения процесса и интерфейсом пользователя есть аж целых две «прослойки» – временное хранилище и обработчик ожидания. При таком подходе мало того, что отображение идёт не в режиме реального времени, так ещё и возрастает возможность возникновения различного вида сбоев из-за использования промежуточных звеньев.
Подводя итог получаем, что для «правильной» работы индикатора в управляемых формах (то есть, как в обычном режиме – с привязкой к выполнению процесса в реальном времени) не хватает возможности инициировать сервером отправку данных на сторону клиентской части. И тут наступает самое время поговорить про сюрприз, который фирма «1С» преподнесла разработчикам в новой платформе «8.3.10».
Платформа «8.3.10»
На самом деле в платформе «1С:Предприятие 8.3.10» касательно индикатора ровным счётом ничего не изменилось. Там есть много других интересных «фишек». Например, система взаимодействий, инкрементальная выгрузка конфигурации в XML, новые режимы основного окна. Но всё это не относится к теме данной статьи. Поэтому, можно было бы уже закончить писать… Если бы не наши «пытливые умы».
Давайте чуть-чуть пристальнее взглянем на систему взаимодействий. Для этого возьмём описание с одного из сайтов фирмы «1С»:
Теперь посмотрим на определение протокола WebSocket на сайте Википедии:
Обратите внимание на ключевые слова: двухсторонняя связь между клиентом и сервером в режиме реального времени! То, чего так не хватало для нормального функционирования индикатора в управляемых формах! Давайте для лучшего понимания взглянем на схему работы «1С:Предприятие» и системы взаимодействий:
Остаётся вопрос: можно ли использовать систему взаимодействий для вывода хода выполнения процесса в индикатора? Ответ – можно конечно, но… Давайте сначала рассмотрим возможность информирования пользователя о ходе выполнения длительного процесса при помощи только системы взаимодействия.
Для этого нам потребуется длительный процесс, выполняемый в фоне:
Который мы дополним программным кодом работы с системой взаимодействия, достаточным для информирования пользователя о ходе выполнения процедуры в виде оповещений. Для этого нам будет необходимо немного изменить процедуру обработки фонового задания в общем модуле:
Если изучить программный код, то будет понятно – в момент старта фонового задания создаётся «Обсуждение», в котором будет выводится информация о ходе процесса. А при выполнении длительного процесса в «Обсуждение» выводятся сообщения с указанием процента выполнения. Каков будет результат и где его искать – видно на следующем рисунке:
Таким образом, у пользователя будет возможность увидеть процент выполнения фонового задания в режиме реального времени. Если он знает, куда смотреть.
С точки зрения эргономики данный вариант проигрывает выводу информации в виде индикатора на самой форме обработки. Поэтому при желании к описанному механизму можно «прикрутить» и индикатор. Но! Пока это возможно сделать только при помощи подключенного обработчика ожидания, который инициирует серверный вызов для анализа полученных сообщений и вывода данных в индикатор.
Конечно, это очередное использование промежуточного звена, неоправданные серверные вызовы и как следствие – запоздание отображения от режима реального времени.
Связано это с тем, что некоторые методы работы с системой взаимодействия не доступны на клиенте. Но это будет меняться, и разработчики платформы «1С:Предприятие» уже анонсировали, что в версии 8.3.11 на основе системы взаимодействий появится возможность инициирования сервером передачи информации на сторону клиента!
Вместо заключения
В настоящее время эргономика инструмента играет большую роль в дальнейшей его судьбе – будет оно активно использоваться/применяться или его отложат/выкинут.
И если раньше достаточно было показать пользователю куда/какие вводить данные в программе и где/какой он от этого будет видеть результат, то сейчас важно – удобно ли эти данные вносить и как быстро можно получить обратную связь.
Скорость реакции программы на действия пользователя тоже выходит на первый план. Даже минимальное ожидание отклика начинает вызывать раздражение, а задержка в обратной связи, длящаяся даже всего несколько секунд, может стать поводом к аварийному завершению работы приложения.
Поэтому при разработке конфигураций необходимо обращать внимание на программный код, выполнение которого может занять продолжительное время. И предусматривать механизмы оповещения пользователя о том, что программа выполняет процесс, а не зависла.
Конечно, не всегда представляется возможным в начале длительной операции предвидеть объем обрабатываемых данных или время выполнения операции. В этих случаях использование индикатора не будет давать пользователю достоверной информации о ходе процесса и его использование становится нецелесообразным. Поэтому порой приходится выкручиваться различными способами, чтобы работа в программе вызывала меньше негативных эмоций – использовать анимированные кольца или милых котят.
Но если есть возможность получить привязку выполнения процесса к реальному времени, то это нужно делать и выводить пользователю эту полезную информацию. Согласитесь – ведь приятно иметь возможность прогнозировать “успею ли я сходить налить себе кофе, пока этот отчёт формируется”?
Если вас заинтересовала система взаимодействий, и вы хотели бы попробовать с ней поработать, но не знаете, что это такое и с чего начать – читайте следующую статью Система взаимодействий в платформе 8.3.10.
А пока – пишите в комментариях истории из своего опыта по работе с индикаторами!
Об авторе
Автор статьи – Павел Ванин
Прогресс бар 8.2 (УТ 11 без изменения конфигурации, для SQL)
1. Код модуля формы внешней обработки
//Обнуляем прогресс бар, запускаем фоновую процедуру на сервере, подключаем обработчик ожидания
&НаКлиенте
Процедура НачатьИндикацию ( Команда )
//Получаем сообщения от фонового задания и прогресс операции. Если операция закончилась отключаем обработчик ожидания.
&НаКлиенте
Процедура ОбработчикОжидания ()
Если Прогресс = 100 Тогда
ОтключитьОбработчикОжидания ( «ОбработчикОжидания» );
КонецЕсли;
2. Код модуля объекта внешней обработки
Функция СведенияОВнешнейОбработке () Экспорт
Версия = «0.0.1» ;
// Объявим переменную, в которой мы сохраним и вернем «наружу» необходимые данные
ПараметрыРегистрации = Новый Структура ;
// Объявим еще одну переменную, которая нам потребуется ниже
МассивНазначений = Новый Массив ;
// Создадим таблицу команд (подробнее смотрим ниже)
ТаблицаКоманд = ПолучитьТаблицуКоманд ();
// Теперь вернем системе наши параметры
Возврат ПараметрыРегистрации ;
// Создадим пустую таблицу команд и колонки в ней
Команды = Новый ТаблицаЗначений ;
// Пощитаем коэффициенты и сделаем соответствие чтобы знать когда обновлять прогресс.
Процедура ВыполнитьКоманду ( Параметры ) Экспорт
ТочкиОбновления = Новый Соответствие ;
Для i = 1 По Обновлений Цикл ТочкиОбновления [ i * Коэф ] = Цел ( i * КоэфОбн ); КонецЦикла;
Индикатор выполнения (прогресс-бар) с таймером остаточного времени выполнения (обычное приложение + УФ)
Данная обработка включает в себя код обработки заполнения Индикатора (ПрогрессБара) с выводом в строку состояния информации по оставшемуся времени. Удобно использовать как в циклах, так и в примерно однотипных операциях.
Протестировано на платформе 1С Предприятие 8.3.9.2170.
Скачать файлы
Специальные предложения
Автор запретил комментарии
Обновление 08.10.19 12:28
См. также
Шпаргалка разработчика для работы с формами Промо
Сборник помогает быстро освоить встроенный язык и средства конфигурирования при разработке обычных и управляемых форм.
31.10.2018 18478 87 ELAM 3
K-SOFT: Улучшенная форма отчета
Если вы любитель добавлять много отборов на форму отчета, и вас раздражает, что отборы занимают большую часть отчета, и их никак не убрать, то вам сюда. Простая доработка, что позволит скрыть отборы на время анализа отчета.
19.05.2021 6185 6 karpik666 18
1С Специалист ЗУП 3
Решение билетов по 1С Специалист ЗУП 3. Решения подготовлены на Зарплата и Управление Персоналом 3.1.12.144
16.04.2020 4699 25 MoiseevSN 11
Отображение времени в документах и списках
Расширение предназначено для отображения времени документов в списках и журналах, а также для ручного редактирования времени в открытых формах.
10.03.2020 3681 1 Nuuq 4
Каталог игр с приставок из моего детства Промо
Каталог игр Dendy, Sega, Nintendo из нашего детства.
06.02.2018 17444 70 user621724_Dimav1979 37
СКД: красивые надписи в заголовках колонок
Необходимо немного исправить вывод надписей в заголовках колонок, сделать более читаемый вариант. Как это сделать?
27.02.2020 13171 8 wowik 36
Самое полное решение задач для подготовки к Специалисту по ЗУП 3.1
Недавно успешно сдал экзамен на специалиста по ЗУП и делюсь материалами для подготовки.
20.02.2020 14780 116 Axel_F 19
Прорыв и провал 3D графики в 1С
Здравствуйте, уважаемые. Эта статья опоздала, хотя я спешил как мог. В любом случае, речь тут пойдет про WebGL и технологии работы с 3D в 1C. Сразу оговорюсь, что всё это работало до последнего времени и на тонком, толстом, вэб клиентах, платформах 8.3 и на 8.2. Единственное, что изменило ситуацию, это WebKit, внедренный в 1С начиная с релиза 8.3.14.1565.
11.02.2020 9733 14 dinopopyys 29
Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула Промо
Расширяем функционал вывода нижнего / верхнего колонтитула. Стандартно 1С имеет достаточно ограничений по выводу и наполнению колонтитулов содержимым, взять хотя бы такие, как вывод только текста и отсутствие ограничения на номер конечной страницы. А при разработке кода сталкиваешься с тем, что свой блок с нижним колонтитулом нужно прижимать к низу страницы. Казалось бы быстро решаемый вопрос, но и в нем есть нюансы. Сейчас я расскажу о том, как решалась эта задача. UPD 15.02.2018. Добавлен вывод верхнего колонтитула; Вывод колонтитулов на первой и последней странице управляется параметрами; Научился считать страницы: Добавлено заполнение переменных аналогичных стандартным из колонтитулов; Задаются форматы даты и времени. Ограничения прежние: 1. Повторно сформировать табличный документ после смены параметров страницы интерактивно.; 2. Передавать данные для более плотной печати как можно более мелко нарезанными кусками.
29.12.2017 54434 38 agent00mouse 0
Индикация прогресса выполнения фонового задания на управляемой форме внешней обработки
1Сиг Быстрее секунды (1sig)
Развитие функциональности БСП поражает, то что раньше приходилось реализовывать через «костыли», теперь можно сделать парой строк кода, используя штатные механизмы БСП. Данная внешняя обработка использует пару процедур общих модулей «Длительные операции«, входящих в состав БСП.
На данную тему написано много хороших статей, есть обзорные, например в данной статье хорошо расписана теория. Хороший обзор по практике различных методик фонового выполнения кода во внешних обработках написан здесь.
Отличие данной обработки от других в том, что максимально упрощен код, использующий механизмы БСП для индикации процесса выполнения длительного процесса, и это все реализовано на внешней обработке, которую не нужно встраивать в справочник «Дополнительные отчеты и обработки». Отладку можно производить прям в самом теле обработки, предварительно прописав параметр «РежимОтладки» (раздел «Отладка длительных операций»).
Обработка может служить шаблоном-заготовкой для быстрого создания варианта внешней обработки с индикацией статуса выполнения длительной операции. Показан пример передачи параметров выполнения фонового задания, с выводом информации о текущем статусе выполнения
и получения результатов выполнения фонового задания на клиент