WebSocket Клиент / Сервер. Внешний компонент

22.12.18

Разработка - Разработка внешних компонент

Реализация протокола WebSocket. Клиентская часть для взаимодействия с внешними сервисами. Серверная часть для организации собственного сервера, принимающего клиентские соединения в многопоточном режиме. Возможно взаимодействие RabbitMQ Slack Asterisk и другие

Скачать файлы

Наименование Файл Версия Размер
WebSocket Клиент / Сервер. Внешний компонент win_x86
.dll 2,75Mb
58
.dll 2,75Mb 58 Скачать
WebSocket Клиент / Сервер. Внешний компонент: win_x64
.dll 3,82Mb
97
.dll 3,82Mb 97 Скачать
server.pem (пароль "test")
.pem 3,40Kb
25
.pem 3,40Kb 25 Скачать

Актуальная документация здесь 1c-websocket.readthedocs.io

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

Основной смысл протокола - держать постоянное соединение между сервером и клиентом для обмена данными.

Данная разработка содержит в себе как Клиент так и Сервер websocket.

Для реализации сервера можно использовать такой алгоритм:

Регламентное задание с расписанием повторять каждую 1 секунду запускается на сервере, прослушивает порт и принимает соединения.

Если обработка входящих сообщений занимает продолжительное время - запускаем фоновое задание обработки и с ИД клиента. Затем возвращаем результат клиенту, если это требуется.

Позволяет подключаться и принимать подключения в роли сервера как в режиме без шифровки (ws://), так и используя протокол шифрования (wss://) (сертификат .pem (для примера в приложении))

 
 RabbitMQ
 
Пример SLACK

Собрать в архив файлы компонента поможет обработка

По теме:

Тестировалось на платформе 8.3.11.

См. также

Медиадисплей. Рекламный информационный монитор для покупателя.

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

Монитор покупателя может отображать текущую покупку на кассовом месте, показывать видеорекламу, баннеры, во время простоя разворачивать рекламу на весь экран. Можно использовать в качестве графического меню-борда в кафе и видеовывески. Управление выводом на телевизор через hdmi-приставку на базе Windows или Android. В качестве устройства отображения можно использовать Android-планшеты, фоторамки с Android, монитор любого Windows-компьютера, доступного по сети. Настраивается ЛЮБОЙ ДИЗАЙН экрана!

16800 руб.

30.05.2017    52105    34    69    

43

Внешняя компонента для сканирования (замена TWAIN-компоненты БСП) (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).

2400 руб.

12.05.2020    26244    131    99    

83

Внешняя компонента для подключения 1С к телефонии Asterisk

Разработка внешних компонент Телефония, SIP Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)

2400 руб.

04.05.2018    44977    117    64    

60

Внешняя компонента печати PDF (Native Win 32/64)

Разработка внешних компонент Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Внешняя компонента позволяет печатать PDF файлы непосредственно из 1С, не используя при этом сторонних программ. Прекрасно работает на сервере, тонком клиенте и веб-клиенте. Основана на проекте PDFium из состава проекта Chromium/Chrome

1500 руб.

17.09.2018    35081    104    123    

111

Мастер создания внешних компонент 1С (технология COM) для DELPHI 6/7/8/2005/2006/2007/2008/2010/XE/XE2/XE3

Разработка внешних компонент Платформа 1С v8.3 Платные (руб)

Средство для сверхбыстрой разработки внешних компонент 1С:Предприятия 7.7 и 8 по технологии COM на всех версиях DELPHI, начиная с 6.

2000 руб.

28.03.2013    54000    35    14    

68

QR-код с логотипом компании (обычная и управляемая форма)

Разработка внешних компонент Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Как известно, стремление сделать свою рекламную продукцию запоминающейся и выделяющейся — верный путь к успеху. Сегодня, мы поговорим с вами о том, что можно сделать с обычным черно-белым QR-кодом, чтобы он стал более живым и привлекательным. Если вам не терпится попробовать сделать QR-код с логотипом компании, то эта обработка для вас!

2400 руб.

22.06.2016    30840    4    4    

8

Внешняя компонента 1С и С++. Продолжаем разговор.

Разработка внешних компонент Платформа 1С v8.3 Бесплатно (free)

А давайте запилим 8.3.26 до релиза, или оповещение с сервера...

19.02.2024    4039    starik-2005    28    

52

