Передача данных с сервера на клиент

Публикация № 1083439

Программирование - Практика программирования

взаимодействие сервер клиент с сервера на

6
Не так давно столкнулся с задачей интеграции облачной АТС и 1С CRM. Типовой функционал предполагает получения http-запросов через http-сервис. Обработкой запросов занимается сервер, и создается документ «Телефонный звонок». И все бы ничего, если данного функционала хватило для работы, но данной статьи тогда бы не было. Дополнительная задача заключалась в открытии форм существующего документа по клиенту «Интерес» и обработки «Мастер формирования интереса».
  1. Предисловие

Не так давно столкнулся с задачей интеграции облачной АТС и 1с CRM. Типовой функционал предполагает получения http-запросов через http-сервис. Обработкой запросов занимается сервер и создается документ «Телефонный звонок». И все бы ничего если данного функционала хватило для работы, но данной статьи тогда бы не было.

Дополнительная задача заключалась в открытии форм существующего документа по клиенту «Интерес» и обработки «Мастер формирования интереса».

  1. Поиск решения

Проблема была проста: при приеме http-запроса работает только Сервер, вызова Клиента не происходит. Вопрос, как реализовать открытие форм и отображение их конкретному пользователю?

За день «гуглежа» энтузиазм устремился в минус бесконечность пока не наткнулся на статью,  посвященную функционалу «Обсуждения» добавленного в платформу 8.3.11.2867.

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

Данная статья подразумевает передачу данных с сервера на клиент путем отправки сообщения конкретному пользователю системы.

  1. Реализация

Код в основном использовался из статьи указанной выше лишь с малыми изменениями необходимыми для решения моих задач.

Для начала каждому пользователю необходимо создать свое «Служебное обсуждение», ориентироваться будем по Ключу, который (в моем случаи) формируется из идентификатора пользователя в системе обсуждения (уид пользователя в системе обсуждения и уид в информационной базе разный) и произвольного префикса (оставил как в статье, для меня это было не принципиально).

 

&НаСервере

Процедура СоздатьСлужебноеОбсуждение(КлючСлужебногоОбсуждения) Экспорт

               

                Если СистемаВзаимодействия.ПолучитьОбсуждение(КлючСлужебногоОбсуждения) = Неопределено Тогда

                              

                               Обсуждение = СистемаВзаимодействия.СоздатьОбсуждение();

                               Обсуждение.Отображаемое = Ложь;

                               Обсуждение.Ключ = КлючСлужебногоОбсуждения;

                               Обсуждение.Участники.Добавить(СистемаВзаимодействия.ИдентификаторТекущегоПользователя());

                               Обсуждение.Записать();

                              

                КонецЕсли;

               

КонецПроцедуры



&НаСервере

Функция КлючСлужебногоОбсуждения() Экспорт

               

                Возврат "Сообщения сервера " + СистемаВзаимодействия.ИдентификаторТекущегоПользователя();

               

КонецФункции

 

Функция для генерации ключа «Служебного обсуждения» возвращает сформированный ключ и процедура, в которую передаем ключ, для формирования самого обсуждения.

Участники обсуждения добавляются по идентификатору пользователя в системе обсуждения.

СистемаВзаимодействия.ИдентификаторТекущегоПользователя() – возвращает идентификатор в системе по текущему пользователю информационной базы.

СистемаВзаимодействия.ПолучитьИдентификаторПользователя(ПользовательИБ.УникальныйИдентификатор) – возвращает идентификатор пользователя по уникальному идентификатору пользователя информационной базы.

Обсуждение.Отображаемое = Ложь – скрываем обсуждение от пользователя (а зачем оно ему?).

Обсуждение создано, пользователь подвязан, следующий этап – добавление возможности пользователя получать эти самые «Служебные обсуждения».

Для этого будем использовать процедуру, которую мы будем вызывать 1 раз за сеанс, в моем случаи я подключаю ее при входе в рабочее место «Телефония» и до конца действия сеанса. Все поступившие сообщения для пользователя сохраняются в системе даже если сеанс неактивен, после выполнения процедуры все сообщения будут воспроизведены.

&НаКлиенте

Процедура ПодписатьсяНаСлужебноеОбсуждение(КлючСлужебногоОбсуждения) Экспорт

               

                ОшибкаПодключения = Новый ОписаниеОповещения( , , , "ОшибкаПодключения", БИТ_СерверВзаимодействия);

                ОбработкаСообщенийСервера = Новый ОписаниеОповещения("ОбработкаСообщенийСервера", БИТ_СерверВзаимодействия);

                СистемаВзаимодействия.НачатьПодключениеОбработчикаНовыхСообщений(ОшибкаПодключения, КлючСлужебногоОбсуждения, ОбработкаСообщенийСервера);

               

КонецПроцедуры

 

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

Следующее что нам необходимо сделать – создать сообщение, которое мы и будем обрабатывать.

В моем случаи я получаю данные из http-запроса, типовым функционалом формируется документ «Телефонный звонок», а дальше забираю входящий номер телефона, внутренний телефон менеджера и сам документ себе в процедуру формирования служебного сообщения.


&НаСервере

Процедура ВыполнитьДействиеПриЗвонке(НомерТелефонаВх, НомерПользователя, ДокументЗвонка) Экспорт
               

                ПользовательСВ = ПолучитьПользователяСВ(НомерПользователя);

                Ключ = "Сообщения сервера " + ПользовательСВ;

                СлужебноеОбсуждение = СистемаВзаимодействия.ПолучитьОбсуждение(Ключ);

               

                СтруктураДанных = Новый Структура;

                СтруктураДанных.Вставить("Значение", ДокументЗвонка);

                СтруктураДанных.Вставить("СпособОбработки", "Индикатор");

                СтруктураДанных.Вставить("НомерТелефона", НомерТелефонаВх);

               

                Сообщение = СистемаВзаимодействия.СоздатьСообщение(СлужебноеОбсуждение.Идентификатор);

               

                Сообщение.Данные = СтруктураДанных;

                Сообщение.Записать();


КонецПроцедуры

Функция ПолучитьПользователяСВ(НомерПользователя) – получает данные по внутреннему номеру АТС пользователя. Сначала я получаю пользователя информационной базы, после чего по уникальному идентификатору получаю пользователя системы взаимодействия.

Далее по ключу ищу его «Служебное обсуждение» и завожу в него структуру с данными. Так же через структуру можно передать название «клиентской» процедуры или функции и в обработке данного сообщения ее вызвать (Выполнить(«НазваниеПроцедуры()») – для процедуры и Вычислить(«НазваниеФункции()») – для функции).

Создаем сообщение в «Служебном обсуждении» и записываем его.

Осталось нам только обработать новое сообщение у пользователя.

&НаКлиенте

Процедура ОбработкаСообщенийСервера(Сообщение, ДополнительныеПараметры) Экспорт

                 СтруктураЗвонка(Сообщение.Данные.НомерТелефона, Сообщение.Данные.Значение);


КонецПроцедуры


&НаКлиенте

Процедура СтруктураЗвонка(НомерТелефона, Документ)

…

КонецПроцедуры

 

Это та самая процедура которую мы подключаем в ОбработкаСообщенийСервера.

Возможно это особенность конфигурации, но сам сервер взаимодействия устанавливать не пришлось. Как установить сервер взаимодействия можно посмотреть здесь.

Касательно новых конфигурации, например Управление торговлей 11.4 включение сервиса взаимодействий находится в НСИ и администрирование -> Интернет-поддержка и сервисы -> Группа "Обсуждения"

На этом все.

Моя первая статья, особо ногами не пинайте)

6

См. также

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

Комментарии
Избранное Подписка Сортировка: Древо
1. lunjio 62 26.06.19 12:38 Сейчас в теме
Вопрос, как реализовать открытие форм и отображение их конкретному пользователю?

Пихаешь в регистр сведений, на клиенте в сеансе упр приложения подключаешь обработчик по определенной периодичности проверяет сервер, получает те данные которые без флага обработаны. Это работает во всех видах клиента, на всех платформах.
2. login1281 6 26.06.19 12:44 Сейчас в теме
(1) Задача подразумевала открытие форм в момент ответа на входящий звонок.
Я в курсе обработчика ожидания, но в данном кейсе не подходит
4. lunjio 62 26.06.19 12:53 Сейчас в теме
(2) Я делал такое на платформе 8.2 УПП 1.3, как правило, если откроется с небольшой задержкой в 5-8 сек, то ничего критичного не произойдет, как правило, пока поздароваются и т.п, уже все откроется. Второй вариант был генерировать внешнее событие с помощью ВК, но пока было в экспериментальных целях, отказался от ВК.
6. login1281 6 26.06.19 13:20 Сейчас в теме
(4) 1.Опять таки это дополнительная нагрузка и без того нагруженной системы CRM. С некоторой периодичностью нужно будет проверять появление необработанных данных. Поток входящих данных огромный, почта, мессенджеры, телефонные звонки, данные с сайта, чат с сайта, все это грузит систему и задержка в данном случаи может превысить 5-8 сек. как Вы говорите.
2. Даже задержка 5-8 сек. достаточно неприятна, за эту задержку менеджер сам сможет открыть существующий документ и по нему создать интерес.
5. login1281 6 26.06.19 13:13 Сейчас в теме
(3)Согласен. Здесь я постарался разжевать статью с сайта зазеркалья и описать как мне помогло данное решение
7. harmless 27.06.19 07:56 Сейчас в теме
Маленькая очепятка в процедуре ОбработкаСообщенийСервера в наименовании метода: СтруктураЗвонака
8. login1281 6 27.06.19 09:12 Сейчас в теме
(7)Спасибо. Поправил. Посмотрел код в 1с, и там и там у меня СтруктураЗвонАка)
9. PLAstic 213 27.06.19 14:48 Сейчас в теме
Подскажите, какие действия выполнялись для возможности задействования механизма СистемаВзаимодействия? Просто взял и пошёл, или надо что-то покупать?
11. login1281 6 27.06.19 15:38 Сейчас в теме
(9) Не знаю, дойдет ли мое предыдущее сообщение (было указано на модерации). Добавил данные в низ статьи.
Сам сервер устанавливать не пришлось.
Сам сервис необходимо подключить, в новых версиях конфигурация находится в Администрировании -> Интернет-поддержка и сервисы -> Обсуждения
Так же находил нюанс касательно изменений политики лицензирования по платформе в котором было указано что данный сервис будет работать только в платформе версии КОРП, но могу ошибаться.
12. login1281 6 27.06.19 15:41 Сейчас в теме
(9)И еще хочу добавить что у меня работает на серверной базе на платформе версии 8.3.12.1685
Оставьте свое сообщение