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

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

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

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

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

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

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

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

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

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

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

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

 

&НаСервере

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



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



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

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

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

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

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



КонецЕсли;



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



&НаСервере

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



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



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

 

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

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

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

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

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

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

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

&НаКлиенте

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



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

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

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



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

 

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

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

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


&НаСервере

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


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

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

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



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

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

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

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



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



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

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


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

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

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

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

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

&НаКлиенте

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

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


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


&НаКлиенте

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

…

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

 

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

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

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

На этом все.

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

13 Comments

  1. lunjio
    Вопрос, как реализовать открытие форм и отображение их конкретному пользователю?

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

    Reply
  2. login1281

    (1) Задача подразумевала открытие форм в момент ответа на входящий звонок.

    Я в курсе обработчика ожидания, но в данном кейсе не подходит

    Reply
  3. user1166203
  4. lunjio

    (2) Я делал такое на платформе 8.2 УПП 1.3, как правило, если откроется с небольшой задержкой в 5-8 сек, то ничего критичного не произойдет, как правило, пока поздароваются и т.п, уже все откроется. Второй вариант был генерировать внешнее событие с помощью ВК, но пока было в экспериментальных целях, отказался от ВК.

    Reply
  5. login1281

    (3)Согласен. Здесь я постарался разжевать статью с сайта зазеркалья и описать как мне помогло данное решение

    Reply
  6. login1281

    (4) 1.Опять таки это дополнительная нагрузка и без того нагруженной системы CRM. С некоторой периодичностью нужно будет проверять появление необработанных данных. Поток входящих данных огромный, почта, мессенджеры, телефонные звонки, данные с сайта, чат с сайта, все это грузит систему и задержка в данном случаи может превысить 5-8 сек. как Вы говорите.

    2. Даже задержка 5-8 сек. достаточно неприятна, за эту задержку менеджер сам сможет открыть существующий документ и по нему создать интерес.

    Reply
  7. harmless

    Маленькая очепятка в процедуре ОбработкаСообщенийСервера в наименовании метода: СтруктураЗвонака

    Reply
  8. login1281

    (7)Спасибо. Поправил. Посмотрел код в 1с, и там и там у меня СтруктураЗвонАка)

    Reply
  9. PLAstic

    Подскажите, какие действия выполнялись для возможности задействования механизма СистемаВзаимодействия? Просто взял и пошёл, или надо что-то покупать?

    Reply
  10. login1281

    (9) Не знаю, дойдет ли мое предыдущее сообщение (было указано на модерации). Добавил данные в низ статьи.

    Сам сервер устанавливать не пришлось.

    Сам сервис необходимо подключить, в новых версиях конфигурация находится в Администрировании -> Интернет-поддержка и сервисы -> Обсуждения

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

    Reply
  11. login1281

    (9)И еще хочу добавить что у меня работает на серверной базе на платформе версии 8.3.12.1685

    Reply
  12. vdv2701

    На обычных формах это не будет работать. В этом случае лучше использовать более универсальное решение, т.е. внешнюю компоненту.

    Reply
  13. von_de

    Во-первых, это не будет работать на обычных формах. Во-вторых не будет работать на конфигурациях в режиме совместимости. Гораздо проще написать ВК, которая будет кидать и принимать текстовое сообщение по UDP с сервера на клиент.

    Reply

Leave a Comment

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