Внешние компоненты 1С и язык C++

Разработка внешних компонент Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Некоторые практические аспекты создания внешних компонент на языке С++ для платформы 1С 8.3++.

26.01.2024    4781    starik-2005    32    

39
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. informa1555 2646 16.11.18 15:00 Сейчас в теме
А чего так мало описания? Я правильно понял что для того чтобы 1Ска приняла сообщение на своей стороне , она должна постоянно по расписанию опрашивать порт т.е. обращаться к компоненте чтобы она это сделала?
2. nomadon 367 16.11.18 15:05 Сейчас в теме
(1) решил не набивать статью примерами или кейсами, а дополнять по вопросам для оценки интересности данных технологий, а по интерфейсу взаимодействия ссылка вначале.

да, конечно, для того что бы принять соединение необходимо постоянно слушать порт. Как вариант, можно подвесить на регламентное задание которое будет постоянно висеть и перезапускаться в случае падения.
3. dyas 17.02.19 18:22 Сейчас в теме
75. DELOVOYDOM 06.03.24 15:02 Сейчас в теме
(2) как вариант, это не вариант. Что значит повесить регламентное задание? вы серьёзно?
4. dyas 19.02.19 02:34 Сейчас в теме
Вопрос. Можно ли принимать/отправлять фалы с сервера на клиент и наоборот. Если да то какого максимального размера ?
5. nomadon 367 19.02.19 06:04 Сейчас в теме
(4) можно двоичные данные кодировать в base64 и передавать как строку, максимальный размер не тестировался, думаю зависит от архитектуры и памями клиента и сервера
6. Masich 14.03.19 14:17 Сейчас в теме
Добрый день.

А как сделать для клиента ожидание сообщения от сервера в фоновом режиме?

Я вижу, что во "ВнешнееСобытие" компонента не сообщает.
7. nomadon 367 14.03.19 17:38 Сейчас в теме
Да, внешних событий нет.

Варианта 2:
1. Блокировать исполнение кода до получения сообщения (или наступления таймаута)
2. Оставить объект компонента в памяти, не блокируя исполнение и периодически возвращаясь к проверке наличия сообщений, при долгих серверных обработках например, или обработчиком ожидания/действием пользователя на клиенте

Если не секрет, какую задачу хотите решить ?
8. Masich 15.03.19 10:21 Сейчас в теме
(7)
>> Если не секрет, какую задачу хотите решить ?
Интеграция с WEB-CRM через REST.
Хочется подвесить соединение и ждать сообщений от CRM.
Я запихнул в обработку ожидания, но не вариант, т.к. "Получить()" получает за раз одно сообщение, а сообщений много, и очередь накапливается.

Было бы хорошо, чтоб компонента во ВнешнееСобытие передавала все поступающие сообщения.
Еще было бы хорошо, чтоб компонента имела фильтрацию сообщений по вхождению текста. Т.к. если от сервера их много, что часто бывает, то 1с может ощутимо тормозить на их фильтрации.
9. nomadon 367 15.03.19 13:47 Сейчас в теме
(8)
вот так тормозит?
Пока Получить(Сообщение, таймаут) Цикл

получите все доступные сообщения, компонент хранит в себе пришедшие сообщения, если их не получать они будут накапливаться в памяти.
10. Masich 15.03.19 18:18 Сейчас в теме
(9)
Я про цикл как-то не подумал.
Спасибо.
11. nomadon 367 15.03.19 18:19 Сейчас в теме
(10) посмотрите примеры в документации, может еще что найдете
40. ROM_1C 691 04.04.20 21:54 Сейчас в теме
(7) А чем это лучше обработки ожидания и получения данных с сервера напрямую?
12. 1739712 23 16.03.19 11:45 Сейчас в теме
добрый день
а какой заголовок отправляется на сервер при подключении?
13. 1739712 23 16.03.19 12:04 Сейчас в теме
меня интересует значение origin

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
ka3a4ok; user709491_gayrat.komilov; +2 Ответить
14. popovm 25.03.19 14:57 Сейчас в теме
Как подключиться к ws-серверу, если клиент закрыт прокси?
Какие настройки inetcfg указать?
15. nomadon 367 25.03.19 16:01 Сейчас в теме
(14) прокси а данном компоненте не поддерживается
16. antonwantstosleep 31.05.19 08:05 Сейчас в теме
Подскажите, а для Linux бинарников нету?
17. nomadon 367 31.05.19 08:23 Сейчас в теме
(16) нет, требуется доработка кода, пока не занимался
18. lagerfield 31.05.19 16:24 Сейчас в теме
Добрый день, мы работаем на платформе 1С:Предприятие 8.1 (8.1.15.14), сможем ли мы подключить эти DLL?
19. Steelvan 302 23.09.19 12:00 Сейчас в теме
Про "поднимать веб-гнезда на сервере сложно" согласен. Через костыли.
Что бы экземпляр компоненты жил в потоке на сервере этот самый поток надо создать.

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

