Поинтегрируем: WebSocket’ы в платформе 1С. Часть 1

18.09.25

Разработка - Механизмы платформы 1С

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
 
Введение

Все мы заметили, как перед новым годом фирма 1С активировалась и выпустила сразу две версии платформы 8.3.27 и 8.5.

 

 

У меня сложилось впечатление, что 8.5 это был отвлекающий маневр.

Посудите сами…

Сколько раз люди писали, что нужны WebSocket’ы?

На зазеркалье в плане задач 8.3.25 впервые мы увидели их в планах, потом они переносились и вновь на зазеркалье был анонс про 8.3.27 и их реализацию.

А новый воздушный интерфейс я не видел, чтобы просили. Думали, что появится новая платформа версии 9 и там все это будет, потом думали, что 1С: Элемент это и есть 9-ка. Но вдруг перед новым годом пошли анонсы, и стало ясно, что интерфейсу быть в 8.3.27.

Выходит 8.3.27, где появились WebSocket’ы, а интерфейса нет.

И в анонсе интерфейса волшебным образом пропало упоминание платформы 8.3.27. Потом, бац и 8.5 с интерфейсом…

 

Сколько людей писали про WebSocket’ы с момента их появления в 8.3.27?

Я не нашел свежих обзоров и снял небольшое видео в праздники.

Посмотреть можно тут -> Пример с WebSocket (В видео я подымаю WebSocket-сервер на NodeJS, подключаюсь к нему с веб-страничек, postman’а и 1С. Шлю сообщения в реальном времени.)

 

А сколько писанины, видосиков, постов, приколов про новый интерфейс?

Знаю только одного человека, который про это не знал…

Я собеседовал соискателя через пару дней, как вышла 8.5, и спросил:

- Что из нашумевших новинок в мире 1С сейчас у всех на слуху?

Он сказал, что не следит за новинками и не в курсе, так как у него нет времени на это…

 

 

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

 

Искренне надеюсь, что 8.5 не постигнет участь 8.4.

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

 

 

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

«То, что ждали, растворилось в хайпе того, что не ждали»

 

Давайте поговорим наконец о важном, но все по порядку.

 

 
HTTP-Сервисы vs WebSocket

Ранее мы имели возможность создавать и цепляться к http-сервисам и это удобно.

По сути http-сервис — это запрос-ответ. Клиент просит у сервера информацию, запускается сессия, во время которой сервер возвращает запрошенные данные.

Это удобно до той поры, пока вам не нужно организовать данные в реальном времени.

Вы, конечно, можете в цикле постоянно опрашивать о изменениях, но это похоже на DDoS-атаку своими силами.

 

 

Также вам может понадобиться двухсторонний обмен.

Можно, конечно, поднять два веб-сервера или использовать КД, но что делать, если у вас клиентами выступают: вебсайты, телефоны и прочие клиенты?

И вот тут начинают появляться различные прокладки…

 

Представьте: Вы сидите за длинным столом и вам захотелось салат с другого края стола. Вы просите у соседа, чтобы он попросил салат. Он просит у соседа и так до тех пор, пока запрос не дойдет до человека, сидящего рядом с салатом. И вот салатница идет по рукам и каждый может попросить себе пару ложечек. А до вас уже может и пустая салатница доехать (наверное, все хоть раз сталкивались с проблемой остатков).

 

 

Но наконец то и на улице 1С платформы праздник, на сцену выходят WebSocket’ы.

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

 

 

Представьте: Мальчик подходит к ребятам, играющим в футбол, и спрашивает:

-Можно с вами?

В ответ:

-Да.

И вот они уже играют в футбол все вместе.

Кто-то уходит, кто-то приходит. Игра идет до тех пор, пока есть желающие играть и есть футбольное поле.

 

 

Фиксируем:

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

Преимущества протокола в том, что после установления соединения клиент и сервер могут начинать двунаправленный обмен сообщениями.

 

Что схожего у HTTP-Сервисов и WebSocket?

  • Оба протокола имеют возможность шифровать трафик (http[S], ws[S])
  • Протоколы имеют схожие параметры в том числе и заголовки.

 

 

  • Оба кроссплатформенные. Простите меня, но не мог не плюнуть в COM.
  • У HTTP протокола есть коды ответов, которые хранят в себе информацию по ошибкам или удачном выполнении запроса. У WebSocket есть коды ошибок и коды закрытия.

Например, при закрытии коды:

1000 - нормальное закрытие

1005 - ошибка не указана

 

 

Коды WebSockets

Коды HTTP

 

  • Оба с данного момента поддерживает 1С Платформа

 

Что же сулят нам WebSocket’ы?

У нас появилась возможность подымать свои WebSocket-серверы и цепляться к ним при помощи платформы 1С, из коробки.

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

У нас открываются огромные возможности для интеграций, при этом нам наконец то не нужны внешние компоненты, «поле HTML документа» и прочие прокладки.

Это не значит, что http-сервисы пора выкидывать на помойку. Нет, это значит, что те задачи, которые мы решали при помощи костылей, можно теперь решать по-людски.

 

 
Как устроены WebSocket’ы в платформе 1С

Изменения в платформе, связанные с WebSocket-клиентом

 

 

  • У нас появилась возможность создавать WebSocket-клиенты на стороне клиентской части и на стороне кластера серверов. Сделано это специально, так как на клиенте, либо на сервере по каким-то причинам может отсутствовать доступ к Web Socket соединению. И этого вполне достаточно для организации различных интеграций. Уже есть готовые WebSocket-серверы для различных сервисов, брокеров и другого программного обеспечения. Да и свой WebSocket-сервер поднять труда не составит, главное продумать логику. Я покажу простой вариант, как это сделать.

Тут я кстати вижу огромные плюсы для нас. У нас есть возможность покачать навыки в других языках создавая backend.

 

  • В СУБД у нас появилась таблица [_WebSocketClients]:

 

 

Где:

[_ID] – идентификатор таблицы в СУБД.

[_WSCKey] – Web Socket Connect Key. Уникальный ключ, идентификатор соединения

[_MetadataID] – идентификатор в дереве метаданных

[_ServerURL] – сервер подключения к WebSocket. Адрес WebSocket-сервера

[_Predefined] – предопределенный или нет

[_ConnectionParameters] – дополнительные параметры используемые при подключении

[_IBUserName] – пользователь информационной базы, под которым запущено соединение

[_AutoConnect] – автоподключение. Указывает на необходимость автоматического подключения к серверу и восстановления подключения после разрыва соединения

 

  • Мы можем создавать WebSocket-клиент как в конфигурации так и программно(в документации ИТС называют динамическое добавление). Клиенты созданные в дереве конфигурации, доступны только на стороне кластера серверов

 

В дереве метаданных появился пункт WebSocket-клиенты:

 

 

В расширении тоже появилась возможность добавлять WebSocket-клиенты:

 

 

В модуле WebSocket-клиента мы можем создать обработчики:

 

 

В предметах отладки появились WebSocket и WebSocket(файловый вариант):

 

 

Давайте добавим предопределенный WebSocket-клиент в конфигураторе и посмотрим, что изменится в СУБД.

Я специально не установил галочку «Подключаться автоматически»:

 

 

Данные в СУБД:

 

 

Обратите внимание на WSCKey. Когда мы добавляем WebSocket-клиент в конфигураторе и делаем клиент предопределенным, ключ заполняется автоматически.

 

  • В платформе появилась служебная обработка «Управление WebSocket-клиентами». Она позволяет создавать, удалять и изменять WebSocket-клиенты. Рассказывать про нее нет смысла, моя цель разобрать как это все работает внутри.

 

 

Если данную обработку хотите забрать для исследований, тогда можно воспользоваться, например, вот этой обработкой:

 

 

На ИТС выделяют три способа создания WebSocket-клиентов:

  1. Динамические соединения на стороне клиентского приложения
  2. Динамические соединения на стороне кластера серверов
  3. WebSocket-клиенты на стороне кластера серверов

Схема работы с WebSocket (источник):

 

 

Эксперименты

Создаем WebSocket-сервер

Для демонстрации «WebSocket-клиентов на стороне кластера серверов» я подыму свой WebSocket-сервер на NodeJS.

Нам понадобятся:

  1. VSC. Качаем и устанавливаем: https://code.visualstudio.com/ 
  2. Nodejs. Качаем и устанавливаем: https://nodejs.org/
  3. Установщик пакетов npm.
  4. Библиотека ws и код WebSocket сервера.
  5. 1C 8.3.27 или 8.5
  6. Postman. Необязательно но желательно. Скачать можно тут -> https://www.postman.com/downloads/

 

Установка по порядку:

Команду установки npm можно выполнить в VSC.

Нужно лишь запустить терминал:

 

 

И выполнить команду: npm install -g npm

  • 4 Пункт. Создаем папку у себя, в которой будет WebSocket-сервер.

В этой папке открываем VSC и запускаем терминал как в пункте 3.

Выполняем команду: npm i ws

После выполнения в папке появятся файлы с описанием библиотек и папка с библиотекой ws.

 

 

 
Создаем файл index.js и помещаем в него следующий код:

 

// Подключаем библиотеку ws
const WebSocket = require("ws");

// Запускаем WebSocket сервер локально на порту 3001
const server = new WebSocket.Server({
  port: 3001,
});

// Создаем массив для хранения всех сообщений
const messages = [];

// Делаем обработчик для подключения
server.on("connection", (ws) => {
  // Отправляем клиенту все сообщения в формате JSON, которые уже были отправлены
  console.log("Client connected"); // информируем в консоли о новом подключении
  ws.send(JSON.stringify(messages));

  // Делаем обработчик отправки сообщения
  ws.on("message", (message) => {
    // Получаем сообщение в виде строки
    message = message.toString();
    // Добавляем сообщение в конец массива
    messages.push(message);
    // Отправляем все сообщения в формате JSON всем клиентам
    server.clients.forEach((client) => {
      client.send(JSON.stringify(messages));
    });
  });

  // Делаем обработчик при закрытии сессии клиентом
  ws.on("close", () => {
    console.log("Client disconnected"); // информация в консоли о отключении клиента
    // Отправляем всем клиентам что кто-то отключился
    server.clients.forEach((client) => {
      client.send("Client disconnected");
    });
  });
});

// Делаем обработчик ошибок
server.on("error", (error) => {
  console.log(error); // Информация в консоли об ошибке
});

// Делаем обработчик закрытия сессии на сервере
server.on("close", () => {
  // Отправляем всем информацию о закрытии сессии
  server.clients.forEach((client) => {
    client.send("Server closed");
  });

  console.log("Server closed"); //Информация в консоли о закрытии сессии
});

 

        

Выполняем команду запуска WebSocket сервера: node index.js

 

  • 5 пункт. Я рассчитываю, что 1С вы сами скачали и установили. Я лично использую комьюнити версию.
  • 6 пункт. Необязательный, но postman, по-моему, использует большинство. В нем есть возможность подключаться к WebSocket сессии, а значит мы без труда сможем проверить подключение.

 

Пункты 2,3,4 и 6 были показаны в видео Пример с WebSocket

Если вы все сделали верно, тогда в postman подключение произойдет без ошибок:

 

 

        

Адрес нашего локального сервера: ws://localhost:3001

 

 

Если у вас все получилось, тогда вы увидите следующую картину:

 

 

Создаем WebSocket-клиент на стороне кластера серверов

Добавляем WebSocket-клиент прямо в конфигураторе:

 

 

В модуле прописываем все обработчики.

 
Код модуля:

 

Процедура ПередПодключением(Клиент)
	ВебСокетыКлиентСервер.ПередПодключением(Клиент); 
КонецПроцедуры

Процедура ПриОткрытииСоединения(Соединение)
	ВебСокетыКлиентСервер.ПриОткрытииСоединения(Соединение);   
КонецПроцедуры

Процедура ПриПолученииСообщения(Соединение, Сообщение)
	ВебСокетыКлиентСервер.ПриПолученииСообщения(Соединение, Сообщение);
КонецПроцедуры

Процедура ПриОшибке(Соединение, КодОшибки, Описание)
	ВебСокетыКлиентСервер.ПриОшибке(Соединение, КодОшибки, Описание);
КонецПроцедуры

Процедура ПриЗакрытииСоединения(Соединение, КодЗакрытия)
	ВебСокетыКлиентСервер.ПриЗакрытииСоединения(Соединение, КодЗакрытия);
КонецПроцедуры

 

 

Добавляем модуль, в котором будет происходить общая обработка и запись в регистр с логами:

 

 

 
Код модуля:
Процедура ПередПодключением(Клиент) Экспорт 
	Параметры = ПараметрыКлиента(Клиент); 
	ЗаписатьВЛог("ПередПодключением",Клиент.Ключ,Параметры);	
КонецПроцедуры

Процедура ПриОткрытииСоединения(Соединение) Экспорт
	Параметры = ПараметрыСоединения(Соединение);
	ЗаписатьВЛог("ПриОткрытииСоединения",Соединение.Ключ,Параметры);
КонецПроцедуры

Процедура ПриПолученииСообщения(Соединение, Сообщение) Экспорт 
	Параметры = ПараметрыСоединения(Соединение); 
	Параметры.Вставить("Сообщение",Сообщение);
	ЗаписатьВЛог("ПриПолученииСообщения",Соединение.Ключ,Параметры);
КонецПроцедуры

Процедура ПриОшибке(Соединение, КодОшибки, Описание) Экспорт  
	Параметры = ПараметрыСоединения(Соединение); 
	Параметры.Вставить("Код",КодОшибки);
	Параметры.Вставить("Описание",Описание);
	ЗаписатьВЛог("ПриОшибке",Соединение.Ключ,Параметры);
