Для отображения индикатора в управляемой форме самый распространенный способ (ИМХО) такой-
запуск фонового задания ( или без него 🙂 ), которое помещает данные во временное хранилище , а на клиенте запуск обработчика ожидания , которое читает это значение и отображает индикатор.
Платформа 1С развивается, появилась система взаимодействия Ссылка на Зазеркалье.
В версии 8.3.11
Реализована возможность отправлять сообщения со стороны сервера «1С:Предприятия» на сторону клиентского приложения. Передача сообщений использует в качестве транспорта настроенную систему взаимодействия. Ссылка на источник
Я развернул у себя сервер взаимодействия и реализовал вывод индикатора с помощью этого нового функционала сервера взаимодействия.
Идея такая:
- Создается служебное обсуждение
- Создается подписка на новые сообщения в этом обсуждении — эта обработка и будет отображать индикатор на стороне клиента
- На сервере выполняется обработка , которая создает сообщения в служебном обсуждении . Новые сообщения обрабатываются подпиской
Это все, что нужно.
В прилагаемой обработке — реализация этой идеи.
Форма обработки выглядит так:
Кнопка "Информирование клиента " запускает код, в котором происходит
- поиск служебного обсуждения
- подключение обработчика новых сообщений этого служебного сообщения
- запуск выполнения на сервере — где формируются новые сообщения для обработчика. Ниже текст процедуры
&НаКлиенте Процедура ИнформированиеКлиента(Команда) ИдентификаторОбсуждения=ПолучитьСлужебноеСообщение(); //Получаю идентификатор служебного сообщения Если ИдентификаторОбсуждения<>Неопределено Тогда Попытка ОповещениеКлиента=Новый ОписаниеОповещения("ОбработкаСообщенийССервера",ЭтотОбъект); //Эта обработка будет отображать индикатор на клиенте СистемаВзаимодействия.НачатьПодключениеОбработчикаНовыхСообщений(, ИдентификаторОбсуждения, ОповещениеКлиента); //Здесь я подключаю обработчик новых сообщений, получаемых от сервера взаимодействия Элементы.ЗначениеИндикатора.Видимость=Истина; //Включаю видимость индикатора ВызовПроцедурыНаСервере(ИдентификаторОбсуждения); //Ухожу на сервер Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Иначе Сообщить("Идентификтор обсуждения на клиенте не определен"); КонецЕсли; КонецПроцедуры
Ниже текст процедуры , которая выполняется на сервере — в процедуре создаются сообщения служебного обсуждения
&НаСервере Процедура ВызовПроцедурыНаСервере(ИдентификаторОбсуждения) Если ИдентификаторОбсуждения<>Неопределено Тогда Для шаг=1 по 100 цикл пСообщение=СистемаВзаимодействия.СоздатьСообщение(ИдентификаторОбсуждения); пСообщение.Текст = шаг; пСообщение.Данные = шаг; пСообщение.Записать(); КонецЦикла; Иначе Сообщить("Идентификтор сообщения не определен"); КонецЕсли; КонецПроцедуры
Созданные на сервере сообщения отображаются на клиенте процедурой , текст которой ниже
&НаКлиенте Процедура ОбработкаСообщенийССервера(Сообщение,ДополнительныеПараметры) Экспорт Обработано=Число(Сообщение.Данные); ОбщееКоличество=100; ЗначениеИндикатора=Цел(Обработано/ОбщееКоличество*100); Элементы.ЗначениеИндикатора.Заголовок="Обработка данных ( "+Строка(Обработано)+" из "+ Строка(ОбщееКоличество)+" )" КонецПроцедуры
Логотип взят отсюда
Забавная идея, понравилась, но имхо костыль))
А зачем было брать логотип у Курсов1С?)
Костыль или нет- посмотрим как эта система будет развиваться.
Пока я заметил там несколько ошибок — удивительно было видеть счетчик равный 500 в цикле до 100 🙁
Никакой другой рисунок не нашел, поэтому взял у Курсов.
Ну идея-то была очевидна с момента, ещё как опубликовали в Зазеркалье анонс этого «взаимодействия». Подозреваю, сама 1С вскоре озаботится нормальными прогресс-барами, их за это шпыняют постоянно)
Как обычно, через Ж. Но это упрек не автору, автору плюс.
(3) отображение индикатора выбрано из-за его наглядности
(5) Понимаю. Оно напрашивалось, сам бы делал так же) А вообще bulpi прав, идейно это всё страхолюдно выглядит…
(6) у меня другое мнение про идею :).
Когда у вас есть развернутый сервер взаимодействия, то его можно использовать для возврата с сервера — я написал про это.
(4) есть идея на эту тему ?
(3) В УНФ уже давно видел закомментированный код, реализующий работу прогресс-баров через систему взаимодействия. Кажется еще до релиза 8.3.11 было.
(9) Интересно, кинете код? Потому что возможность с сообщениями на сервере появилась в 8.3.11 — я привожу цитату в статье.
Видимо, по другому реализовали, раз до 8.3.11
(10) Код искать точно не буду. Тут либо поверьте на слово, либо нет 🙂
https://its.1c.ru/db/v8310doc#bookmark:dev:TI000001900
Но возможность использовать систему взаимодействия была в 8.3.10.
Другие дело, что на тот момент её нельзя было развернуть у себя. Только сервер 1cDialog.com
(11) Возможность использования есть в 8.3.10. Интересно узнать как было реализовано без сообщений — вопрос про это
(12) Как я уже говорил, код был закомментирован. То есть не работал. Детали я не помню.
Очевидно, что принципиально другой реализации тут быть не может. Пушем с сервера приходит информация о прогрессе.. все так же, как в других языках/платформах.
(13) Хор
Переделал для наглядности себе на 2 обработки: клиент и сервер (чтобы ещё и все пользователи могли сообщение увидеть).
А то пример не совсем информативный — цикл то крутится тут же и не даёт пользоваться программой до окончания цикла — так оно и сейчас может ))).
—
Плюс есть ошибка небольшая в начале работы.
У меня база была не зарегистрирована — но открыть обработку дало.
Я не закрывая зарегил и при попытке нажатия кнопки получил ошибку.
(1) В чем именно вы увидели костыль?
(13) В платформах 8.3.10 — 8.3.11 насколько я помню ещё не было возможности подписываться на оповещение о новых сообщениях.