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

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

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

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

 

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

В версии 8.3.11

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

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

 

Идея такая:

 

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

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

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

 

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

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

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

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

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

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

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

     

 

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

17 Comments

  1. rpgshnik

    Забавная идея, понравилась, но имхо костыль))

    А зачем было брать логотип у Курсов1С?)

    Reply
  2. ВикторП

    Костыль или нет- посмотрим как эта система будет развиваться.

    Пока я заметил там несколько ошибок — удивительно было видеть счетчик равный 500 в цикле до 100 🙁

    Никакой другой рисунок не нашел, поэтому взял у Курсов.

    Reply
  3. Yashazz

    Ну идея-то была очевидна с момента, ещё как опубликовали в Зазеркалье анонс этого «взаимодействия». Подозреваю, сама 1С вскоре озаботится нормальными прогресс-барами, их за это шпыняют постоянно)

    Reply
  4. bulpi

    Как обычно, через Ж. Но это упрек не автору, автору плюс.

    Reply
  5. ВикторП

    (3) отображение индикатора выбрано из-за его наглядности

    Reply
  6. Yashazz

    (5) Понимаю. Оно напрашивалось, сам бы делал так же) А вообще bulpi прав, идейно это всё страхолюдно выглядит…

    Reply
  7. ВикторП

    (6) у меня другое мнение про идею :).

    Когда у вас есть развернутый сервер взаимодействия, то его можно использовать для возврата с сервера — я написал про это.

    Reply
  8. ВикторП

    (4) есть идея на эту тему ?

    Reply
  9. Infactum

    (3) В УНФ уже давно видел закомментированный код, реализующий работу прогресс-баров через систему взаимодействия. Кажется еще до релиза 8.3.11 было.

    Reply
  10. ВикторП

    (9) Интересно, кинете код? Потому что возможность с сообщениями на сервере появилась в 8.3.11 — я привожу цитату в статье.

    Видимо, по другому реализовали, раз до 8.3.11

    Reply
  11. Infactum

    (10) Код искать точно не буду. Тут либо поверьте на слово, либо нет 🙂

    Но возможность использовать систему взаимодействия была в 8.3.10.

    Другие дело, что на тот момент её нельзя было развернуть у себя. Только сервер 1cDialog.com

    https://its.1c.ru/db/v8310doc#bookmark:dev:TI000001900

    Reply
  12. ВикторП

    (11) Возможность использования есть в 8.3.10. Интересно узнать как было реализовано без сообщений — вопрос про это

    Reply
  13. Infactum

    (12) Как я уже говорил, код был закомментирован. То есть не работал. Детали я не помню.

    Очевидно, что принципиально другой реализации тут быть не может. Пушем с сервера приходит информация о прогрессе.. все так же, как в других языках/платформах.

    Reply
  14. ВикторП

    (13) Хор

    Reply
  15. 7OH

    Переделал для наглядности себе на 2 обработки: клиент и сервер (чтобы ещё и все пользователи могли сообщение увидеть).

    А то пример не совсем информативный — цикл то крутится тут же и не даёт пользоваться программой до окончания цикла — так оно и сейчас может ))).



    Плюс есть ошибка небольшая в начале работы.

    У меня база была не зарегистрирована — но открыть обработку дало.

    Я не закрывая зарегил и при попытке нажатия кнопки получил ошибку.

    Reply
  16. TreeDogNight

    (1) В чем именно вы увидели костыль?

    Reply
  17. TreeDogNight

    (13) В платформах 8.3.10 — 8.3.11 насколько я помню ещё не было возможности подписываться на оповещение о новых сообщениях.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *