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 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

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

60000 руб.

07.05.2019    35719    70    45    

30

WEB-интеграция Администрирование веб-серверов Платные (руб)

Веб-портал обеспечивает удобный доступ к конфигурации 1С:ITIL(ИТИЛ), 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    3669    5    0    

11

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

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

57600 руб.

26.11.2024    3240    3    3    

5

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

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

14400 руб.

20.12.2024    1342    9    2    

11

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

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

36000 руб.

03.08.2020    19585    24    22    

20

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

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

24000 руб.

27.09.2024    5399    5    2    

6

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

Решение осуществляет синхронизацию задач Битрикс24 и 1С, что позволяет в одной системе ставить задачи, контролировать выполнение всего пула задач с группировкой по ответственным и проектам, формировать управленческие отчеты по работе сотрудников (загрузка, просроченные задачи), уведомлять сотрудников о ходе выполнения задач посредством чат-бот Telegram

7200 руб.

04.05.2021    21257    14    19    

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

А ещё чуть раньше я показывал в видео то что вы писали, но опять же более подробно https://m.vkvideo.ru/video168885665_456239123
svetlitsky_sv; +1 Ответить
2. Minz 12 11.04.25 20:00 Сейчас в теме
Мне попадалась Ваша статья раньше, она хороша, но тогда вебсокеты были альфа версией платформы. Я ждал финального релиза, и вот он вышел. Возможно, кому-то будет нужна именно такая небольшая статья, из которой видно, что не нужно бояться вебсокетов и они не такие страшные (смайлик)
n_mezentsev; ilyanet; +2 Ответить
3. aximo 2319 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с, что бы из конфигурации сразу :)
Оставьте свое сообщение