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

Не так давно столкнулся с задачей интеграции облачной АТС и 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 не будет опубликован. Обязательные поля помечены *