Внешняя компонента ROM-WebSocket

Библиотека входит в SDK прежде всего для возможности интеграции с новым интерфейсом Asterisk - ARI (Asterisk RESTfull Interface), который доступен в версиях Asterisk 12, 13.

В то же время, библиотека является универсальной и может использоваться для любых других задач, с участием WebSocket

ROM-WebSocket - внешняя компонента 1С:Предприятие 8.x, реализована по технологии Native API, в соответствии с рекомендациями 1С, изложенными в руководстве «Технология создания внешних компонент». Библиотека написана на языке C++.

ROM-Websocket реализует функциональность WebSocket-клиента для 1С. Реализация WebSocket-клиента выполнена в соответствии с RFC 6455.

Описание протокола WebSocket
Сайт, посвященный WebSocket (поддерживает тестовый эхо-сервер на WebSocket)

ROM-WebSocket поддерживает URI схему ws: (нешифрованное соединение), определенную спецификацией протокола

ROM-WebSocket работает в асинхронном режиме - результаты выполнения методов будут возвращены как внешнее событие 1С.

Текущая версия

Авторские права

Авторские права принадлежат Simplit, согласно международной конвенции о защите авторских прав

Поддерживаемые версии 1С:Предприятие

  • 1С:Предприятие 8.1
  • 1С:Предприятие 8.2 обычное приложение
  • 1С:Предприятие 8.2, 8.3 управляемое приложение:
    • сервер,
    • толстый клиент,
    • тонкий клиент,

Поддерживаемые WebSocket-серверы

Внешняя компонента работает с любыми WebSocket-серверами, которые поддерживают спецификацию WebSocket (RFC 6455). Единственное требование - это соответствие спецификации протокола.

Нами были успешно протестированы:

  • Slack (сервис командного взаимодействия)
  • Pusher (интернет вещей, интеграция приложений)
  • Pushbullet (сервис обмена сообщениями между различными устройствами и ОС)

Поддерживаемые ОС

  • Windows Server 2012
  • Windows Server 2008
  • Windows 10
  • Windows 8
  • Windows 7
  • Windows Vista

Windows XP / Windows Server 2003 не поддерживаются

Свойства и методы

Свойства

  • Подключено / Connected – (чтение), (булево), флаг состояния подключения к серверу
  • Таймаут / Timeout – (чтение/запись), (число), таймаут в секундах при подключении к серверу
  • РежимПрослушивания / Listen – (чтение/запись), (булево), вкл/выкл режим получения внешних событий
  • Версия / Version – (чтение), (строка), версия внешней компоненты
  • РегулярноеВыражение / Regex – (чтение/запись), (строка), фильтр на базе регулярного выражения PCRE

Методы

  • Подключиться / Connect (URI) - установить соединение с WebSocket-сервером
  • Отключиться / Disconnect() - разорвать соединение с WebSocket-сервером
  • Отправить / Send(<СтрокаСообщения>) - отправить произвольное сообщение серверу

События

ROM-WebSocket работает в асинхронном режиме - результаты выполнения методов возвращаются как внешние события 1С в обработчик ВнешнееСобытие(Источник,Событие,Данные)

Параметр Событие содержит информацию о событии в структурированном виде - в формате JSON.

Процедура ВнешнееСобытие(Источник, Событие, Данные)
	Сообщить(Событие);
	Сообщить(Данные);
КонецПроцедуры

При подключении к серверу:
Параметр Событие содержит пакет {«Event»: «Connection»,«State»: «Open»},
параметр Данные содержит пакет {«Connection»: «Open»}
Вывод:

{"Event": "Connection","State": "Open"}
{"Connection": "Open"}

При отключении от сервера:

{"Event": "Connection","State": "Close","Reason": "Normal"}
{"Connection": "Close"}

«Reason»: «Normal» - соединение завершено по инициативе клиента
«Reason»: «Drop» - сторона сервера сбросила соединение

При ошибке установки соединения:

{"Event": "Connection","State": "Fail"}
{"Connection": "Fail"}

При получении сообщения от сервера:
Параметр Событие содержит пакет {«Event»: «Message»},
параметр Данные содержит текст сообщения

{"Event": "Message"}
Hello world!

Подключение внешней компоненты

Толстый клиент, сервер, внешнее соединение

//Пример подключения внешней компоненты из общего макета
АдресВнешнейКомпоненты="ОбщийМакет.ROMWebsocketZIP";
Результат=ПодключитьВнешнююКомпоненту(АдресВнешнейКомпоненты,"Simplit",ТипВнешнейКомпоненты.Native);
Если Результат Тогда
	WebSocket = Новый ("AddIn.Simplit.ROM-WebSocket");
КонецЕсли;

Тонкий клиент, веб-клиент

УстановитьВнешнююКомпоненту(<Местоположение>); ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>) ;

//Пример подключения внешней компоненты из ZIP-архива, хранящегося в общем макете
АдресВнешнейКомпоненты="ОбщийМакет.ROMWebsocketZIP";
Результат=ПодключитьВнешнююКомпоненту(АдресВнешнейКомпоненты,"Simplit",ТипВнешнейКомпоненты.Native);
Если Не Результат Тогда
	УстановитьВнешнююКомпоненту(АдресВнешнейКомпоненты);
	Результат=ПодключитьВнешнююКомпоненту(АдресВнешнейКомпоненты,"Simplit",ТипВнешнейКомпоненты.Native);
КонецЕсли; 
Если Результат Тогда
	WebSocket = Новый ("AddIn.Simplit.ROM-WebSocket");
КонецЕсли; 

Выполнение на стороне сервера 1С

На стороне сервера 1С недоступен механизм внешних событий. Соответственно, асинхронные оповещения о состоянии соединения сервер получить не cможет.

Для обеспечения работы на стороне сервера, ROM-WebSocket предоставляет возможность выполнения некоторых команд в синхронном режиме с помощью параметра Таймаут.

По умолчанию, значение параметра Таймаут = 0. При организации соединения на стороне сервера, необходимо задать значение параметра, например, Таймаут=5. Это позволит серверу дождаться окончания процесса установки соединения. Если, соединение завершится раньше, чем таймаут, тогда метод вернет результат раньше.

&НаСервере
Процедура ПодключитьсяНаСервере()
 
     WS=Новый("AddIn.Simplit.ROM-WebSocket");
     WS.РежимПрослушивания=Ложь;
     WS.Таймаут=5;
     СоединениеУстановлено=WS.Подключиться(URI);
     Если СоединениеУстановлено Тогда
          WS.Отправить("Привет мир!");
          WS.Отключиться();
     КонецЕсли; 
 
КонецПроцедуры