Для отображения индикатора в управляемой форме самый распространенный способ (ИМХО) такой-
запуск фонового задания ( или без него :) ), которое помещает данные во временное хранилище , а на клиенте запуск обработчика ожидания , которое читает это значение и отображает индикатор.
Платформа 1С развивается, появилась система взаимодействия Ссылка на Зазеркалье.
В версии 8.3.11
Реализована возможность отправлять сообщения со стороны сервера «1С:Предприятия» на сторону клиентского приложения. Передача сообщений использует в качестве транспорта настроенную систему взаимодействия. Ссылка на источник
Я развернул у себя сервер взаимодействия и реализовал вывод индикатора с помощью этого нового функционала сервера взаимодействия.
Идея такая:
- Создается служебное обсуждение
- Создается подписка на новые сообщения в этом обсуждении - эта обработка и будет отображать индикатор на стороне клиента
- На сервере выполняется обработка , которая создает сообщения в служебном обсуждении . Новые сообщения обрабатываются подпиской
Это все, что нужно.
В прилагаемой обработке - реализация этой идеи.
Форма обработки выглядит так:
Кнопка "Информирование клиента " запускает код, в котором происходит
- поиск служебного обсуждения
- подключение обработчика новых сообщений этого служебного сообщения
- запуск выполнения на сервере - где формируются новые сообщения для обработчика. Ниже текст процедуры
&НаКлиенте Процедура ИнформированиеКлиента(Команда) ИдентификаторОбсуждения=ПолучитьСлужебноеСообщение(); //Получаю идентификатор служебного сообщения Если ИдентификаторОбсуждения<>Неопределено Тогда Попытка ОповещениеКлиента=Новый ОписаниеОповещения("ОбработкаСообщенийССервера",ЭтотОбъект); //Эта обработка будет отображать индикатор на клиенте СистемаВзаимодействия.НачатьПодключениеОбработчикаНовыхСообщений(, ИдентификаторОбсуждения, ОповещениеКлиента); //Здесь я подключаю обработчик новых сообщений, получаемых от сервера взаимодействия Элементы.ЗначениеИндикатора.Видимость=Истина; //Включаю видимость индикатора ВызовПроцедурыНаСервере(ИдентификаторОбсуждения); //Ухожу на сервер Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Иначе Сообщить("Идентификтор обсуждения на клиенте не определен"); КонецЕсли; КонецПроцедуры
Ниже текст процедуры , которая выполняется на сервере - в процедуре создаются сообщения служебного обсуждения
&НаСервере Процедура ВызовПроцедурыНаСервере(ИдентификаторОбсуждения) Если ИдентификаторОбсуждения<>Неопределено Тогда Для шаг=1 по 100 цикл пСообщение=СистемаВзаимодействия.СоздатьСообщение(ИдентификаторОбсуждения); пСообщение.Текст = шаг; пСообщение.Данные = шаг; пСообщение.Записать(); КонецЦикла; Иначе Сообщить("Идентификтор сообщения не определен"); КонецЕсли; КонецПроцедуры
Созданные на сервере сообщения отображаются на клиенте процедурой , текст которой ниже
&НаКлиенте Процедура ОбработкаСообщенийССервера(Сообщение,ДополнительныеПараметры) Экспорт Обработано=Число(Сообщение.Данные); ОбщееКоличество=100; ЗначениеИндикатора=Цел(Обработано/ОбщееКоличество*100); Элементы.ЗначениеИндикатора.Заголовок="Обработка данных ( "+Строка(Обработано)+" из "+ Строка(ОбщееКоличество)+" )" КонецПроцедуры
Логотип взят отсюда