WebSocket клиент в 1С. Первый взгляд на релиз 8.3.27.1508

21.04.25

Интеграция - WEB-интеграция

С выходом новой платформы 8.3.27.1508 появился встроенный объект для работы с вебсокетами. Расскажу про свой первый опыт создания Websocket клиента.

Всем привет. Хочу поделиться тем, как начать использовать новый объект WebSocketКлиентСоединения, описать некоторые тонкости, которые успел заметить.

Пробовать буду на внешней обработке. Она будет очень простая: три кнопки "Открыть соединение", "Отправить сообщение", "Закрыть соединение".

 

 

Также понадобится реквизит формы "КлючСоединения" с типом строка, который я заполняю при создании формы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	КлючСоединения = "f5d8323e-482a-4c42-9109-96875f0599d0";
	
КонецПроцедуры

Ключ соединения может быть любой строкой, "Соединение1", "WSconnect" и т.д. Я сгенерировал GUID, мне показалось так удобнее. Ключ используется для последующей работы с WebSocket соединениями.

Все процедуры можно писать даже на клиенте.

 

Кнопка "Открыть соединение"

&НаКлиенте
Процедура ОткрытьCоединение(Команда)
	
	Попытка
		URL = "ws://192.168.0.19:8765";
		WebSocketКлиентСоединения.ОткрытьСоединение(КлючСоединения, URL);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
КонецПроцедуры

В справке не указано, каким образом должен выглядеть URL. Методом проб и ошибок выяснил, что он состоит из имени протокола "ws://" и адреса хоста. У меня в качестве сервера выступает питоновский скрипт, который открывает порт 8765 на удалённой машине с адресом 192.168.0.19

 

Кнопка "Отправить сообщение"

&НаКлиенте
Процедура ОтправитьCообщение(Команда)
	
	Попытка
		Соединение = WebSocketКлиентСоединения.ПолучитьСоединение(КлючСоединения);
		Соединение.ОтправитьСообщение("Hello websocket!");
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
КонецПроцедуры

Первое, что тут происходит, это поиск соединения в менеджере вебсокет соединений как раз по ключу, который добавлен в переменную КлючСоединения. Потом отправка сообщения в него.

Объект WebSocketКлиентСоединение не сериализуется, поэтому его нельзя передавать с клиента на сервер. Но 1С поступили разумно, создав менеджер вебсокет соединений, который самостоятельно управляет ими. То есть, нам не нужно заботиться о сохранении своего соединения в переменной. Более того, если закрыть обработку, из которой создавали соединение, и открыть заново, то можно сразу отправлять сообщения, потому что своё соединение всегда можно получить по ключу! Соединения не сбрасываются, пока не завершена сессия текущего пользователя. Из другой сессии того же пользователя, к сожалению, получить соединение по тому же ключу нельзя.

 

Кнопка "Закрыть соединение"

&НаКлиенте
Процедура ЗакрытьСоединение(Команда)
	
	Попытка
		Соединение = WebSocketКлиентСоединения.ПолучитьСоединение(КлючСоединения);
		Соединение.Закрыть();
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
КонецПроцедуры

Тут снова находим наше соединение по ключу и завершаем его.

 

Заключение

Всё оказалось довольно просто и удобно. Надеюсь, для кого-то статья станет отправной точкой для создания своих обработок для Websocket соединений.

Для интересующихся домашнее задание: изучить обработчики объекта и создать код для "ОбработчикПолученияСообщения" для обработки входящих запросов :)

 

[Upd]

Я выполнил своё же домашнее задание. Вот как это было.

В моём проекте требуется организовать связь между базой 1С и web-приложением через посредника - Websocket сервер, который бы работал своего рода MQ broker-ом (обработчиком очереди сообщений).

Убедившись в первой части статьи, что со стороны 1С подключение и отправка довольно просты, я провёл несколько последующих дней на разработку серверной части. Когда пришло время возвратиться к 1С и обработать входящее сообщение, понадобилось внести минимальные правки в прошлый код.

 

Изменение процедуры кнопки "Открыть соединение"

&НаКлиенте
Процедура Соединить(Команда)
	
	Попытка
		Обработчики = Новый ОбработчикиWebSocketКлиентСоединения(, "ВходящееСообщение", , , ЭтаФорма);
		URL = "ws://192.168.0.19:8765";
		WebSocketКлиентСоединения.ОткрытьСоединение(КлючСоединения, URL, Обработчики);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
КонецПроцедуры

Добавляю создание описания обработчиков событий "ОбработчикиWebSocketКлиентСоединения". "ВходящееСообщение" - это имя экспортной процедуры, которая будет выполняться, она указана второй, потому что отвечает за событие приём сообщения. "ЭтаФорма" - модуль, где находятся указанные процедуры. В создание соединения нужно добавить обработчики третьим аргументом.

 

Добавление процедуры "ВходящееСообщение"

&НаКлиенте
Процедура ВходящееСообщение(Соединение, Сообщение) Экспорт
	
	Попытка
		СообщениеОбъект = ПрочитатьЗначениеJSON(Сообщение);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
