В промышленной автоматизации часто возникает задача интеграции 1С с различным цеховым оборудованием: весами, сканерами, конвейерными линиями и тач-панелями (в том числе под управлением устаревших операционных систем вроде Windows CE). Типичный сценарий: оператор нажимает кнопку на аппаратном терминале, и внешняя программа отправляет «сырой» TCP/IP-пакет по локальной сети. Давайте подробно разберем, способна ли платформа 1С перехватывать и обрабатывать такие пакеты напрямую, и какие архитектурные подходы сегодня считаются наиболее надежными и современными.
Если мы говорим о классической платформе «1С:Предприятие 8», то встроенного механизма для непосредственного прослушивания произвольного TCP-порта (создания TCP-сервера) в ней нет. Платформа работает на более высоком прикладном уровне (HTTP, SOAP, Web-сервисы, FTP). Она отлично общается по протоколу TCP/IP, когда выступает в роли веб-клиента или веб-сервера, но «послушать» произвольный сокет и самостоятельно разобрать «сырые» байты стандартными средствами встроенного языка не получится.
Тем не менее, решить эту задачу можно несколькими способами. Проанализируем каждый из них — от классических внешних компонент до современных архитектурных паттернов с использованием веб-технологий.
Самый очевидный способ заставить 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). Кроме того, удерживать постоянное соединение в сеансе пользователя не всегда надежно.
Чтобы обезопасить сервер 1С от сбоев и исключить использование сомнительных внешних компонент, на практике часто применяют схему с легким промежуточным звеном. Выясним, как она работает.
На сервере поднимается простейший скрипт-демон (написанный на Python, Node.js или Go), который выполняет роль транслятора. Он выполняет следующие действия:
Давайте посмотрим, как в 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-библиотек.
Если проект находится на стадии проектирования, и программу для тач-панели под 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-клиент, позволяющий поддерживать постоянное полнодуплексное соединение напрямую.
Рассмотрим ситуацию с другой стороны: зачем писать отдельное приложение для WinCE, которое генерирует TCP-пакеты, а потом героически перехватывать их в 1С? Если тачскрин используется исключительно для ввода данных сотрудником (нажал кнопку «Брак», нажал кнопку «Старт партии»), мы можем отобразить интерфейс самой 1С непосредственно на мониторе тач-панели!
Для операционной системы Windows CE доступны следующие варианты:
Для полноты картины упомянем новую технологическую ветку — среду разработки «1С:Элемент». В отличие от классической платформы, в стандартную библиотеку «1С:Элемента» уже встроен полноценный инструмент для низкоуровневой работы с TCP-сокетами.
В пакете Стд::Tcp доступны готовые типы БлокирующийСерверTcp и СоединениеTcp. Если ваша инфраструктура позволяет использовать приложения на базе «1С:Элемент» в качестве интеграционных шлюзов, вы сможете развернуть полноценный TCP-сервер, обрабатывающий входящие потоки байтов от оборудования, написав всего несколько строк кода без использования каких-либо внешних библиотек и прокси.
Принимать и обрабатывать TCP-пакеты в экосистеме 1С можно и нужно. Выбор метода зависит от архитектуры вашего проекта: