Как принять и обработать TCP/IP-пакеты в 1С: все способы от внешних компонент до HTTP-сервисов

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

В промышленной автоматизации часто возникает задача интеграции 1С с различным цеховым оборудованием: весами, сканерами, конвейерными линиями и тач-панелями (в том числе под управлением устаревших операционных систем вроде Windows CE). Типичный сценарий: оператор нажимает кнопку на аппаратном терминале, и внешняя программа отправляет «сырой» TCP/IP-пакет по локальной сети. Давайте подробно разберем, способна ли платформа 1С перехватывать и обрабатывать такие пакеты напрямую, и какие архитектурные подходы сегодня считаются наиболее надежными и современными.

Понимает ли 1С TCP/IP-пакеты «из коробки»?

Если мы говорим о классической платформе «1С:Предприятие 8», то встроенного механизма для непосредственного прослушивания произвольного TCP-порта (создания TCP-сервера) в ней нет. Платформа работает на более высоком прикладном уровне (HTTP, SOAP, Web-сервисы, FTP). Она отлично общается по протоколу TCP/IP, когда выступает в роли веб-клиента или веб-сервера, но «послушать» произвольный сокет и самостоятельно разобрать «сырые» байты стандартными средствами встроенного языка не получится.

Тем не менее, решить эту задачу можно несколькими способами. Проанализируем каждый из них — от классических внешних компонент до современных архитектурных паттернов с использованием веб-технологий.


Решение 1. Использование внешней компоненты (TCP-сервер внутри 1С)

Самый очевидный способ заставить 1С слушать конкретный TCP-порт — использовать внешнюю компоненту (ВК). Исторически для этого применялся элемент ActiveX (например, библиотека MSWinsock.ocx), но сегодня это решение считается устаревшим из-за проблем с разрядностью (32/64 бит) и привязки исключительно к операционной системе Windows.

Современный подход — использование кроссплатформенных внешних компонент, разработанных по технологии Native API (на языках C++ или Rust). Такая компонента загружается в сеанс 1С, открывает указанный порт на сервере или клиенте и начинает ожидать входящие подключения.

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