КонецПроцедуры

У процедуры обработки входящего веб сокет сообщения два параметра "Соединение" и "Сообщение". Если на отправляющей стороне позаботиться об отправке json-строки, то здесь всего лишь нужно применить "ПрочитатьЗначениеJSON", после которой в структуре будут все поля с данными! Очень просто, даже с кириллицей.

Содержание сообщения:

{
    "type": "text",
    "content": "\u041f\u0440\u0438\u0432\u0435\u0442 1\u0421!",
    "from": "web",
    "message_id": "bb7eac3c-265d-4bfe-9758-3e1cc7681084"
}

Содержание структуры после обработки:

Ещё один важный момент. Я пробовал имитировать длительную операцию на стороне 1С после приёма входящего сообщения, и в этот момент отправлял ещё одно. Похоже, что сообщения кэшируются в соединении и событие получения срабатывает на очередное сообщение сразу после выполнения предыдущего. Я останавливал код на 5 минут, после чего успешно получал отправленные в этот момент сообщения. Здорово!

В очередной раз всё обошлось несколькими строчками кода. Понятно, что логику обработки сообщений всё равно придётся писать, но вопрос по поводу Websocket-а для меня теперь снят.

 

Всем удачи, пока.

Вступайте в нашу телеграмм-группу Инфостарт

WebSocket

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С v8.3 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM / LOGICSTARS. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM / LOGICSTAR разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    21762    31    24    

24

SALE! 15%

WEB-интеграция Программист Бизнес-аналитик 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17280 14688 руб.

20.12.2024    3992    20    2    

21

WEB-интеграция Программист Руководитель проекта 1С v8.3 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки. Основные преимущества: 1. Документация API создаётся автоматически. Удобна для программной обработки. 2. Изменить API столь же просто как настроить отчёт. Можно опубликовать существующий вариант отчёта. 3. Отчёты в API поддерживают параметры (Период, ДатаНачала и др.) 4. При создании простых методов не требуется изменять конфигурацию. 5. Поддерживается работа с планами обмена.<br/> 6. Возможно настроить отправку из 1С данных корреспондирующей системе, для случаев когда 1С сама "знает" какие данные нужно отправить. 7. После записи в 1С Ле Мурр может возвращать соответствие полученных идентификаторов созданным в 1С объектам данных.

36000 руб.

27.09.2024    8643    7    5    

9

Оптовая торговля WEB-интеграция Бюджетный учет Обмен с ГосИС Бухгалтер Пользователь 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Государственные, бюджетные структуры Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обмен данными с "Порталом поставщиков" zakupki.mos.ru Москвы и Московской области с целью создания оферт для закупок государственными учреждениями. Модуль устраняет рутину, минимизирует ошибки и помогает выигрывать больше закупок. Работает строго по требованиям 44-ФЗ.

14400 руб.

13.12.2016    41286    54    39    

37

Обмен с ГосИС WEB-интеграция Бухгалтер Пользователь 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

5196 руб.

28.04.2016    98207    111    218    

359
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dsdred 4067 11.04.25 19:02 Сейчас в теме
Для отправной точки у вас мало информации.
В январе я уже делал поподробнее статейку
https://infostart.ru/1c/articles/2280032/

А ещё чуть раньше я показывал в видео то что вы писали, но опять же более подробно https://m.vkvideo.ru/video168885665_456239123
svetlitsky_sv; +1 Ответить
2. Minz 15 11.04.25 20:00 Сейчас в теме
Мне попадалась Ваша статья раньше, она хороша, но тогда вебсокеты были альфа версией платформы. Я ждал финального релиза, и вот он вышел. Возможно, кому-то будет нужна именно такая небольшая статья, из которой видно, что не нужно бояться вебсокетов и они не такие страшные (смайлик)
n_mezentsev; ilyanet; +2 Ответить
3. aximo 2511 12.04.25 07:58 Сейчас в теме
Ничего, что мало информации, зато вспомним, что есть такое)
4. gybson 12.04.25 11:09 Сейчас в теме
Т.е. мы должны теперь следить за тем, чтобы соединения имели разные ключи. Чтобы никакой пытливый ум не поленился придумывать разные имена. Потрясающе. Кроме совместной разработки кода теперь нужна поддержка совместных подключений, чтобы не выяснять кто закрыл чужое подключение.
5. sultbec 10 12.04.25 16:53 Сейчас в теме
(4) зачем? Если по одному имени у каждого юзера свое соединение
cleaner_it; +1 Ответить
6. svetlitsky_sv 02.05.25 18:20 Сейчас в теме
вот ссылку бы на ИТС, а то взял из примера - не работает. А почти тоже самое из ИТС - работает :)
Надеюсь, не запрещено ссылки на ИТС давать?
https://its.1c.ru/db/v8327doc#bookmark:dev:TI000002827

Попросил GROK сделать websocket сервер на c#, подключил к нему для тестов Postman и 1C - все работает как надо, быстро и понятно. Очень ждём сервер websocket на 1с, что бы из конфигурации сразу :)
Для отправки сообщения требуется регистрация/авторизация