КонецПроцедуры    

Процедура ПриЗакрытииСоединения(Соединение, КодЗакрытия) Экспорт 	
	Параметры = ПараметрыСоединения(Соединение); 
	Параметры.Вставить("Код",КодЗакрытия);
	ЗаписатьВЛог("ПриЗакрытииСоединения",Соединение.Ключ,Параметры);
КонецПроцедуры



Процедура ОбработчикОткрытия(Соединение) Экспорт 
	Параметры = ПараметрыСоединения(Соединение);
	ЗаписатьВЛог("ОбработчикОткрытия",Соединение.Ключ,Параметры);	
КонецПроцедуры   

Процедура ОбработчикПолученияСообщения(Соединение, Сообщение) Экспорт
	Параметры = ПараметрыСоединения(Соединение); 
	Параметры.Вставить("Сообщение",Сообщение);
	ЗаписатьВЛог("ОбработчикПолученияСообщения",Соединение.Ключ,Параметры);
КонецПроцедуры    

Процедура ОбработчикОшибки(Соединение, КодОшибки, Описание) Экспорт  
	Параметры = ПараметрыСоединения(Соединение); 
	Параметры.Вставить("Код",КодОшибки);
	Параметры.Вставить("Описание",Описание);
	ЗаписатьВЛог("ОбработчикОшибки",Соединение.Ключ,Параметры);
КонецПроцедуры 

Процедура ОбработчикЗакрытия(Соединение, КодЗакрытия) Экспорт  
	Параметры = ПараметрыСоединения(Соединение); 
	Параметры.Вставить("Код",КодЗакрытия);
	ЗаписатьВЛог("ОбработчикЗакрытия",Соединение.Ключ,Параметры);	
КонецПроцедуры 



#Область СборПараметров

Функция ПараметрыКлиента(Клиент)
	
	СтруктураКлиент = Новый Структура;
	СтруктураКлиент.Вставить("URLСервера", Клиент.URLСервера);
	СтруктураКлиент.Вставить("ИмяПользователяИнформационнойБазы", Клиент.ИмяПользователяИнформационнойБазы);
	СтруктураКлиент.Вставить("Заголовки", Клиент.ПараметрыСоединения.Заголовки);
	СтруктураКлиент.Вставить("МетаданныеИмя", Клиент.Метаданные.Имя);
	//СтруктураКлиент.Вставить("МетаданныеЗаголовки", Клиент.Метаданные.Заголовки);
	СтруктураКлиент.Вставить("МетаданныеURLСервера", Клиент.Метаданные.URLСервера);
	КлиентJSON = ЗаписатьДанныеВJSON(,СтруктураКлиент).Результат;
	
	Параметры = Новый Структура;
	Параметры.Вставить("Клиент",КлиентJSON);
	
	Возврат Параметры;
КонецФункции

Функция ПараметрыСоединения(Соединение)
	
	СтруктураСоединение = Новый Структура;
	СтруктураСоединение.Вставить("URLСервера", Соединение.URLСервера);
	СтруктураСоединение.Вставить("ИмяПользователяИнформационнойБазы", Соединение.ИмяПользователяИнформационнойБазы);  
	СтруктураСоединение.Вставить("Модуль", Соединение.Обработчики.Модуль); 
	СтруктураСоединение.Вставить("ОбработчикЗакрытияСоединения", Соединение.Обработчики.ОбработчикЗакрытияСоединения); 
	СтруктураСоединение.Вставить("ОбработчикОткрытияСоединения", Соединение.Обработчики.ОбработчикОткрытияСоединения); 
	СтруктураСоединение.Вставить("ОбработчикОшибки", Соединение.Обработчики.ОбработчикОшибки); 
	СтруктураСоединение.Вставить("ОбработчикПолученияСообщения", Соединение.Обработчики.ОбработчикПолученияСообщения); 
	СтруктураСоединение.Вставить("Заголовки", Соединение.Параметры.Заголовки);

	СоединениеJSON = ЗаписатьДанныеВJSON(,СтруктураСоединение).Результат;
	
	Параметры = Новый Структура;
	Параметры.Вставить("Соединение",СоединениеJSON);
	Возврат Параметры;
КонецФункции

#КонецОбласти
	

Процедура ЗаписатьВЛог(Обработчик,Ключ,Параметры=Неопределено)
	Дата = ТекущаяДатаСеанса();
	Если Не ЗначениеЗаполнено(Параметры) Тогда 
		Параметры = Новый Структура;
	КонецЕсли;	
	
	
	БылаОшибка = Ложь;
	Попытка	
		               
		НаборЗаписей = РегистрыСведений.СобытияВебСокеты.СоздатьНаборЗаписей();  			
		НаборЗаписей.Отбор.Дата.Установить(Дата);
		НаборЗаписей.Отбор.Обработчик.Установить(Обработчик);
		НаборЗаписей.Отбор.Ключ.Установить(Ключ);
		НаборЗаписей.Прочитать();	

		Если НаборЗаписей.Количество() = 0 Тогда
			НоваяЗаписьРегистра = НаборЗаписей.Добавить();
			
			НоваяЗаписьРегистра.Дата 		= Дата;
			НоваяЗаписьРегистра.Обработчик 	= Обработчик;
			НоваяЗаписьРегистра.Ключ 		= Ключ;	
		Иначе
			НоваяЗаписьРегистра = НаборЗаписей[0];
		КонецЕсли;
				
       	Для Каждого текПараметр Из Параметры Цикл 
				
			НоваяЗаписьРегистра[текПараметр.Ключ] = текПараметр.Значение;	
			
		КонецЦикла;
		
		
		НаборЗаписей.Записать(); 
					
	Исключение	
		
		БылаОшибка = Истина;
		ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
			
	КонецПопытки;

	Если БылаОшибка Тогда 
		ЗаписьЖурналаРегистрации("Ошибка",УровеньЖурналаРегистрации.Ошибка,,,ТекстОшибки);
	КонецЕсли;	
	
КонецПроцедуры


#Область СериализацияДесериализацияДанных 

// Возвращает чаще всего используемые ПараметрыЗаписиJSON (JSONWriterSettings)
// 
// Возвращаемое значение:
//  Результат - Структура - Стандартное заполнение
//
Функция СтандартныеПараметрыJSON() Экспорт
	
	Результат = Новый Структура;
	Результат.Вставить("ПереносСтрок",			ПереносСтрокJSON.Авто);
	Результат.Вставить("СимволОтступа",			" ");
	Результат.Вставить("ИспользоватьДвойныеКавычки",	Истина);
	Результат.Вставить("ЭкранированиеСимволов",		ЭкранированиеСимволовJSON.Нет);
	Результат.Вставить("ЭкранироватьАмперсанд",		Ложь);
	Результат.Вставить("ЭкранироватьОдинарныеКавычки",	Ложь);
	Результат.Вставить("ЭкранироватьРазделителиСтрок",	Ложь);
	Результат.Вставить("ЭкранироватьУгловыеСкобки",		Ложь);
	Результат.Вставить("ЭкранироватьСлеш",			Ложь);	
	
	Возврат Результат;		
	