Процедура ПриНачалеРаботыСистемы()
    // Инициализируем внешнюю компоненту TCP-сервера
    Попытка
        ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTCP", "TCPAgent", ТипВнешнейКомпоненты.Native);
        TCPСервер = Новый("AddIn.TCPAgent.TCPServer");
        // Запускаем прослушивание порта 5001
        TCPСервер.ЗапуститьСервер(5001);
    Исключение
        ЗаписьЖурналаРегистрации("TCP.Ошибка", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    // Проверяем, что событие пришло от нашей компоненты
    Если Источник = "TCPAgent" И Событие = "DataReceived" Тогда
        // Передаем полученную строку на сервер для разбора
        РазобратьПакетНаСервере(Данные);
    КонецЕсли;
КонецПроцедуры

Преимущества решения: обмен происходит напрямую между тачскрином и 1С без промежуточных баз данных.

Недостатки: если внешняя компонента написана некорректно, любая критическая ошибка в ее C++ коде может привести к аварийному завершению рабочего процесса 1С (rphost). Кроме того, удерживать постоянное соединение в сеансе пользователя не всегда надежно.


Решение 2. Архитектурный паттерн с промежуточным веб-прокси (Рекомендуется)

Чтобы обезопасить сервер 1С от сбоев и исключить использование сомнительных внешних компонент, на практике часто применяют схему с легким промежуточным звеном. Выясним, как она работает.

На сервере поднимается простейший скрипт-демон (написанный на Python, Node.js или Go), который выполняет роль транслятора. Он выполняет следующие действия:

  1. Слушает определенный TCP-порт, куда программа с тачскрина отправляет пакеты.
  2. Принимает пакет и считывает его текстовое или бинарное содержимое.
  3. Пересылает эти данные в 1С посредством стандартного HTTP POST-запроса на встроенный HTTP-сервис 1С.

Давайте посмотрим, как в 1С настраивается HTTP-сервис для приема таких транслированных пакетов. Создадим в конфигураторе HTTP-сервис с именем ConveyorIntegration и шаблоном URL /pushData. Для метода POST напишем следующий обработчик:


Функция pushDataPOST(Запрос)
    Ответ = Новый HTTPСервисОтвет(200);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    
    // Читаем тело запроса, переданное нашим прокси-скриптом
    СтрокаДанных = Запрос.ПолучитьТелоКакСтроку("UTF-8");
    
    Попытка
        // Предполагаем, что прокси-сервер завернул данные в формат JSON
        Чтение = Новый ЧтениеJSON;
        Чтение.УстановитьСтроку(СтрокаДанных);
        ДанныеПакета = ПрочитатьJSON(Чтение);
        Чтение.Закрыть();
        
        // Вызываем логику обработки данных (например, фиксацию партии на конвейере)
        ЗафиксироватьСобытиеПроизводства(ДанныеПакета);
        
        СтруктураОтвета = Новый Структура("success", Истина);
    Исключение
        СтруктураОтвета = Новый Структура("success", Ложь, "error", ОписаниеОшибки());
        Ответ.КодСостояния = 500;
    КонецПопытки;
    
    // Отправляем ответ прокси-серверу
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку();
    ЗаписатьJSON(Запись, СтруктураОтвета);
    Ответ.УстановитьТелоИзСтроки(Запись.Закрыть(), "UTF-8");
    
    Возврат Ответ;
КонецФункции

Преимущества решения: абсолютная стабильность платформы 1С. HTTP-сервисы работают «из коробки», масштабируются стандартными средствами веб-серверов (IIS, Apache, Nginx) и не требуют регистрации сторонних DLL-библиотек.


Решение 3. Переход на нативный HTTP/WebSockets обмен (если есть доступ к исходному коду тачскрина)

Если проект находится на стадии проектирования, и программу для тач-панели под Windows CE вы можете доработать или заказать ее доработку, откажитесь от отправки «сырых» TCP-пакетов. Настаивайте на использовании прикладного протокола HTTP.

Любой современный язык программирования на WinCE (будь то C#, C++ или VB.NET) имеет встроенные библиотеки для выполнения HTTP-запросов (например, класс HttpWebRequest в .NET Compact Framework). В этом случае программа на тачскрине будет напрямую вызывать HTTP-сервис 1С, передавая структурированные данные в формате JSON или XML.

Если же критически важна мгновенная двусторонняя связь без постоянных HTTP-запросов, обратите внимание на технологию WebSockets, которая работает поверх TCP. Начиная с версии 8.3.27, в платформе «1С:Предприятие» появился штатный объект WebSocket-клиент, позволяющий поддерживать постоянное полнодуплексное соединение напрямую.


Решение 4. Терминальный доступ или Веб-клиент вместо стороннего софта

Рассмотрим ситуацию с другой стороны: зачем писать отдельное приложение для WinCE, которое генерирует TCP-пакеты, а потом героически перехватывать их в 1С? Если тачскрин используется исключительно для ввода данных сотрудником (нажал кнопку «Брак», нажал кнопку «Старт партии»), мы можем отобразить интерфейс самой 1С непосредственно на мониторе тач-панели!

Для операционной системы Windows CE доступны следующие варианты:

  1. RDP-клиент (Удаленный рабочий стол): в WinCE встроен отличный клиент терминального доступа. Вы можете настроить автоматическое подключение к терминальному серверу под учетной записью с ограниченными правами, где в качестве оболочки будет сразу запускаться тонкий или толстый клиент 1С с открытой специализированной формой под тачскрин.
  2. Браузер (Веб-клиент): если веб-клиент 1С слишком «тяжел» для древнего встроенного браузера WinCE, можно развернуть простейшую, адаптированную под мобильные устройства веб-страницу на обычном HTML/JS, которая будет общаться с 1С через HTTP-сервисы, предоставляя рабочему удобные крупные кнопки на экране.

Перспективные технологии: Среда «1С:Элемент»

Для полноты картины упомянем новую технологическую ветку — среду разработки «1С:Элемент». В отличие от классической платформы, в стандартную библиотеку «1С:Элемента» уже встроен полноценный инструмент для низкоуровневой работы с TCP-сокетами.

В пакете Стд::Tcp доступны готовые типы БлокирующийСерверTcp и СоединениеTcp. Если ваша инфраструктура позволяет использовать приложения на базе «1С:Элемент» в качестве интеграционных шлюзов, вы сможете развернуть полноценный TCP-сервер, обрабатывающий входящие потоки байтов от оборудования, написав всего несколько строк кода без использования каких-либо внешних библиотек и прокси.

Резюме

Принимать и обрабатывать TCP-пакеты в экосистеме 1С можно и нужно. Выбор метода зависит от архитектуры вашего проекта:

← На главную