Как реализовать работу с WebSockets в 1С для интеграции с внешними сервисами

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Анализируем причину ошибки при вызове .NET библиотек

Разберем ситуацию, с которой часто сталкиваются разработчики при попытке использовать знакомые инструменты из экосистемы .NET. Попытка создать объект Новый COMОбъект("System.Net.WebSockets.ClientWebSocket") чаще всего приводит к ошибке "Недопустимая строка с указанием класса". Выясним причину этого поведения.

Классы стандартной библиотеки .NET Framework (или .NET Core/5+) не являются COM-серверами по умолчанию. Чтобы 1С могла "увидеть" такой класс через механизм COM, должны быть выполнены следующие условия:

  1. Класс должен быть помечен атрибутом [ComVisible(true)].
  2. Библиотека должна быть зарегистрирована в реестре Windows с помощью утилиты regasm.exe.
  3. Для .NET классов необходима генерация библиотеки типов (TLB).

Поскольку системные классы Microsoft не предназначены для прямого использования через COM без специальной "обертки" (Wrapper), этот путь является тупиковым для быстрой разработки. Рассмотрим более современные и стабильные альтернативы.

Решение 1: Использование нативной поддержки в платформе 1С (версия 8.3.18+)

Начиная с версии платформы 8.3.18, фирма "1С" добавила встроенные средства для работы с этим протоколом. Это самый надежный и поддерживаемый способ. Основными объектами здесь выступают КлиентВебСокета и СоединениеКлиентаВебСокета.

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

Проанализируем пример кода для инициализации соединения:


// Создаем объект клиента
Клиент = Новый КлиентВебСокета();

// Описываем процедуры-обработчики событий
ОповещениеПриСоединении = Новый ОписаниеОповещения("ПриУстановкеСоединения", ЭтотОбъект);
ОповещениеПриПолученииТекста = Новый ОписаниеОповещения("ПриПолученииТекста", ЭтотОбъект);
ОповещениеПриОшибке = Новый ОписаниеОповещения("ПриОшибкеСоединения", ЭтотОбъект);

// Пытаемся подключиться к серверу (например, биржи)
Клиент.ПодключитьсяАсинхронно("wss://echo.websocket.org", ОповещениеПриСоединении, ОповещениеПриОшибке);

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


Процедура ПриПолученииТекста(Сообщение, ДополнительныеПараметры) Экспорт
    // Здесь мы получаем текст от сервера
    ТекстСообщения = Сообщение.Данные;
    Сообщить("Получены котировки: " + ТекстСообщения);
КонецПроцедуры

Преимущества: полная поддержка со стороны вендора, отсутствие внешних зависимостей, корректная работа в 64-битных клиентских приложениях.

Решение 2: Использование внешних компонент (Native API)

Если ваша конфигурация работает на версии платформы ниже 8.3.18 или вам требуются специфические настройки протокола (например, особая работа с прокси-серверами или специфические методы аутентификации), следует рассмотреть внешние компоненты.

Разберем, как это работает. Компоненты на технологии Native API пишутся на C++ или C# и подключаются к 1С как расширение возможностей платформы. Популярные библиотеки, такие как websocket-sharp, часто оборачиваются в такие компоненты.

Процесс работы выглядит следующим образом:

  1. Загрузка компоненты в макет конфигурации.
  2. Подключение через УстановитьВнешнююКомпоненту.
  3. Использование метода ПодключитьВнешнююКомпоненту.
  4. Обработка входящих данных через событие ВнешнееСобытие.

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

Решение 3: Прокси-сервис ( Sidecar-архитектура)

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

В этой схеме мы используем сторонний язык программирования (например, Python или Node.js) для создания небольшого сервиса-прокладки. Этот сервис:

Рассмотрим пример логики на стороне такого сервиса (псевдокод):


// Скрипт получает данные от биржи
websocket.on('message', (data) => {
    if (data.priceChange > threshold) {
        // Отправляем в 1С только значимые изменения
        http.post('http://1c-server/hs/exchange_data', data);
    }
});

Такой подход позволяет 1С работать в привычном режиме HTTP-сервисов, не удерживая тяжелые постоянные соединения на стороне сервера приложений.

Важные аспекты безопасности и SSL

Проанализируем ситуацию с безопасными соединениями (протокол wss://). Поскольку биржи всегда используют шифрование, 1С должна доверять сертификату сервера. Если вы используете встроенный КлиентВебСокета, убедитесь, что:

Резюмируем: Для большинства современных задач оптимальным выбором будет использование штатных средств платформы 8.3.18+. Однако для сложных, высоконагруженных систем обмена данными с биржами наиболее профессиональным решением будет вынос логики работы с сокетами во внешний микросервис.

← На главную