КонецФункции

// Преобразует данные в формат JSON
//
// Параметры:
//  ВходящиеПараметры	 - Структура - Параметры формирование JSON
//  ВходныеДанные		 - ЛюбоеЗначение - Данные которые нужно перевести в JSON
// 
// Возвращаемое значение:
//  Результат - Структура
//  	Отработал - Булево - Выполнено или нет
//  	ТекстОшибки - Строка - Текст ошибки если функция отработала с ошибкой
//  	Результат - Строка - JSON
//
Функция ЗаписатьДанныеВJSON(Знач ВходящиеПараметры = Неопределено, Знач ВходныеДанные = "") Экспорт
	
	Результат = Новый Структура("Результат, Отработал, ТекстОшибки", "", Истина, "");
	
	Если ВходящиеПараметры = Неопределено Тогда 
		ВходящиеПараметры = СтандартныеПараметрыJSON(); 	
	КонецЕсли;	
	
	ПараметрыJSON	= Новый ПараметрыЗаписиJSON(ВходящиеПараметры.ПереносСтрок,
		ВходящиеПараметры.СимволОтступа,
		ВходящиеПараметры.ИспользоватьДвойныеКавычки,
		ВходящиеПараметры.ЭкранированиеСимволов,
		ВходящиеПараметры.ЭкранироватьУгловыеСкобки,
		ВходящиеПараметры.ЭкранироватьРазделителиСтрок,
		ВходящиеПараметры.ЭкранироватьАмперсанд,
		ВходящиеПараметры.ЭкранироватьОдинарныеКавычки,
		ВходящиеПараметры.ЭкранироватьСлеш);
	
	
	Попытка
		ЗаписьJSON						= Новый ЗаписьJSON;
		ЗаписьJSON.ПроверятьСтруктуру 	= Истина;
		ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);	
		ЗаписатьJSON(ЗаписьJSON, ВходныеДанные,,"ФункцияПреобразованияЗаписи",ВебСокетыКлиентСервер);
		Результат.Вставить("Результат",	ЗаписьJSON.Закрыть());
	Исключение
		Результат.Отработал 			= Ложь;
		Результат.ТекстОшибки 			= ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции	

Функция ФункцияПреобразованияЗаписи(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
    Если ТипЗнч(Значение) = Тип("СписокЗначений") Тогда  
        МассивЗначений = Значение.ВыгрузитьЗначения();
        Значение = МассивЗначений;
    КонецЕсли;	
КонецФункции

// Десериализует строку JSON в формат данных 1С
//
// Параметры:
//  СтрокаJSON - Строка - JSON
// 
// Возвращаемое значение:
//  Результат - Структура
//  	Отработал - Булево - Выполнено или нет
//  	ТекстОшибки - Строка - Текст ошибки если функция отработала с ошибкой
//  	Результат - ЛюбоеЗначение - Данные в формате 1С
//
Функция ЧтениеДанныхИзJSON(Знач СтрокаJSON) Экспорт
	
	Результат = Новый Структура("Отработал, ТекстОшибки", Истина, "");
						
	Попытка
		ЧтениеJSON 				= Новый ЧтениеJSON;
		ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
		Результат.Вставить("Результат", ПрочитатьJSON(ЧтениеJSON));
	Исключение
		Результат.Отработал 	= Ложь;
		Результат.ТекстОшибки 	= ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

// Десериализует поток JSON в формат данных 1С
//
// Параметры:
//  ПотокJSON	 - Поток -
// 
// Возвращаемое значение:
//  Результат - Структура
// 		Отработал - Булево - Выполнено или нет
//  	ТекстОшибки - Строка - Текст ошибки если функция отработала с ошибкой
//  	Результат - ЛюбоеЗначение - Данные в формате 1С
//
Функция ЧтениеПотокаИзJSON(Знач ПотокJSON) Экспорт
	
	Результат = Новый Структура("Отработал, ТекстОшибки", Истина, "");
					
	Попытка
		ЧтениеJSON 				= Новый ЧтениеJSON;
		ЧтениеJSON.ОткрытьПоток(ПотокJSON);
		Результат.Вставить("Результат", ПрочитатьJSON(ЧтениеJSON));
	Исключение
		Результат.Отработал 	= Ложь;
		Результат.ТекстОшибки 	= ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
	КонецПопытки;
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти

 

 

Еще я добавил регистр для логирования событий на всех обработчиках:

 

 

На этом подготовительные работы в 1С завершены, можно запускать пример.

Запускаем новую обработку из функций для технического специалиста и нажимаем «Подключить»:

 

 

Перед подключением запустился обработчик «ПередПодключением»

Параметры обработчика:

         Клиент – тип WebSocketКлиент

В справке есть ошибка в примере, которая вводит в заблуждение:

 

 

Обработчик вызывается перед попыткой установить соединение. Позволяет изменить настройки соединенияWebSocketКлиента. Тут можно установить и переопределить настройки.

Что можно переопределить:

  • URLСервера
  • ИмяПользователяИнформационнойБазы
  • ПодключатьАвтоматически
  • ? Клиент.ПараметрыСоединения - В справке написано только чтение, но я добавлял заголовки. Ниже пример с доказательством.

 

Пример кода:

Процедура ПередПодключением(Клиент)

   Клиент.URLСервера = "wss://ws.postman-echo.com/raw";
   Клиент.ПараметрыСоединения.Заголовки.Вставить("Authorization","Bearer 123");
   Клиент.ИмяПользователяИнформационнойБазы = "Администратор";

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

 

 

После того как установится соединение с сервером запускается обработчик «ПриОткрытииСоединения»

Параметры обработчика:

         Соединение – тип WebSocketКлиентСоединение

По большому счету, тут можно уже получить ключ, по которому можно цепляться для отправки сообщений.

 

 

Обработчик «ПриПолученииСообщения»

Параметры обработчика:

         Соединение – тип WebSocketКлиентСоединение

         Сообщение – тип Строка, ДвоичныеДанные

Напоминаю наш WebSocket сервер при подключение присылает все накопленные отправленные ранее сообщения, поэтому мы зацепим еще и этот обработчик.

Сообщений пока не было, поэтому пришел пустой массив:

 

 

А вот теперь предлагаю отправить сообщение из postmana:

 

 

В 1С прилетело сообщение:

 

 

Теперь давайте в обработке нажмем отключить сообщение:

 

 

Обработчик «ПриЗакрытииСоединения»

         Соединение – тип WebSocketКлиентСоединение

         КодЗакрытия – тип Строка

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

1005 – в нашем случае говорит о том, что ошибок не было.

 

 

А теперь самое интересное, мы же при закрытии сессии клиента сообщаем всем остальным клиентам, что кто-то покинул сессию.

Смотрим в postman:

 

 

Предлагаю еще раз подключится и отправить сообщение.

После подключения заглядываю в регистр логов, чтобы забрать ключ подключения к сессии и за одно посмотреть на историю:

 

 

 
Я скидал однокнопковую обработку вот с таким кодом:

 

&НаКлиенте
Процедура Команда1(Команда)
	Команда1НаСервере();
КонецПроцедуры

Процедура Команда1НаСервере()
	
	СоединенияПоКлючу = "9f442068-bee0-4472-9376-36896c5ed5fa WebSocketКлиентTest";
	
	ВебСокет = WebSocketКлиентСоединения.ПолучитьСоединение(СоединенияПоКлючу);	
	Если ВебСокет <> Неопределено Тогда 
		ВебСокет.ОтправитьСообщение("Привет, постман! ПолучитьСоединениЕ по ключу");
	КонецЕсли;
	
	ВебСокетЫ = WebSocketКлиентСоединения.ПолучитьСоединения();
	Для Каждого ВебСокет из ВебСокетЫ Цикл
		Если ВебСокет <> Неопределено Тогда
			ВебСокет.ОтправитьСообщение("Привет, постман! ПолучитьСоединениЯ");
		КонецЕсли;	
	КонецЦикла;
	
КонецПроцедуры

 

 

По сути, я попытаюсь найти соединение по ключу и, если найду отправлю сообщение "Привет, постман! ПолучитьСоединениЕ по ключу".

Далее я получу все соединения и отправлю из них сообщение "Привет, постман! ПолучитьСоединениЯ".

Если все пройдет хорошо, тогда postman получит минимум одно сообщение, и мы в 1С получим массив с этими сообщениями.

 

 

Первое есть:

 

 

Второе есть:

 

 

В postman тоже сообщения пришли:

 

 

За кадром остался еще один обработчик...

 

Обработчик «ПриОшибке»

Параметры обработчика:

         Соединение – тип WebSocketКлиентСоединение

         КодОшибки – тип Строка

Описание – тип Строка

Обработчик вызывается в том случае, если при работе соединения произошла какая-либо аварийная ситуация.

Вот, собственно, и все.

 

Продолжение:

Поинтегрируем: WebSocket’ы в платформе 1С. Часть 2

 

Итоги:

  • В первой части мы с вами обсудили, что за зверь этот WebSocket.
  • Обсудили подходы у HTTP запросов и у WebSocket’ов.
  • Посмотрели на WebSocket’ы в СУБД.
  • Посмотрели, как можно создать WebSocket’ы.
  • Попользовались новой обработкой.
  • Создали свой WebSocket сервер на NodeJS с использованием библиотеки ws.
  • Подцепились к своему WebSocket серверу при помощи postman и 1С.
  • Разобрали для чего нужны обработчики и нашли неточности в описании.
  • Сделали сквозной пример.

 

Все материалы выложены в GitHub:

WebSocketIn1C на GitHub

 

На этом завершаю первую часть разбора.

Высплюсь и буду готовить вторую ;)