Пока Истина Цикл
Сообщение = ВнешняяКомпонента.ПолучитьСообщение() // Здесь поток замирает до получения сообщения
ОбработкаСообщения(Сообщение);
КонецЦикла
20. karpik666 3760 06.11.19 10:04 Сейчас в теме
Здравствуйте, скачал компоненту, и сразу встал вопрос, ваша компонента умеет передавать заголовки при подключении или нет? Мне нужно реализовать аналог такой функции
websocket.DefaultDialer.Dial(*addr, http.Header{"Authorization": {"Bearer " + *token}})
По факту это аналог вашей, но с передачей заголовков.
Пример с сайта со slack также не подходит, так как в нем вначале вызывается http метод авторизации, а затем уже полученный url передается для соединения без заголовков.
21. nomadon 367 06.11.19 10:16 Сейчас в теме
Добрый, заголовки вроде не делал, slack и так работал, может что-то поменялось
22. karpik666 3760 06.11.19 10:59 Сейчас в теме
(21) получается, если разработчики api дополнительно не предусмотрели, что перед работой через websocket необходимо дополнительно авторизоваться через http, то здесь ваша компонента не поможет? Но это же частный случай.
23. nomadon 367 06.11.19 11:03 Сейчас в теме
Частый да, но такой потребности не было, заголовок это всего лишь первые строки в tcp пакете, сообщение всеравно целиком приходит, по суди заголовок от сырых данных передаваемых первым сообщением мало чем отличается, поэтому слак раньше первым сообщением просил авторизацию и разрывал соединение, если не нравилось, как сейчас - не знаю. Да и уже существенно поменялся интерфейс используемой библиотеки c++, За полчаса заголовки у меня добавить не получится
24. karpik666 3760 06.11.19 11:06 Сейчас в теме
(23) смотрите в описании написано
Позволяет подключаться и принимать подключения в роли сервера как в режиме без шифровки (ws://), так и используя протокол шифрования (wss://)

У меня есть wss ссылка и токен для нее, я могу использовать вашу компоненту для работы или нет?
25. nomadon 367 06.11.19 11:08 Сейчас в теме
Токен это прикладной объект конкретного сервера, по wss подключение поддерживается
26. karpik666 3760 06.11.19 11:12 Сейчас в теме
(25) wss подключение, это подключение с авторизацией, с таким же успехом могло потребоваться передавать логин и пароль, либо id сессии, и в том и другом случае ваша компонента предполагает, что должна быть предварительная http авторизация, при этом должна быть сформирован специальный url, который и будет означать, что вы авторизовались.
Вы когда к сайту подключаетесь по обычному http часто с таким сталкиваетесь? Все обычно передается в заголовках.
27. karpik666 3760 06.11.19 11:25 Сейчас в теме
(25) будет ли выпущена новая версия с учетом текущих замечаний?
28. lazovit 21.11.19 17:29 Сейчас в теме
С сервисом Мои звонки будет работать?
29. lectorkoba 23 03.12.19 14:26 Сейчас в теме
Скачал компоненты и для 32 и для 64. Все в целом удобно, пока не столкнулся с тем что нужно заполнение заголовка "origin". Было бы замечательно конечно если бы параметром можно было его устанавливать. Обновите пожалуйста, без этого не получится ее использовать.
30. lectorkoba 23 03.12.19 15:28 Сейчас в теме
Заметил ошибку
ВебСокетКлиент.Подключиться(АдресСервера);
ВебСокетКлиент.Отключиться();
ВебСокетКлиент.Подключиться(АдресСервера);
Зависает до перезагрузки 1С.
31. ЕСТЬNULL 206 03.03.20 07:15 Сейчас в теме
День добрый. Не понял как использовать серверную часть.

Чтобы прослушивать порт надо создавать объект AddIn.WebSocket.Server, нужно его инициализировать каждую секунду? Или где он должен храниться?

Я так понял в каком-нибудь общем модуле должен болтаться бесконечный цикл с Сервер.Принять(0, ИДКлиента, Данные) в котором будет обработчик приёма и отправки. Принял - оповестил, получил инструкцию по отправке (как...? через регистр сведений например?) - обработал.

У меня должна быть возможность оповестить всех, или часть пользователей о чём-нибудь, поэтому я должен всегда иметь возможность получить объект AddIn.WebSocket.Server с его соединениями. Как это сделать не через попу понять пока не могу.

Односекундное РЗ может быть стартером сервера с бесконечным циклом, а проверять что сервер запущен - как? Телнетом пробивать порт?

Я понимаю, что данная компонента даёт возможность, а дальше уже крутись как хочешь, но может вы уже кто-то соорудил на базе этого что-то нерукозадое? Пока на ум лезет всякая непотребность и гадость, которую нежелательно воплощать в жизнь. Может подскажите свой механизм, как пример? Плиз?
32. nomadon 367 03.03.20 07:35 Сейчас в теме
Метод Сервер.Принять блокирует исполнение кода до получения сообщения или по таймауту. Действительно для постоянного поддержания соединения требуется бесконечный цикл, в котором обрабатываются события и поддерживается соединение с клиентам в этом сеансе.

Если Вы хотите оповестить об изменении состояний, произведенных в другом сеансе - действительно нужен какой то способ передачи данных между сеансами, регистра. хранилище настроек, либо собор данных и отслеживание состояний в этом же сеансе,
например кеш остатков бонусов клиентов, если ПолученоСообщение = Сервер.Принять(5000,... Если Не ПолученоСообщение Тогда при простое сервера сделать запрос в базу, проверить изменилось ли состояние бонусов относительно кеша в текущем сеансе - отправить уведомление.

Да, это всего лишь дополнение возможности платформы. Это не готовое решение и не библиотека с готовым функционалом.

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

- Обмен данными между двумя базами на одном сервере. Модифицирована универсальная обработка выгрузки загрузки по правилам, которая получает текст выгруженного XML и отправляет по соединению. принимающая сторона отправляет полученный текст в фоновое задание на исполнение загрузки, в дуплексе.
Получается что-то вроде брокера сообщений, но сообщения сразу доставляются в приемник, без записи за диск
33. ЕСТЬNULL 206 03.03.20 08:16 Сейчас в теме
Спасибо за ответ!

Ну то есть регламентное задание, примерно вот такого характера:

Если НЕ порт занят (телнет) Тогда (или ... что-то адекватное может? Как проверить компонента зависла или нет?)

Инициализировать сервер

Запустить бесконечный цикл, типа

ПустьРаботает = Истина;
Пока ПустьРаботает Цикл
Если Сервер.Принять(1000, ИДКлиента, Данные) Тогда;
ОбработкаПринятого(Сервер,ИДКлиента,Данные);
КонецЕсли;
ОпросЗаданийКОтправке(Сервер);
КонецЦикла

Не будет являться говнокодом, как вы думаете?

Можно вместо проверки порта проверять актуальность даты последнего опроса заданий... хз..
А как наверняка уничтожить серверное соединение из другого сеанса, если с компонентой что-то случится? (освободить порт)
34. nomadon 367 03.03.20 08:24 Сейчас в теме
(33) компонента выбрасывает исключение, если не может захватить порт для прослушивания

Понятие говнокода - оно относительное, например если разработка вашего решения будет стоить в 10 раз дешевле для бизнеса, то ему (бизнесу) абсолютно наппевать, насколько хорошо или плохо Вас оценит любой другой специалист. С другой стороны, если вдруг Вы покинете этот бизнес и разработку придется поддерживать другому специалисту, который вообще не в курсе про существование таких способов интеграции - другой специалист расскажет что Вы сделали все плохо и это говнокод. Это нужно переделывать и стоить это будет в 10 раз дороже ;)

По идее, Компонента = Неопределено (и компонента.Остановить()) должны освобождать занятые ресурсы. Можно регламентное задание перезапускать с периодичностью и в расписании указать завершать принудительно через...

Как Вы, наверное, знаете в платформе есть механизмы удержания сеансов, соединений, сборщик мусора и т.д. эту совокупность нужно тестировать в комплексе
35. ЕСТЬNULL 206 03.03.20 11:24 Сейчас в теме
Короч потратил сегодня пол дня. Опробовал протокол, написал простейшую авторизацию на токенах (мою первую).
Но, похоже, всё это мне не пригодится. Выкладываю её сюда, может кто-то сэкономит своё время.

Да...уж... думал более-менее клиент интересный написать, соединился при создании формы, а передать дальше объект Клиент нельзя.
Ни запихать во временное хранилище, ни произвольным реквизитом формы... В строку только значение не делал... если бы даже получилось - это всё равно дичь какая-то. Хотя казалось бы объект да объект. С сервером тоже как-то грустно. Впервые почувствовал импотенцию от интерпретируемых языков программирования.

Производителю данной фичи однозначно респект. Интересный опыт. Хоть мозги размял.
Прикрепленные файлы:
WebsocketAuth.dt
39. ROM_1C 691 04.04.20 21:50 Сейчас в теме
(35) я так понимаю, сервер сам по себе не может передать данных на клиента так как не знает его до момента пока клиент не дергнет его. А при каждой отправке сообщения нужно заново подключатся, так как не где держать объект подключения, при этом ид подключения меняется.
Тогда не вижу смысла в компоненте. Сервер можно и так дергать...
user1695313; +1 Ответить
48. ЕСТЬNULL 206 17.04.20 02:58 Сейчас в теме
(39)
Смысл был именно в том, чтобы держать постоянную связь с КЛИЕНТОМ, и хранить идентификаторы соединений с клиентами для того, чтобы при появлении новой информации оповестить КЛИЕНТОМ. То есть смысл именно в том, чтобы дёргать клиентов. То есть где-то должно быть фоновое задание с бесконечным циклом, в котором хранятся подключения.
Такой цикл должен держать актуальную таблицу подключений в памяти, держать соединения, принимать от клиента запросы и опрашивать другую таблицу на предмет заданий для отправки клиентам (например из РС).
В случае появления нового задания - отправлять данные клиенту через уже активное соединение.
36. cprit 874 25.03.20 22:50 Сейчас в теме
Добрый день!
Планируется ли реализовывать сборку под Linux?
37. nomadon 367 27.03.20 09:06 Сейчас в теме
(36) нет пока не планируется. по анонсам платформы - можно будет заменить платформенными функциями
38. ROM_1C 691 04.04.20 21:24 Сейчас в теме
Автор, подскажите, хочу отравить с сервера на клиент, использую метод Отправить(ИДКлиента, ТелоСообщения)
ИДКлиента - это номер соединения. Если я правильно понял, номер меняется при каждом приеме нового сообщения?
Логика така:
открыл форму, подключился к серверу, ожидаю сообщений от сервера..
Где брать идКлиента?
Спасибо.
41. ROM_1C 691 06.04.20 18:38 Сейчас в теме
(38)
равильно понял, номер меняется при каждом приеме нового сообщения?
Логика така:
открыл форму, подключился к серверу, ожидаю сообщений от сервера..

Разобрался. Ид меняеться при каждом новом подключении
42. nomadon 367 06.04.20 21:56 Сейчас в теме
(38) ИД - возвращает объект сервера при каждом новом подключении клиента.
ИД уникальный в рамках сеанса прослушивания соединений сервером, т.к. при разрушении объекта сервера - все соединения разрываются.
43. ROM_1C 691 11.04.20 00:18 Сейчас в теме
Автор, использовали ли вашу копоненту в реальном проекте? Можно ли использовать ее в коммерческом проекте?
Спасибо.
45. nomadon 367 15.04.20 14:44 Сейчас в теме
(43) Сам использовал, если кто-то где то использовал и заработал много денег - мне не сказал)) использовать можно в любом проекте
44. perensona 19 15.04.20 13:06 Сейчас в теме
Непонятно, может ли компонента при подключении к WebSocket передать параметр токена для авторизации ?
Посмотрел в документации - у вас идет авторизация через http, на который вы передаете токен, а http возвращает вам серкретный url, по которому идет просто соединение на WebSocket. В моем случае адрес сокета заранее известен, нужно на него передать такой же токен, как вы делаете по http. Сервис сторонний, изменить его нельзя. Поддерживает ли компонента передачу параметра для авторизации в заголовке через ваш метод "Подключиться"?
46. nomadon 367 15.04.20 14:45 Сейчас в теме
(44) Нет, в текущем исполнении нет возможности передавать заголовки
Slikolia; +1 Ответить
73. ka3a4ok 09.09.22 12:47 Сейчас в теме
(46) Присоединяюсь к просьбе добавить возможность указать заголовки. Компонент скачал, но при более детальном изучении оказалось что нужно заголовок(
74. Slikolia 20.09.22 19:18 Сейчас в теме
(46) Готов лично доплатить, за возможность указания заголовков!
47. perensona 19 15.04.20 20:33 Сейчас в теме
Сложно ли добавить параметр заголовка ? Я почитал выше, и вижу, что многие просили добавить.
49. Maximum.proger 17.06.20 18:11 Сейчас в теме
компонента не подключается на сервере x64
не через файл ни через архив
50. nomadon 367 18.06.20 22:14 Сейчас в теме
(49) телепаты больше не ходят сюда, неверный код в студию, пожалуйста
51. Maximum.proger 19.06.20 11:18 Сейчас в теме
1С:Предприятие 8.3 (8.3.16.1063). Клиент-Сервер.

добавлены 2 общих макета:
WebSocketDll64 - дд, файл dll ВК для x64
WebSocketAddIn - дд, zip архив с файлом манифеста и двумя fфайлам dll 32 и 64.

&НаКлиенте
Процедура TestClient64(Команда)
	
	ПутьКомпоненты = "ОбщийМакет.WebSocketDll64";
	
	ИмяКомпоненты = "WebSocket64";
	
	ТестКомпонентыНаКлиенте(ПутьКомпоненты, ИмяКомпоненты);
	
КонецПроцедуры

&НаКлиенте
Процедура TestClientZip(Команда)
	
	ПутьКомпоненты = "ОбщийМакет.WebSocketAddIn";
	ИмяКомпоненты = "WebSocketAddIn";
	
	ТестКомпонентыНаКлиенте(ПутьКомпоненты, ИмяКомпоненты);
		
КонецПроцедуры


&НаКлиенте
Процедура ТестКомпонентыНаКлиенте(ПутьКомпоненты, ИмяКомпоненты) 
	
	НачатьУстановкуВнешнейКомпоненты(Новый ОписаниеОповещения("ПослеУстановкиВК", ЭтаФорма, Новый Структура("ПутьКомпоненты, ИмяКомпоненты", ПутьКомпоненты, ИмяКомпоненты)), ПутьКомпоненты);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеУстановкиВК(ДопПараметры) Экспорт
	
	НачатьПодключениеВнешнейКомпоненты(Новый ОписаниеОповещения("ПослеПодключенияВнешнейКомпоненты", ЭтаФорма, ДопПараметры), ДопПараметры.ПутьКомпоненты, ДопПараметры.ИмяКомпоненты, ТипВнешнейКомпоненты.Native);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеПодключенияВнешнейКомпоненты(Подключено, ДопПараметры) Экспорт
	
	ИмяКласса = "AddIn." + ДопПараметры.ИмяКомпоненты + ".Client";
	
	Клиент = Новый(ИмяКласса);
	
	АдресСервера = "wss://echo.websocket.org";
	
	Попытка
		Клиент.Подключиться(АдресСервера);
	Исключение
		
		Описание = ОписаниеОшибки();
		ТекстОшибки =  Клиент.ОписаниеОшибки();
		
		ТекстОписания = Описание + ": " + ТекстОшибки;
		
		ВызватьИсключение ТекстОписания;
		
	КонецПопытки;
	
	Клиент.Отключиться();	
	
КонецПроцедуры
Показать


В случае с zip получаем ошибку:

Тип не определен (AddIn.WebSocketAddIn.Client)
{ВнешняяОбработка.TestWebSocket.Форма.Форма.Форма(53)}: Клиент = Новый(ИмяКласса);


Тестирование работы на сервере

&НаСервере
Процедура TestServer64НаСервере()
	ПутьКомпоненты = "ОбщийМакет.WebSocketDll64";
	
	ПодключитьВнешнююКомпоненту(ПутьКомпоненты, "WebSocket64", ТипВнешнейКомпоненты.Native);
	
	Клиент = Новый("AddIn.WebSocket64.Client");
	
	АдресСервера = "wss://echo.websocket.org";
	
	Попытка
		Клиент.Подключиться(АдресСервера);
	Исключение
		
		Описание = ОписаниеОшибки();
		ТекстОшибки =  Клиент.ОписаниеОшибки();
		
		ТекстОписания = Описание + ": " + ТекстОшибки;
		
		ВызватьИсключение ТекстОписания;
		
	КонецПопытки;
	
	Клиент.Отключиться();
КонецПроцедуры

&НаСервере
Процедура TestServerZipНаСервере()
	ПутьКомпоненты = "ОбщийМакет.WebSocketAddIn";
	
	ПодключитьВнешнююКомпоненту(ПутьКомпоненты, "WebSocketAddIn", ТипВнешнейКомпоненты.Native);
	
	Клиент = Новый("AddIn.WebSocketAddIn.Client");
	
	АдресСервера = "wss://echo.websocket.org";
	
	Попытка
		Клиент.Подключиться(АдресСервера);
	Исключение
		
		Описание = ОписаниеОшибки();
		ТекстОшибки =  Клиент.ОписаниеОшибки();
		
		ТекстОписания = Описание + ": " + ТекстОшибки;
		
		ВызватьИсключение ТекстОписания;
		
	КонецПопытки;
	
	Клиент.Отключиться();
КонецПроцедуры
Показать


В случае с zip получаем:
Тип не определен (AddIn.WebSocketAddIn.Client)
{ВнешняяОбработка.TestWebSocket.Форма.Форма.Форма(144)}: Клиент = Новый("AddIn.WebSocketAddIn.Client");
{ВнешняяОбработка.TestWebSocket.Форма.Форма.Форма(166)}: TestServerZipНаСервере();


Через архив ни на сервере, ни на клиенте не подключается.

Текст из файла манифеста:

<?xml version="1.0" encoding="UTF-8"?>
 <bundle xmlns="http://v8.1c.ru/8.2/addin/bundle" name="websocket">
     <component os="Windows" path="1c-websocket_Win_32.dll" type="native" arch="i386"/>
     <component os="Windows" path="1c-websocket_Win_64.dll" type="native" arch="x86_64"/>
 </bundle>
52. user783273 20.08.20 07:46 Сейчас в теме
Добрый день.

А есть демо версия что бы понять будет работать в рамках нашей задачи или нет?

Задача есть служба для обслуживаения терминалов Приватбанк которая общается по протоколу WEBSOCKET и вот не понятно будет ли работать с вашей компонентой.
53. nomadon 367 20.08.20 09:49 Сейчас в теме
(52) Добрый день. Демо нет, но если там используются заголовки - то в текущей версии точно не будет
65. user1398246 24.11.20 15:38 Сейчас в теме
(52)Нашли компоненты для интеграции терминала Приватбанк по WEBSOCKET? Приват не предоставляет?
54. MaxDen 6 20.10.20 03:48 Сейчас в теме
Добрый день. Моно ли у компоненты подавить вывод в "Служебные сообщения". В нашем решении абсолютно нормально когда стучимся на закрытый сокет, хорошобы просто возвращала ошибку и все.
Прикрепленные файлы:
55. nomadon 367 20.10.20 08:44 Сейчас в теме
(54) а это точно не прикладной код выводит? У компоненты есть метод получения ошибки, там сообщение об ошибке
56. DMon 120 20.10.20 10:12 Сейчас в теме
Сколько максимально компонента может держать соединений?
Установил, настроил, вроде всё устраивает.
Не рухнет ли пирамидка при одновременном коннекте, например, 1000+ клиентов?
57. nomadon 367 20.10.20 10:15 Сейчас в теме
(56) Такие тесты не проводились. Здесь же еще от операционной системы (и настроек) зависит или от сервера
58. identificator 13 27.10.20 11:14 Сейчас в теме
Добрый день! Скачал ваши DLL, положил их вместе с MANIFEST.XML в zip-архив, делаю подключение
&НаКлиенте
Процедура УстановитьКомпоненту()
	
 ПутьКомпоненты = Путь_DLL;

 УстановитьВнешнююКомпоненту(ПутьКомпоненты);

 Если НЕ ПодключитьВнешнююКомпоненту(ПутьКомпоненты,"WebSocket", ТипВнешнейКомпоненты.Native) Тогда
     ВызватьИсключение "Ошибка подключения внешнего компонента";
 КонецЕсли;	
КонецПроцедуры
Показать

В результате получаю ошибку
"Установка внешней компоненты не выполнена!
В процессе установки произошла ошибка!
Возможно, отсутствует компонента для используемого клиентского приложения"

Версия платформы
8.3.13.1513
Прикрепленные файлы:
59. nomadon 367 27.10.20 11:18 Сейчас в теме
На клиенте управляемоего приложения необходимо использовать асинхронный метод
60. identificator 13 27.10.20 11:27 Сейчас в теме
(59) У меня не Управляемое приложение, а Обычное.
И о каком конкретно методе речь?
Конфигурация 1С: Управление Торговлей 10.3
61. nomadon 367 27.10.20 11:29 Сейчас в теме
(60) НачатьПодключениеВнешнейКомпоненты
62. identificator 13 27.10.20 11:34 Сейчас в теме
(61) повторюсь, у меня не Управляемый Режим, а Обычное приложение.
Прикрепленные файлы:
63. user1398246 24.11.20 15:35 Сейчас в теме
64. user1398246 24.11.20 15:36 Сейчас в теме
66. DMon 120 04.12.20 20:38 Сейчас в теме
В инструкции написано Клиент.Статус может быть -1, 0 и 1
Когда подключаюсь по ws то он 1, а когда по wss - то 2.
Правильно ли я понял что защищенное соединение возвращает 2? Или это баг?
67. magnumuz 09.09.21 09:34 Сейчас в теме
Добрый день.
Имеются вопросы:
1) Поддерживается ли работа с внешней API которая работает по SocketIO
2) Имеется ли тех. поддержка при внедрении в рабочую базу данных.
68. user996801 04.01.22 13:10 Сейчас в теме
Подскажите что делаю не так : при подключении выдает ошибку Client : Invalid HTTP status. .
ПутьКомпоненты = "D:\3111111\PUBID_937068-1c-websocket_Win_64.dll";
	
	Если НЕ ПодключитьВнешнююКомпоненту(ПутьКомпоненты,"WebSocket", ТипВнешнейКомпоненты.Native) Тогда
		Сообщить("Ошибка подключения внешнего компонента");
		Возврат;
	КонецЕсли;
	
	Клиент_ = Новый("AddIn.WebSocket.Client");
	
	Попытка
		Клиент_.Подключиться("ws://192.168.88.223:3001");
	Исключение
		
		Описание = ОписаниеОшибки();
		ТекстОшибки =  Клиент_.ОписаниеОшибки();
		
		ТекстОписания = Описание + ": " + ТекстОшибки;
		
		Сообщить(ТекстОписания);
		
	КонецПопытки;
