Сервер-клиентский вызов

Программирование - Инструментарий

Система взаимодействия сервер- клиентский вызов отображение индикатора в управляемой форме

53
Передача управления с сервера на клиента с использованием системы взаимодействия. На примере отображения индикатора в управляемой форме.

Для отображения индикатора в управляемой форме самый распространенный способ (ИМХО) такой-

запуск фонового задания ( или без него :) ), которое помещает данные во временное хранилище , а на клиенте запуск обработчика ожидания , которое читает это значение и отображает индикатор.

 

Платформа 1С развивается, появилась система взаимодействия  Ссылка на Зазеркалье.

В версии 8.3.11

Реализована возможность отправлять сообщения со стороны сервера «1С:Предприятия» на сторону клиентского приложения. Передача сообщений использует в качестве транспорта настроенную систему взаимодействия.  Ссылка на источник

Я развернул у себя сервер взаимодействия и реализовал вывод индикатора с помощью этого нового функционала сервера взаимодействия.

 

Идея такая:

 

  • Создается служебное обсуждение
  • Создается подписка на новые сообщения в этом обсуждении - эта обработка и будет отображать индикатор на стороне клиента 
  • На сервере выполняется обработка , которая создает сообщения в служебном обсуждении . Новые сообщения обрабатываются подпиской

Это все, что нужно.

В прилагаемой обработке - реализация этой идеи.

 

Форма обработки выглядит так:

Кнопка "Информирование клиента " запускает код, в котором происходит

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

    Ниже текст процедуры , которая выполняется на сервере - в процедуре создаются сообщения служебного обсуждения

    &НаСервере
    Процедура ВызовПроцедурыНаСервере(ИдентификаторОбсуждения)
                
          Если ИдентификаторОбсуждения<>Неопределено Тогда
                            
             Для шаг=1 по 100 цикл
                                       
                 пСообщение=СистемаВзаимодействия.СоздатьСообщение(ИдентификаторОбсуждения);
                 пСообщение.Текст  = шаг;
                 пСообщение.Данные = шаг;
                 пСообщение.Записать();
                                   
             КонецЦикла;
                            
          Иначе
             Сообщить("Идентификтор сообщения не определен");
          КонецЕсли;      
                
    КонецПроцедуры
    

    Созданные на сервере сообщения отображаются на клиенте процедурой , текст которой ниже

    &НаКлиенте
    Процедура ОбработкаСообщенийССервера(Сообщение,ДополнительныеПараметры) Экспорт
                
                Обработано=Число(Сообщение.Данные);
                ОбщееКоличество=100;
                ЗначениеИндикатора=Цел(Обработано/ОбщееКоличество*100);
                
                Элементы.ЗначениеИндикатора.Заголовок="Обработка данных ( "+Строка(Обработано)+" из "+ Строка(ОбщееКоличество)+" )"
                
    КонецПроцедуры
    

     

 

Логотип взят отсюда 

53

Скачать файлы

Наименование Файл Версия Размер
Сервер- клиентский вызов:
.epf 7,12Kb
16.02.18
11
.epf 7,12Kb 11 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. rpgshnik 912 16.02.18 17:01 Сейчас в теме
Забавная идея, понравилась, но имхо костыль))

А зачем было брать логотип у Курсов1С?)
2. ВикторП 122 16.02.18 17:09 Сейчас в теме
Костыль или нет- посмотрим как эта система будет развиваться.
Пока я заметил там несколько ошибок - удивительно было видеть счетчик равный 500 в цикле до 100 :(

Никакой другой рисунок не нашел, поэтому взял у Курсов.
3. Yashazz 2316 17.02.18 13:17 Сейчас в теме
Ну идея-то была очевидна с момента, ещё как опубликовали в Зазеркалье анонс этого "взаимодействия". Подозреваю, сама 1С вскоре озаботится нормальными прогресс-барами, их за это шпыняют постоянно)
DrAku1a; rpgshnik; +2 Ответить
5. ВикторП 122 17.02.18 20:10 Сейчас в теме
(3) отображение индикатора выбрано из-за его наглядности
6. Yashazz 2316 17.02.18 22:56 Сейчас в теме
(5) Понимаю. Оно напрашивалось, сам бы делал так же) А вообще bulpi прав, идейно это всё страхолюдно выглядит...
7. ВикторП 122 18.02.18 08:29 Сейчас в теме
(6) у меня другое мнение про идею :).

Когда у вас есть развернутый сервер взаимодействия, то его можно использовать для возврата с сервера - я написал про это.
9. Infactum 268 19.02.18 08:46 Сейчас в теме
(3) В УНФ уже давно видел закомментированный код, реализующий работу прогресс-баров через систему взаимодействия. Кажется еще до релиза 8.3.11 было.
10. ВикторП 122 19.02.18 09:23 Сейчас в теме
(9) Интересно, кинете код? Потому что возможность с сообщениями на сервере появилась в 8.3.11 - я привожу цитату в статье.
Видимо, по другому реализовали, раз до 8.3.11
11. Infactum 268 19.02.18 09:26 Сейчас в теме
(10) Код искать точно не буду. Тут либо поверьте на слово, либо нет :)
Но возможность использовать систему взаимодействия была в 8.3.10.
Другие дело, что на тот момент её нельзя было развернуть у себя. Только сервер 1cDialog.com
https://its.1c.ru/db/v8310doc#bookmark:dev:TI000001900
12. ВикторП 122 19.02.18 09:39 Сейчас в теме
(11) Возможность использования есть в 8.3.10. Интересно узнать как было реализовано без сообщений - вопрос про это
13. Infactum 268 19.02.18 09:47 Сейчас в теме
(12) Как я уже говорил, код был закомментирован. То есть не работал. Детали я не помню.
Очевидно, что принципиально другой реализации тут быть не может. Пушем с сервера приходит информация о прогрессе.. все так же, как в других языках/платформах.
14. ВикторП 122 19.02.18 09:55 Сейчас в теме
4. bulpi 137 17.02.18 14:43 Сейчас в теме
Как обычно, через Ж. Но это упрек не автору, автору плюс.
uri1978; pm74; rpgshnik; +3 Ответить
8. ВикторП 122 18.02.18 18:55 Сейчас в теме
(4) есть идея на эту тему ?
15. 7OH 32 06.05.18 23:42 Сейчас в теме
Переделал для наглядности себе на 2 обработки: клиент и сервер (чтобы ещё и все пользователи могли сообщение увидеть).
А то пример не совсем информативный - цикл то крутится тут же и не даёт пользоваться программой до окончания цикла - так оно и сейчас может ))).
---
Плюс есть ошибка небольшая в начале работы.
У меня база была не зарегистрирована - но открыть обработку дало.
Я не закрывая зарегил и при попытке нажатия кнопки получил ошибку.
Оставьте свое сообщение