Всем удачи и интересных проектов!

ТОП-5 ИНСТРУМЕНТОВ ДЛЯ РАЗРАБОТЧИКА 1С

Toolkit, DCT, OneDebugger, PrintWizard, DataFormWizard
со скидкой 20% при покупке от 2х решений!


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

платформа Регистры сведений Интеграция Архитектура GitHub WebSocket WebSockets сервер сервис 8.3.27 DDoS клиент ws wss https http ключ обмен заголовки

См. также

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

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

57600 руб.

26.11.2024    6304    4    3    

7

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    3607    17    2    

19

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

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

36000 руб.

03.08.2020    21383    29    24    

24

Оптовая торговля 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    41021    55    39    

36

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

В расширении реализован механизм интеграции между системой поставщика и Личным кабинетом СДТ. Реализован обмен заказами и реализациями (накладными), предусмотрено отслеживание статусов документов. Расширение предназначено для 1С:УТ 11.4.

35856 руб.

27.11.2024    1958    1    0    

1

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

Внешняя обработка разработана для автоматизации передачи данных между сервисом Vetmanager с 1С: Бухгалтерия 3.0. Решение позволяет загружать документы и справочники из Ветменеджер в 1С:Бухгалтерию, сокращая время на ручной ввод данных и минимизируя ошибки.

12000 руб.

02.02.2021    20400    59    52    

36
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Shmell 576 14.01.25 13:12 Сейчас в теме
Отличная статья! Раскрываются подкопотные детали ) Спасибо )
bladeson; anderson; Evg-Lylyk; cleaner_it; dsdred; +5 Ответить
2. dsdred 4018 14.01.25 13:48 Сейчас в теме
(1) рад, что статья понравилась
sashapere; akR00b; +2 Ответить
3. John_d 6044 14.01.25 16:38 Сейчас в теме
Спасибо, интересно
sashapere; dsdred; +2 Ответить
4. dsdred 4018 14.01.25 16:48 Сейчас в теме
(3) Рад, что статья понравилась.
Вторую часть попробую сделать еще интереснее ;)
5. quazare 3965 14.01.25 18:40 Сейчас в теме
Как думаете, какова судьба сервера взаимодействия, если повсеместно будут внедряться такие «ящики-сокеты», для обмена «всего что угодно»????
6. dsdred 4018 14.01.25 19:00 Сейчас в теме
(5) вопрос интересный. 😁
Скажем так. Малый бизнес не осилит сокеты.
А по остальным, своя ниша, я думаю найдется и там и там. Многое будет зависить от того как будет развиваться система взаимодействия. Я не думаю, что кто-то будет повторять систему взаимодействия, но окошечко онлайн тех суппорта напрашивается.
7. quazare 3965 14.01.25 19:35 Сейчас в теме
(6) Дмитрий, вы хотели написать, что малый бизнес не осилит систему взаимодействия? Сокеты - это как раз что нужно, он системы корпоративных чатов до «ящиков» с прайслистами…..
8. dsdred 4018 14.01.25 19:45 Сейчас в теме
(7) Есть же халявная система взаимодействия(без инсталяции). Её я кстати у среднячков видел.

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

Хм... вот сейчас сижу и думаю для кого система взаимодействия интересна... пока мыслей нет...

Интересный вопрос. Надо подумать. 😁
11. starik-2005 3194 14.01.25 21:38 Сейчас в теме
(8)
Сокеты же
А чем не нравится взаимодействие МП, написанное на 1С, с базой по вебсокету? Прям вот напрашиваеццо...
16. dsdred 4018 15.01.25 05:28 Сейчас в теме
(11) МП - мобильная платформа?
Я хочу кстати и про это в следующих частях поговорить
65. jrat 19.05.25 09:42 Сейчас в теме
(16) А как использовать websocket на мобильной платформе? когда меняю Назначение использования у конфигурации - ветка WebSocket клиенты становится не активна.
66. dsdred 4018 19.05.25 10:47 Сейчас в теме
(65) Хочу вторую часть скидать, пока время не могу найти.
Постараюсь сделать и рассмотреть данную возможность.