Показать
69. s92579 19.07.22 17:54 Сейчас в теме
Добрый день! Данное решение подойдет для получение сообщений от сайта в формате JSON. То есть сайт будет оправлять сообщения в 1с . В ответ 1с должна оповещать о получение данных?
72. nomadon 367 28.07.22 14:49 Сейчас в теме
(69) Это просто транспорт, если сделаете систему оповещений в 1с - будет оповещать. Текущая компонента не генерирует внешнее событие
70. Longinoff 50 28.07.22 14:37 Сейчас в теме
Добрый день. При попытке установить соединение

Попытка
		Клиент.Подключиться(СтрокаПодключения+"/chat?access_token="+Токен);
	Исключение
		Описание = ОписаниеОшибки();
		ТекстОшибки =  Клиент.ОписаниеОшибки();
		ТекстОписания = Описание + ": " + ТекстОшибки;
		ВызватьИсключение ТекстОписания;
	КонецПопытки;

	//!!! Тут все прошло успешно

       ТекстСообщения = ПолучитьСтрокуJSON(Новый Структура("type, target, arguments", "Invocation", "Pong", Новый Массив));
	Клиент.Отправить(ТекстСообщения);
			
	Данные = "";
	Клиент.Принять(0, Данные);
	Значение = ПолучитьЗначениеИзОтветаJSON(Данные);
Показать


мы получаем такие данные в ответе "{"error":"Handshake was canceled."}"

Не подскажете, в чем может быть ошибка?
71. nomadon 367 28.07.22 14:48 Сейчас в теме
(70) Похоже на ошибку работы с сервером, не верные данные отправляются или не верная последовательность
Оставьте свое сообщение