В современной промышленной автоматизации часто возникает задача объединения разнородных систем. Типичный сценарий: промышленное оборудование поставляется с закрытым SDK (набор DLL) под Windows, в то время как учетная система 1С:Предприятие развернута на серверах под управлением Linux. В этой ситуации мы не можем использовать классические механизмы вроде COM-соединения, так как они специфичны для Windows. Нам требуется универсальное, масштабируемое и надежное решение.
Рассмотрим подробно, как выстроить архитектуру взаимодействия, какие протоколы выбрать и каких ошибок следует избегать при проектировании такой связки.
Большинство экспертов сходятся во мнении, что создание промежуточного Web API на стороне Windows-сервиса — это наиболее сбалансированный подход. Поскольку у вас уже есть пример на Visual C#, мы можем дописать его, превратив в полноценный сервис (например, на базе ASP.NET Core или Web API), который будет транслировать события оборудования во внешний мир.
Преимущества этого подхода:
HTTPСоединение. Ей не важно, на каком языке написан сервер, главное — соблюдение протокола.Проанализируем пример кода на стороне 1С для получения данных из такого сервиса. Предположим, наш C#-сервис отдает список последних событий оборудования в формате JSON.
&НаСервере
Процедура ПолучитьДанныеОбОборудовании()
// Параметры подключения к нашему C# сервису
Сервер = "192.168.1.100"; // IP Windows-сервера
Порт = 5000;
НТТПСоединение = Новый HTTPСоединение(Сервер, Порт);
НТТПЗапрос = Новый HTTPЗапрос("/api/equipment/events");
Попытка
НТТПОтвет = НТТПСоединение.Получить(НТТПЗапрос);
Если НТТПОтвет.КодСостояния = 200 Тогда
Содержимое = НТТПОтвет.ПолучитьТелоКакСтроку();
// Читаем JSON данные
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Содержимое);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Обрабатываем полученные события
Для Каждого Событие Из Данные Цикл
ЗаписатьСобытиеВЛог(Событие.Timestamp, Событие.Message);
КонецЦикла;
Иначе
ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурналаРегистрации.Ошибка, , ,
"Сервер вернул ошибку: " + НТТПОтвет.КодСостояния);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("Интеграция", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось связаться с сервисом оборудования: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если оборудование генерирует события часто, а 1С не всегда может оперативно их обрабатывать, прямое HTTP-соединение может стать "узким горлышком". В этом случае рассмотрим использование очереди сообщений. Промежуточный брокер (например, RabbitMQ) выступает буфером.
Разберем, как это работает: C#-сервис подписывается на события оборудования через DLL и сразу отправляет их в очередь. 1С по расписанию или через внешнюю компоненту забирает данные из очереди. Это гарантирует, что даже при перезагрузке сервера 1С данные не будут потеряны — они "дождутся" своей очереди в брокере.
MQTT особенно хорош для промышленного мониторинга, так как он крайне легковесный и спроектирован для условий нестабильной сети. Для 1С существуют готовые внешние компоненты (Native API), позволяющие работать с MQTT на Linux.
Для систем, где критична скорость и минимальный объем трафика, стоит рассмотреть gRPC. Это современный фреймворк от Google, который использует бинарный протокол Protobuf вместо текстового JSON. В экосистеме .NET (C#) поддержка gRPC является первоклассной.
Выясним причину, по которой gRPC может быть лучше REST: за счет HTTP/2 соединение не разрывается после каждого запроса, а данные передаются в сжатом виде. На стороне 1С для работы с gRPC потребуется написать небольшую внешнюю компоненту на C++ или Rust (Native API), которая будет выступать клиентом и передавать данные в код 1С.
Выделим ключевые правила, которые помогут сделать интеграцию надежной:
Попытка...Исключение при вызовах внешних сервисов. Не забудьте настроить таймауты в объекте HTTPСоединение, чтобы зависший внешний сервис не "подвесил" рабочие процессы 1С.Для реализации связки между C# на Windows и 1С на Linux наиболее оправданным подходом является создание REST-сервиса. Это стандарт индустрии, который легко поддерживать и развивать. Если же ваша система требует высочайшей надежности и обработки потока данных в реальном времени, обратите внимание на брокеры сообщений. Главное — помнить, что интеграция должна строиться через логический уровень (API), а не через уровень данных (прямые запросы к SQL).