индикатор 1с обычные формы
Отображение прогресса длительных операций в 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.
А пока – пишите в комментариях истории из своего опыта по работе с индикаторами!
Об авторе
Автор статьи – Павел Ванин
УФ как сделать прогресс-бар
Есть обработка, которая может выполняться несколько часов. Попросили добавить на форму ПолеИндикатора (прогресс бар) для визуального отображения сколько уже сделано и вообще не повисла ли программа. УФ. Код обработки выполняется в модуле формы. Компиляция &НаСервере. Если делать то же самое на клиенте индикатор плавно ползет «в реальном времени». Все ок. А у меня получается так.Запускаешь обработку. 0 процентов выполнено. Зависон на время цикла. 100 выполнено.
Вопрос. Умные и талантливые, скажите можно ли добиться «плавности хода))» Возможно я не то что-то делаю
Ниже добавлю код в отдельном сообщении для читаемости
(2) я об этом думал, но у меня все на сервере. С клиента не получается. У меня цикл на сервере. Можно конечно еще один на клиенте конечно сделать, но это уже будет грубо.
(3) спасибо за комментарий
(4) овчинка выделки не стоит
можно каждые хх итераций на сервере сохранять прогресс во временное хранилище, возвращаться на клиента, обновлять индикатор, и уходить обратно на сервер. типа так:
В идеале, конечно, фоновым заданием, обработкой ожидания и, например, получитьСообщенияПользователя, но это уже без изменения конфигурации нельзя сделать.
(32) Блин, вот ты делал? Понятно, что не делал, разуй свои глаза и перечитай (30), для тебя выделю:
«Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания.»
Не будут доступны понимаешь?
Ваш браузер устарел, пожалуйста обновите ваш браузер пройдя по ссылке www.microsoft.com/download
Предисловие
Началось с того, что нужно было написать внешнюю обработку для загрузки документов в информационную базу на управляемых формах 1С 8.3. Конфигурация типовая без возможности изменения. Поскольку с запуском процедур из модуля внешней обработки в фоновом режиме не так всё просто, пришлось изобретать способ индикации пользователю процента выполнения операций.
Как это работает у меня
Реализовал два варианта.
Первый работает в командном окне Windows. По сути это командный файл, который в процессе работы добавляет строки в консоль. Не очень красиво. Зато просто и работает везде. В архиве это файл progress.cmd.
Описание
В локальной сети имеем общую сетевую папку с правами на чтение и запись как со стороны Клиента, так и со стороны Сервера. Туда кладём нашу внешнюю программу индикации (progress.cmd или ProgressBar.jar, или оба варианта). Там же будут создаваться временные файлы. Сервер будет создавать файлы и писать в них. Программа с клиентской машины будет читать файлы и затем удалять их.
На клиенте, перед запуском длительной операции, генерируется уникальное имя файла для передачи его на Сервер и в нашу программку. После этого на Клиенте запускается внешнее приложение для индикации, куда в качестве параметра передаётся это имя файла. И уже после этого вызывается серверная процедура, с именем файла в параметрах.
Клиент 1С, скажем так, «подвисает», ожидая завершения операции. Но наша программулина работает и отображается поверх окна 1С.
Код на Клиенте:
ПутьКJava должен содержать что-то вроде «c:\Program Files\Java\jdk1.8.0_211\bin\javaw.exe». Это куда установлен JRE на клиентской машине.
Код на Сервере
На Сервере создаётся временный файл в кодировке DOS (OEM).
По мере работы процедуры в ПЕРВУЮ строку файла будем писать текущий процент выполнения в виде: 25,0%. Здесь важно поставить знак процента после числа, а перед числом ничего не должно быть, т.е. оно стоит вначале строки. Также можно записывать некоторые короткие информационные сообщения в одну строку.
Когда Сервер завершит все свои дела, во временный файл записываем служебное слово «stop». Это будет сигналом к закрытию программы индикации.
Что делает программа индикации. Она через каждые 5 секунд читает временный файл и выводит то, что содержится в первой строке. Вариант с Java при этом преобразовывает считанное в число и показывает прогресс-бар. Как только программа встречает «stop», удаляет временный файл и закрывается.
Надо добавить ещё вот что. Пользователь может раньше времени закрыть программу индикации. Тогда временный файл не будет удалён. Поэтому на Клиенте надо по завершении проверить, не осталось ли чего, и удалить мусор.
Индикатор выполнения (прогресс-бар) с таймером остаточного времени выполнения (обычное приложение + УФ)
Данная обработка включает в себя код обработки заполнения Индикатора (ПрогрессБара) с выводом в строку состояния информации по оставшемуся времени. Удобно использовать как в циклах, так и в примерно однотипных операциях.
Протестировано на платформе 1С Предприятие 8.3.9.2170.
Скачать файлы
Специальные предложения
Автор запретил комментарии
Обновление 08.10.19 12:28
См. также
Шпаргалка разработчика для работы с формами Промо
Сборник помогает быстро освоить встроенный язык и средства конфигурирования при разработке обычных и управляемых форм.
31.10.2018 18713 87 ELAM 3
K-SOFT: Улучшенная форма отчета
Если вы любитель добавлять много отборов на форму отчета, и вас раздражает, что отборы занимают большую часть отчета, и их никак не убрать, то вам сюда. Простая доработка, что позволит скрыть отборы на время анализа отчета.
19.05.2021 6466 6 karpik666 18
1С Специалист ЗУП 3
Решение билетов по 1С Специалист ЗУП 3. Решения подготовлены на Зарплата и Управление Персоналом 3.1.12.144
16.04.2020 4943 25 MoiseevSN 11
СКД: красивые надписи в заголовках колонок
Необходимо немного исправить вывод надписей в заголовках колонок, сделать более читаемый вариант. Как это сделать?
27.02.2020 13473 9 wowik 36
Каталог игр с приставок из моего детства Промо
Каталог игр Dendy, Sega, Nintendo из нашего детства.
06.02.2018 18701 74 user621724_Dimav1979 37
Самое полное решение задач для подготовки к Специалисту по ЗУП 3.1
Недавно успешно сдал экзамен на специалиста по ЗУП и делюсь материалами для подготовки.
20.02.2020 15139 117 Axel_F 19
Прорыв и провал 3D графики в 1С
Здравствуйте, уважаемые. Эта статья опоздала, хотя я спешил как мог. В любом случае, речь тут пойдет про WebGL и технологии работы с 3D в 1C. Сразу оговорюсь, что всё это работало до последнего времени и на тонком, толстом, вэб клиентах, платформах 8.3 и на 8.2. Единственное, что изменило ситуацию, это WebKit, внедренный в 1С начиная с релиза 8.3.14.1565.
11.02.2020 10013 14 dinopopyys 29
Скромный вклад в юзабилити
Оптимизация рутинных действий. Вызов отчетов по Партнеру и Номенклатуре сразу из документа. Выбор объекта для журнала регистрации из открытых окон.
11.02.2020 5360 6 andryandry 0
Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула Промо
Расширяем функционал вывода нижнего / верхнего колонтитула. Стандартно 1С имеет достаточно ограничений по выводу и наполнению колонтитулов содержимым, взять хотя бы такие, как вывод только текста и отсутствие ограничения на номер конечной страницы. А при разработке кода сталкиваешься с тем, что свой блок с нижним колонтитулом нужно прижимать к низу страницы. Казалось бы быстро решаемый вопрос, но и в нем есть нюансы. Сейчас я расскажу о том, как решалась эта задача. UPD 15.02.2018. Добавлен вывод верхнего колонтитула; Вывод колонтитулов на первой и последней странице управляется параметрами; Научился считать страницы: Добавлено заполнение переменных аналогичных стандартным из колонтитулов; Задаются форматы даты и времени. Ограничения прежние: 1. Повторно сформировать табличный документ после смены параметров страницы интерактивно.; 2. Передавать данные для более плотной печати как можно более мелко нарезанными кусками.
29.12.2017 55192 38 agent00mouse 0
Как создать индикатор в 1С:Предприятии 7.7
Многим программистам прихходится сталкиваться с проблемой индикациии прогресса выполнения длительных процессов в 1С:Предприятии 7.7.
Каждый решает этот вопрос по-своему, ниже будет описание моего решения проблемы.
Индикатор на форме отображается с помощью элементов: рамка группы, текст. В элемент текст выводятся символы «|».
Как выводить символы, индицирующие процесс?
Рассмотрим пример. Пускай символов, индицирующих процесс, будет 3, а всего значение 7.
Скачать файлы
Специальные предложения
Обновление 27.09.16 08:35
Код открыт Не указано
См. также
Методы для группировки данных по полю,полям в Таблице Значений на примере универсального метода списания по партиям, а также отбора строк в ТЗ по произвольному условию. Для 8.x и 7.7 Промо
Я очень часто использую группировку данных по полю и полям, как в восьмерке, так и в семерке. Это аналог запроса Итоги, но там строится дерево, а в большинстве случаев нужны «плоские данные». Да и делать запрос в большинстве случаев более накладный процесс, чем работа с ТЗ. Все достоинства такого подхода приведены на примере метода универсального списания по париям, а так же отбора строк в ТЗ по произвольному условию. Для 7.7 еще отчеты сравнения двух ТЗ. Работая с различными базами для упрощения сравнения номенклатуры, или как аналог джойнов(join), сделал сравнение двух таблиц значений по нескольким полям. Пока группировки полей должны быть уникальны. Часто приходится искать дубли, для универсального поиска есть ДублиВТзПоПолю и пример в Тест.ert.
25.06.2015 32685 4 Serginio 1
Мышонок в лабиринте бегает за сыром (игрушка)
Краткая игра про мышонка на языке 1С.
24.05.2021 1693 1 user1479164 8
Выбор цвета для 1С 7.7
Простая и удобная внешняя обработка для выбора цвета без применения внешних компонент.
09.06.2020 3846 2 vap_pig 5
Диалоги выбора периода для 1С версий 8.3 и 7.7
Представлены два диалога для выбора интервала дат по календарю в составе демонстрационных конфигураций 1С8.3 и 1С7.7
24.01.2017 20814 18 romasna 7
Класс 1С++ для программного добавления изображений/текста/ШК в таблицу Промо
Необходимо добавить в сформированную таблицу изображения/текста/ШК (81 тип ШК) с прозрачным фоном? Вставить фирменный логотип? Быстро организовать оформление документов в корпоративном стиле? Данная разработка поможет в этом!
03.06.2012 246343 230 zarius 113
Полноценное использование Drag&Drop в 1С 7.7
19.09.2016 17051 15 DasIsFantastich 4
Пилотный проект ФСС. Заявление, реестр, опись, выгрузка в формате xml версия 1.7.2.
Типовые объекты конфигурации не изменены, поэтому подходит для любого релиза ЗиК.
29.07.2016 14167 21 Cvetic 1
Запуск php програм в 1С 7.7
15.09.2014 8987 7 kwadro 1
Сравнение и объединение диалогов форм МД файла Промо
Обработка анализирует диалоги форм двух мдшников и показывает изменения в них в удобоваримом виде. Авmop: Peуmoв Дмumpuй, e-mail: dimoff66@mail.ru, icq: 177067865 Автору огромное спасибо!
09.09.2008 29042 1287 WiseSnake 27
«Магический батон» или еще одна попытка сделать «волшебную кнопку»
21.08.2014 12839 7 SvSoft 4