Я на мобильной платформе сам еще не пробовал но думаю там надо работать с программным способом -> https://vkvideo.ru/video168885665_456239123
67. jrat 19.05.25 13:10 Сейчас в теме
(66) Видимо не поддерживается в МП
Переменная не определена (WebSocketКлиентСоединения)
<<?>>WebSocketКлиентСоединения.ОткрытьСоединение("websocket-test", "wss://echo.websocket.org", ОбработчикиСокета); (Проверка: Мобильное приложение-клиент)
9. quazare 3965 14.01.25 19:55 Сейчас в теме
(8) в моем понимании - мелкий бизнес -это почти вся массовая оптово-розничная торговля. В моем окружении почти все сидят на веб-сервисах, различных каналах обмена…. Сейчас нет проблем доставить информацию до конечного «потребителя»…

Система взаимодействия и ее аналоги как раз интересны для внутрибазовых рабочих групп-чатов… когда, например, есть база 200 гб - в ней 30-40 пользователей… да, я считаю это «малым» бизнесом
10. dsdred 4018 14.01.25 20:12 Сейчас в теме
(9) малый считаю до 100 человек и обороты до лярда за год. Я зарекся больше с такими конторами работать.

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

В эту сторону можно что то придумать.
12. starik-2005 3194 14.01.25 21:41 Сейчас в теме
(10)
ВебСокет как канал например приёмки заказов, заявок.
А нужно ли постоянное соединения для этого? Заказы и заявки и по почте ходят отлично. А вот с терминалами сбора данных в режиме онлайн как удаленная клавиатура - уже интересно, т.к. прямо с формы взаимодействие. Сканернул ШК на терминал - он в кассу прилетел пользователю вот прям сразу. Ну и прочее.
15. dsdred 4018 15.01.25 05:27 Сейчас в теме
(12) по заказам остатки в режиме онлайн нужны, поэтому конечно нужно постоянное соединение если по взрослому делать.

Плюсом организация заказов на кухню блюд в ресторанах, кафе.

Да много, что можно придумать.
17. starik-2005 3194 15.01.25 10:23 Сейчас в теме
(15)
по заказам остатки в режиме онлайн нужны
Ну это решается обычными веб-сервисами, когда при попытке отгрузить корзину система проверяет остатки. Вебсокет не решит проблемы конфликтов, т.к. остатки отображаются на момент добавления товара в корзину, а не на момент резервирования.

По поводу кухни - вполне.

Остается проблема написать вебсокет-сервер для организации всего этого безобразия )
21. dsdred 4018 15.01.25 11:08 Сейчас в теме
(17)
Ну это решается обычными веб-сервисами, когда при попытке отгрузить корзину система проверяет остатки. Вебсокет не решит проблемы конфликтов, т.к. остатки отображаются на момент добавления товара в корзину, а не на момент резервирования.


Тут вопрос скорее бизнеса, как они это видят.
Кого-то устраивает что клиент нажимает заказать а ему сообщение "Ты долго думал вот эти товары закончились"
Кому-то нравится чтобы во время заказа у клиента была информация о текущих остатках "много", "3 шт"
25. starik-2005 3194 15.01.25 11:25 Сейчас в теме
(21)
чтобы во время заказа
Ну открыл ты озон или яндыкс, вулдбериз или алик. Ну и видишь там "много"/"3 шт"/"товар закончился". Как это тебе поможет? Это маркетинговая инфа, ибо когда почти не осталось, то ты купишь то, что откладывал. На оптовиков такое не особо действует, а рознице 100% такое в онлайн не нужно - там есть корзина, и некоторые вопросы решаются уже после того, как сборщик пошел собирать и не нашел что-то. Это никого не напрягает, т.к. не угадаешь никогда + человский фактор. Оптовику это важно в момент резервирования, чтобы система зарезервировала то, что смогла, а о том, что не смогла, сообщила. Тут нигде вебсокет не нужен, имха...
26. dsdred 4018 15.01.25 11:28 Сейчас в теме
(25)
Ну открыл ты озон или яндыкс, вулдбериз или алик. Ну и видишь там "много"/"3 шт"/"товар закончился". Как это тебе поможет?


Меня это бодрит и я заказываю быстрее. 😁
13. shchukin_vv 14.01.25 23:07 Сейчас в теме
Интересно, почему сразу в платформу не завезли функционал websocket сервера. Чтобы не было необходимости поднимать какой-либо сторонний сервис. Или это на потом?))
14. dsdred 4018 15.01.25 05:23 Сейчас в теме
(13) Http-сервисы северную часть реализовать было проще. По вебсоккетам довольно таки сложная задача, очень много вариаций с логикой. Я думаю если и сделают то не скоро.
18. starik-2005 3194 15.01.25 10:25 Сейчас в теме
(14)
По вебсоккетам довольно таки сложная задача
Сложная скорее из-за того, что придется соединение поддерживать постоянно. В веб-сервисах это делает веб-сервер, который дергает 1С через компоненту интеграции, но вебсокеты он не умеет, так что придется 1Су что-то такое отдельное в виде агента вебсокет-сервера написать.
19. dsdred 4018 15.01.25 11:06 Сейчас в теме
(18) Я бы на месте 1с это делал не в рамках платформы, а совершенно новый отдельный продукт.
20. starik-2005 3194 15.01.25 11:07 Сейчас в теме
(19)
а совершенно новый отдельный продукт
У них уже есть сервер взаимодействия, который этот "отдельный продукт". Для веб-сокета достаточно отдельного агента.
22. dsdred 4018 15.01.25 11:10 Сейчас в теме
(20) Сервер взаимодействия можно использовать чтобы получить сообщения например С Кролика?
Хотя... Можно в шине сделать коннектор конечно...
23. starik-2005 3194 15.01.25 11:20 Сейчас в теме
(22)
С Кролика
Так кролик - сам себе сервер. 1С тут в качестве клиента. А если хочется напрямую к 1С-серверу по вебсокету законнектиться - тут нужен какой-то агент, фактически отдельный тред, который будет мессаги посылать серверу 1С, дергая его за серверные функции вебсокет-сервера (как это сделано с веб и хттп сервисами).
24. dsdred 4018 15.01.25 11:22 Сейчас в теме
(23) интересно в 1С думают в эту сторону?
27. SirAlex 15.01.25 12:33 Сейчас в теме
Спасибо!
Очень информативно и оформление радует.
28. dsdred 4018 15.01.25 12:40 Сейчас в теме
(27) рад, что статья понравилась.
29. Leits 2 15.01.25 16:46 Сейчас в теме
Автор, красавчик, не первый раз вижу твои статьи - очень удобная и актуальная подача материала.
30. dsdred 4018 15.01.25 16:50 Сейчас в теме
(29) Спасибо за добрые слова!
Очень приятно когда людям полезны статьи. Понимаешь, что не зря потратил силы и время.
31. user612295_death4321 16.01.25 12:03 Сейчас в теме
Статья понравилась. Возможно стоит упомянуть о существовании готовых решений с сервером для веб-сокета? Наверняка что-то подобное уже существует, чем мы постоянно с нуля будем писать код на другом ЯП.

Centrifugo какой нибудь бы справился с задачей сервера веб-сокетов ?
32. dsdred 4018 16.01.25 12:23 Сейчас в теме
(31) Добрый день.
Первоначально задача объяснить как это все работает, а дальше показать какие-то решения.
Моя цель не просто дать ружье, а научить выживать без него ;) Дать кругозор.
Без фундамента дом строить нет смысла.
33. user612295_death4321 16.01.25 12:28 Сейчас в теме
(32)
но задача объяснить как это все работает, а дальше показать какие-то решения.
Моя цель не просто дать ружье, а научить выживать без него ;) Дать кругозор.
Без фундамента дом строить нет смысла.


Жаль. Имхо это была бы очень полезная информация, перечень готовых решений, которые без геморроя можно запустить в каком нибудь докере.
34. dsdred 4018 16.01.25 13:03 Сейчас в теме
(33) подумаю в этом направлении.
35. starik-2005 3194 16.01.25 13:46 Сейчас в теме
(34)
подумаю
Если вы никогда раньше не слышали о Centrifugo, это масштабируемый сервер обмена сообщениями в реальном времени с открытым исходным кодом, написанный на языке Go. Centrifugo может мгновенно доставлять сообщения онлайн-пользователям приложения, подключенным через поддерживаемые транспорты (WebSocket, HTTP-streaming, SSE/EventSource, GRPC, SockJS, и теперь WebTransport). Centrifugo имеет концепцию канала — так что это PUB/SUB сервер.

На днях я прочитал статью о WebTransport API как будущей альтернативе или даже замене WebSockets. Мне стало интересно, что это такое и с чем его едят. Давайте разбираться вместе.
1С опять опоздала?
Прикрепленные файлы:
VladC#; handscenter; tolyan_ekb; cam180; dsdred; +5 Ответить
36. dsdred 4018 16.01.25 22:32 Сейчас в теме
(35)
На днях я прочитал статью о WebTransport API как будущей альтернативе или даже замене WebSockets. Мне стало интересно, что это такое и с чем его едят. Давайте разбираться вместе.


Заинтересовали. Допишу по сокетам что запланировал и займусь.
37. zavedeev 18.01.25 00:33 Сейчас в теме
Спасибо, интересно
38. dsdred 4018 18.01.25 10:04 Сейчас в теме
(37) рад, что понравилась статья.
39. user700522_lerner584 23.01.25 08:44 Сейчас в теме
Клиент.ПараметрыСоединения - В справке написано только чтение, но я добавлял заголовки. Ниже пример с доказательством.

и далее в статье пример:
Процедура ПередПодключением(Клиент)

   Клиент.URLСервера = "wss://ws.postman-echo.com/raw";
   Клиент.ПараметрыСоединения.Заголовки.Вставить("Authorization","Bearer 123");
   Клиент.ИмяПользователяИнформационнойБазы = "Администратор";

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


Полагаю, в справке нет ошибки. Когда пишут, что
ПараметрыСоединения
доступно только для чтения, имеется в виду, что нельзя написать:

Клиент.ПараметрыСоединения = <чему-то там>


в этом смысле оно действительно доступно только для чтения, для это как-бы выполняется оператор ".", следующий сразу после. Там читается какой-то следующий (составной) объект, у которого доступны какие-то методы для работы в данном случае.
40. dsdred 4018 23.01.25 08:51 Сейчас в теме
(39) В ваших словах логика есть.
Просто я понимаю вот так -> нельзя редактировать в принципе.
Грубо говоря если нельзя менять паспорт - это значит и фамилию в нем не получится сменить...
А у 1С получается паспорт менять нельзя, но можно штрихкодом фамилию закрасить и сверху написать новую.

П.С. К сожалению фирма 1С так и не научилась писать хорошую документацию с четкими формулировками...
41. Torin99 286 03.02.25 11:22 Сейчас в теме
Интересно было бы посмотреть пример использования веб-сокета в 1с и брокера сообщений. Той же Кафки например...
42. dsdred 4018 03.02.25 11:26 Сейчас в теме
(41) во второй части вряд-ли. Хотя может быть с кроликом...
43. sharindv 04.02.25 14:01 Сейчас в теме
(42) С кроликом пока не получилось через WebSTOMP.
Благодаря вашей статье (точнее WebSocket-серверу на JS) выяснил,
что 1С при отправке режет сообщение по символу с кодом 0:
при отправке "CONNECT"+Символ(0)+"login:guest" приходит только "CONNECT".
Аналогичное поведение и при отправке двоичных данных - режет по нулевому байту.
Бага тестового релиза или фича реализации websocket от 1С - пока непонятно.
P.S.: Символ NUL (код 0) нужен для обозначения конца сообщения в протоколе STOMP
44. dsdred 4018 04.02.25 14:23 Сейчас в теме
(43) Да, я слышал, что есть проблема с двоичными данными
https://bugboard.v8.1c.ru/error/000168270

Пока не ясно 1с ее починит в 8.3.27 или перенесет на 8.3.28
Прикрепленные файлы:
sharindv; +1 Ответить
45. gofrom 12.02.25 00:01 Сейчас в теме
(43) Подключиться к кролику можно поверх 2-х протоколов это STOMP и MQTT. Первый текстовый, второй бинарный. STOMP невозможно реализовать из-за неадекватного поведения Символ(0). У вас в примере неправильная команда должна быть примерно такая:
frame = "CONNECT\n"
            + "login: websockets\n";
            + "passcode: rabbitmq\n";
            + "nickname: anonymous\n";
            + "\n\n\0";

NUL должен быть в конце, но все равно не работает( Эту ошибку я не стал регистрировать, надеялся что получится с протоколом MQTT, но там еще хуже, ДвоичныеДанные обрезаются до первого байта 0x00. У меня почти готова реализация MQTT, но применить в 1С ее невозможно и видимо нескоро.
sharindv; dsdred; +2 Ответить
58. sharindv 20.03.25 12:14 Сейчас в теме
(45) я в курсе что по стандарту STOMP в конце сообщения должен быть нулевой байт
просто на таком примере сразу видно, что сообщение обрезано

кстати вышла 8.3.27.1441 - там пофиксили этот баг (нулевой байт проходит)
пошел мучить рэббит
59. gofrom 24.03.25 22:52 Сейчас в теме
(58)
кстати вышла 8.3.27.1441 - там пофиксили этот баг (нулевой байт проходит)
пошел мучить рэббит

Через MQTT работает, проверено!
60. dsdred 4018 24.03.25 22:53 Сейчас в теме
61. luckma 16.04.25 21:05 Сейчас в теме
(59) А получилось с кроликом?
У меня handshake: The WebSocket handshake was declined by the remote peer (boost.beast.websocket, 20)
пока нет счастья.
62. gofrom 19.04.25 22:54 Сейчас в теме
(61) Да, всё работает, я же написал в (59). MQTT накладывает свои особенности работы с кроликом, но меня устраивает, механизм dead letter получилось заюзать.
63. luckma 12.05.25 23:17 Сейчас в теме
(62) не могу ничего внятного найти. пробую WEB MQTT. По логам кролика
Web MQTT: 'mqtt' not included in client offered subprotocols: undefined

Протокол Web STOMP вроде работает, но это не то что хочется

Есть рабочий пример? Всю голову поломал
64. gofrom 13.05.25 18:04 Сейчас в теме
(63) Web STOMP точно работает? У меня Символ(0) все ломает.

MQTT нужно реализовать, это бинарный протокол он работает поверх Websocket
После подключения по Websocket нужно передать команду CONNECT, получить положительный ответ CONNACK. И потом можно отправлять и получать сообщения.
Описание протокола MQTT
Реализовывать версию 5.0 не обязательно, так как не весь функционал поддерживает RabbitMQ да оно и не нужно в 1С.

Рабочий пример не особо поможет, нужно вкурить как работать/настроить RabbitMQ c MQTT, вообщем просто не будет. Плюс, не понятно как эта история себя проявит под нагрузкой.
68. sharindv 03.06.25 14:07 Сейчас в теме
(64)
Web STOMP точно работает?

работает - проверено, коннект держит хорошо
но учтите, что это Rabbit через STOMP через Websocket
1С сделало только Websocket, а нужно еще реализовать STOMP (https://stomp.github.io/stomp-specification-1.2.html) и Rabbit (https://www.rabbitmq.com/docs/stomp) - я пока только библиотеку для STOMP написал и то без кадрирования больших сообщений
46. kihawi 20.02.25 20:44 Сейчас в теме
из-за чего возможно такое, что событие ПриОткрытииСоединения не срабатывает? Вроде бы делал все как и вы, но чтото видимо не так..
P.S Сейчас проверил и в файловой базе все нормально происходит. Сервер запущен локально как и WS
47. dsdred 4018 20.02.25 21:48 Сейчас в теме
(46) у меня было такое один раз. Помог перезапуск службы 1с.
49. gofrom 21.02.25 11:58 Сейчас в теме
50. kihawi 22.02.25 10:19 Сейчас в теме
(49) не могу ссылку открыть
51. dsdred 4018 23.02.25 12:11 Сейчас в теме
(50)
WebSocket-клиент
Код ошибки: 60019714
Статус: Принята к исправлению Зарегистрирована: 08.01.2025
Продукт: "Технологическая платформа"
Описание:
При соединении с WebSocket-сервером не вызывается обработчик ПриОткрытииСоединения.
52. kihawi 25.02.25 19:58 Сейчас в теме
"В предметах отладки появились WebSocket и WebSocket(файловый вариант):" где найти эти пункты?
В пункте Отладка>Подключение нет ws
53. dsdred 4018 25.02.25 21:59 Сейчас в теме
(52) ох. Я файловую не смотрел.
54. kihawi 25.02.25 22:03 Сейчас в теме
(53) И на серверной смотрел😢 у меня ничего там нету. Тег дебаг ставил
55. dsdred 4018 26.02.25 00:45 Сейчас в теме
(54) включите отладку по http.
-debug -http
56. kihawi 26.02.25 08:36 Сейчас в теме
(55) ааа вот оно как делается) спасибо
57. gofrom 26.02.25 14:18 Сейчас в теме
(52)
8.5 нет, только 8.3.27
48. kihawi 21.02.25 06:30 Сейчас в теме
(47) Уже пробовал, не помогло. Спасибо за ответ, будем разбираться дальше😀
69. user595194_bendery_sh 05.06.25 14:09 Сейчас в теме
Websocket сервер имеет возможность посылать сообщение только одному из нескольких подключенных клиентах?
70. dsdred 4018 05.06.25 14:14 Сейчас в теме
(69)
Websocket сервер имеет возможность посылать сообщение только одному из нескольких подключенных клиентах?

Добрый день, да. Я хотел про это во второй части писать. Пока по времени не вышло.
71. user595194_bendery_sh 06.06.25 09:46 Сейчас в теме
(70) ищу способ гонять файл туду-сюда RDP 1c и комп клиента без полинга каталогов. Может сокеты решать проблему?
72. dsdred 4018 06.06.25 09:53 Сейчас в теме
(71) Конечно можно. Например в бинарном виде.
Глянте кстати мою публикацию про матрешку -> https://infostart.ru/1c/reports/2270151/
После нее прийдет понимание, что все в нашей жизни цифры которые можно представить в 1 и 0
73. user595194_bendery_sh 06.06.25 13:20 Сейчас в теме
(72) ФАЙЛ текстовый. А как будет выглядеть схема?
на сервере RDP создать сервер сокетов, к которому подключается 1с на localhost и клиенты RDP на WS//222.333.444.555.
И как то 1с8 на сервере кидает файл в канал этого клиента (можно по имени привязывать).
Клиент принимает обрабатывает и отсылает обратно в сеанс RDP.
Так видится?
74. asikpro13 17.08.25 16:33 Сейчас в теме
Доброе время суток, подскажите, из всех обработчиков срабатывает только обработчик ПередПодключением в ВебСокетКлиенте(проверял с помощью команды Сообщить() и смотрел выходит сообщение с обработка или нет), может кто то сталкивался с такой проблемой? 1с изучаю 3 недели по этому может чего то не знаю
75. dsdred 4018 17.08.25 18:45 Сейчас в теме
(74) Добрый вечер. Почему же только ПередПодключением.
В примере я логиню все в регистр как вы помните из статьи.

Смотрите что в регистре на приложенной картинке.
Прикрепленные файлы:
76. asikpro13 17.08.25 20:12 Сейчас в теме
(75) Я пошел наверно немного проще путем, у меня по какой то причине история с регистрами не заработала и я просто выводил все через команду сообщить, внутри передавал строку которая описывала состояние(открывается/открыто/ошибка и тд в зависимости от обработка), вот в том то и вопрос что я попробовал уже разные веб серверы(node-тот что из статьи/FastApi/WebSockets python) во всех трех соединение открывается, но 1с никак не реагирует на отправку в неё сообщения/закрытия соединения/открытия соединения, реагирует только ПередПодключением, вот и не знаю в чем проблема, копаю уже несколько дней и подсказать не кому с данной ситуацией
Версия платформы - 1С:Предприятие 8.3 (8.3.27.1688)
77. dsdred 4018 17.08.25 20:15 Сейчас в теме
(76) Посмотрите вторую часть статьи, там я подключал вебсокеты программно и подключал обработчики из самой обработки. Побробуйте так.
Для отправки сообщения требуется регистрация/авторизация