Как подключить к 1С библиотеку DLL или управлять оборудованием через HTTP/XML?

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

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

Первоначально, когда мы сталкиваемся с необходимостью работы с DLL, наш взгляд часто обращается к возможностям платформы 1С по подключению внешних компонент. Если библиотека реализована по технологии COM и зарегистрирована в реестре операционной системы, то все относительно просто. Мы можем использовать глобальный контекст ПодключитьВнешнююКомпоненту, а затем создать объект с помощью Новый COMОбъект. Однако, как мы выяснили из вашей ситуации, программа не устанавливается, а просто распаковывается из архива, что обычно означает отсутствие регистрации COM-объектов в системе. Это существенно усложняет прямой путь и требует альтернативных решений.

Далее мы проанализировали документацию и выяснили, что оборудование взаимодействует со станцией через XML-файлы, которые отправляются по HTTP. Это открывает нам наиболее прямой и часто самый простой путь: прямое взаимодействие по сети, используя встроенные возможности 1С для работы с HTTP-запросами. Если же этот путь окажется недостаточным из-за необходимости более сложной логики, скрытой в .NET DLL, то нам потребуется либо разработка собственной внешней компоненты на C#, либо создание промежуточного сервиса.

1. Прямое HTTP-взаимодействие с XML из 1С

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

Мы разберем по шагам, как можно реализовать отправку HTTP POST-запроса с телом в формате XML из 1С:

  1. Формирование XML-документа: Для создания XML-строки мы будем использовать объект ЗаписьXML. Это позволит нам динамически конструировать XML-документ согласно требованиям вашего оборудования.
  2. Создание HTTP-соединения: Для установки связи со станцией нам понадобится объект HTTPСоединение, которому мы передадим адрес сервера и, при необходимости, порт и параметры аутентификации.
  3. Подготовка HTTP-запроса: Мы создадим объект HTTPЗапрос, определим метод (POST), установим сформированную XML-строку как тело запроса и добавим необходимые HTTP-заголовки.
  4. Отправка запроса и обработка ответа: После подготовки запрос будет отправлен, и мы получим HTTPОтвет, который необходимо будет проанализировать для подтверждения успешной операции или выявления ошибок.

Примерный алгоритм работы в 1С для HTTP POST с XML:

Предположим, что у нас есть структура XML, которую нужно отправить. Допустим, она выглядит так:


<Data>
    <Message Id="1">Привет, 1С!</Message>
</Data>

Теперь давайте посмотрим, как мы можем сформировать такую XML-строку и отправить её с помощью HTTP-запроса.


// 1. Формирование XML-документа
Перем СтрокаXML;
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку(); // Записываем XML в строку, а не в файл

ЗаписьXML.ЗаписатьНачалоДокумента();
ЗаписьXML.ЗаписатьНачалоЭлемента("Data");
    ЗаписьXML.ЗаписатьНачалоЭлемента("Message");
    ЗаписьXML.ЗаписатьАтрибут("Id", "1");
    ЗаписьXML.ЗаписатьТекст("Привет, 1С!");
    ЗаписьXML.ЗаписатьКонецЭлемента(); // Message
ЗаписьXML.ЗаписатьКонецЭлемента(); // Data
ЗаписьXML.ЗаписатьКонецДокумента();

СтрокаXML = ЗаписьXML.Закрыть();
ЗаписьXML = Неопределено;

// Сообщить("Сформированный XML: " + СтрокаXML);

// 2. Создание HTTP-соединения
// Указываем адрес вашей станции. Например, "192.168.1.100"
// и порт, если он отличается от стандартного 80.
// Если требуется HTTPS, установите ИспользоватьЗащищенноеСоединение = Истина.
ИмяСервера = "ваша_станция.com"; // или IP-адрес, например "192.168.1.100"
Порт = 80; // или другой порт, если указан в документации

Попытка
    HTTPСоединение = Новый HTTPСоединение(ИмяСервера, Порт);
Исключение
    Сообщить("Ошибка создания HTTP-соединения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// 3. Подготовка HTTP-запроса
HTTPЗапрос = Новый HTTPЗапрос;
HTTPЗапрос.Метод = "POST"; // Важно: для отправки данных чаще всего используется POST
// Указываем путь к ресурсу на станции, который принимает XML.
// Это может быть что-то вроде "/api/sendData" или просто "/"
HTTPЗапрос.АдресРесурса = "/sendXML"; // Примерный путь, уточните по документации

// Установка тела запроса из сформированной XML-строки
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаXML, КодировкаТекста.UTF8);

// Добавляем необходимые заголовки.
// Заголовок Content-Type критически важен, чтобы сервер знал, какой тип данных он получает.
HTTPЗапрос.Заголовки.Вставить("Content-Type", "text/xml; charset=utf-8");
// Иногда может потребоваться Content-Length, но 1С обычно выставляет его автоматически.
// HTTPЗапрос.Заголовки.Вставить("Content-Length", СтрДлина(СтрокаXML));

// Если требуются другие заголовки, например для авторизации:
// HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer ваш_токен");

// 4. Отправка запроса и обработка ответа
Попытка
    HTTPОтвет = HTTPСоединение.Отправить(HTTPЗапрос);

    Если HTTPОтвет.КодСостояния = 200 Тогда
        // Запрос успешно выполнен.
        Сообщить("XML успешно отправлен. Статус: " + HTTPОтвет.КодСостояния);
        ОтветСервера = HTTPОтвет.ПолучитьТелоКакСтроку();
        Если Не ПустаяСтрока(ОтветСервера) Тогда
            Сообщить("Ответ от сервера: " + ОтветСервера);
            // Если ответ тоже в XML, можно его прочитать:
            // ЧтениеXML = Новый ЧтениеXML;
            // ЧтениеXML.УстановитьСтроку(ОтветСервера);
            // ... далее парсинг XML ...
        КонецЕсли;
    Иначе
        // Произошла ошибка на стороне сервера или в запросе.
        Сообщить("Ошибка отправки XML. Код состояния: " + HTTPОтвет.КодСостояния);
        Сообщить("Описание ошибки: " + HTTPОтвет.ПолучитьТелоКакСтроку());
    КонецЕсли;

Исключение
    Сообщить("Произошла ошибка при отправке HTTP-запроса: " + ОписаниеОшибки());
КонецПопытки;

Важно: Адрес ресурса (/sendXML) и заголовки (особенно Content-Type) должны быть точно такими, как указано в документации или как это ожидает принимающая станция. Если документация не полная, используйте инструменты для анализа сетевого трафика (например, Fiddler или Wireshark), чтобы понять, какие запросы отправляет существующая программа.

2. Создание внешней компоненты (ВК) на C# для .NET DLL

В случае, если взаимодействие с оборудованием не ограничивается простыми HTTP-запросами, а требует использования специфической логики, реализованной в .NET DLL (что очень вероятно, судя по упомянутым C# и .NET в документации), прямой вызов из 1С становится невозможным. В этом сценарии наиболее эффективным решением будет разработка внешней компоненты на языке C#.

Мы разберем принцип работы и особенности создания такой компоненты:

  1. Принцип работы: Внешняя компонента выступает в роли "моста" между вашей базой 1С и .NET DLL. Вы пишете на C# код, который загружает и вызывает методы из оригинальной DLL оборудования, а затем предоставляете этот функционал 1С через заранее определенный интерфейс.
  2. Технологии создания ВК: 1С поддерживает два основных типа внешних компонент:
    • COM-совместимые обертки: Этот подход часто используется для интеграции с .NET библиотеками. Вы создаете .NET библиотеку (DLL), которая помечена как COM-Visible. Затем эту .NET DLL регистрируете как COM-объект в системе. После регистрации 1С может использовать её, как любой другой COM-объект, с помощью Новый COMОбъект("Имя.Класса"). Этот метод требует регистрации в реестре Windows.
    • Native API: Это более низкоуровневый подход, который требует реализации специфических интерфейсов 1С (например, IComponentBase, IPropertyLink, IMethodLink). Преимуществом такого подхода является то, что компонента не требует регистрации в реестре, что упрощает её распространение и обновление. Однако разработка более сложна и требует глубокого понимания архитектуры ВК 1С.
  3. Инструменты для разработки: Для написания внешней компоненты на C# мы будем использовать среду разработки Visual Studio. Существуют специализированные шаблоны проектов или библиотеки классов (например, AddIn.API или 1C-Native-API-Wrapper), которые существенно упрощают разработку, абстрагируя нас от сложностей реализации служебных интерфейсов 1С.
  4. Подключение и регистрация:
    • Для COM-компоненты: После компиляции .NET DLL, ее необходимо зарегистрировать в системе. Обычно это делается с помощью утилиты regasm.exe (из .NET Framework) или regsvr32.exe для нативных COM DLL. Для 64-битной 1С и 64-битных компонент может потребоваться регистрация через COM+-приложения.
    • Для Native API компоненты: Компонента (DLL-файл) может быть скопирована в каталог 1С или указана полный путь к ней. Подключение осуществляется в 1С с помощью УстановитьВнешнююКомпоненту() (для загрузки файла) и затем ПодключитьВнешнююКомпоненту().
  5. Преимущества:
    • Полный контроль: Мы получаем полный контроль над логикой взаимодействия с оригинальной DLL.
    • Использование возможностей .NET: Мы можем использовать все современные возможности .NET, включая асинхронность, работу с потоками, сложные структуры данных и расширенные сетевые протоколы.
    • Интеграция со сложной логикой: Это идеальное решение, если оригинальная DLL содержит сложную бизнес-логику, которую невозможно или нецелесообразно переписывать на 1С.

Поскольку в сообщении 7 упоминается, что документация API библиотеки для C# (.NET), то создание внешней компоненты на C# является очень перспективным направлением. Нам потребуется программист, который сможет перевести примеры кода из SDK на C# в методы внешней компоненты, доступные для вызова из 1С.

3. Промежуточный сервис (Python/C#)

Еще одним мощным и гибким подходом является создание отдельного промежуточного сервиса. Этот сервис будет выступать в качестве посредника между 1С и вашим оборудованием/DLL. 1С будет взаимодействовать с этим сервисом по простому и понятному протоколу (например, через HTTP REST API), а сам сервис будет уже выполнять все сложные операции с DLL и отправлять XML по HTTP на станцию.

Мы проанализируем, как этот подход работает и его преимущества:

  1. Принцип работы:
    • Разработка сервера: Мы разрабатываем небольшое серверное приложение на выбранном языке программирования (например, Python или C#). Это приложение будет "знать", как работать с оригинальной DLL оборудования и как отправлять XML по HTTP на станцию, согласно документации SDK.
    • Предоставление API для 1С: Этот сервер предоставляет свой собственный, простой и удобный для 1С API (например, набор HTTP POST-запросов).
    • Взаимодействие 1С: 1С отправляет простые HTTP-запросы на этот промежуточный сервис, передавая только необходимые параметры.
    • Трансляция команд: Промежуточный сервис принимает запросы от 1С, транслирует их в вызовы методов оригинальной DLL или формирует и отправляет XML на станцию.
  2. Преимущества:
    • Разделение ответственности: Мы четко разделяем логику 1С и логику работы с оборудованием. 1С занимается только бизнес-процессами, а промежуточный сервис — технической интеграцией.
    • Независимость от специфики DLL в 1С: 1С не нужно ничего знать о сложной DLL или её регистрации. Она просто общается с простым HTTP-интерфейсом.
    • Гибкость в выборе языка: Мы можем использовать любой язык программирования (Python, C#, Java, Node.js), который лучше всего подходит для работы с данной DLL или сетевыми протоколами. Например, Python отлично подходит для быстрого создания веб-сервисов, а C# — нативный выбор для работы с .NET DLL.
    • Масштабируемость: Промежуточный сервис может быть развернут на отдельной машине, что повышает отказоустойчивость и производительность. Он может обслуживать несколько баз 1С или других клиентов.
    • Централизация: Если несколько систем (не только 1С) должны взаимодействовать с оборудованием, промежуточный сервис станет централизованной точкой доступа.
  3. Примеры реализации:
    • Python: Мы можем создать простой веб-сервис, используя фреймворки Flask или Django. Этот сервис будет принимать HTTP POST-запросы от 1С. Внутри сервиса мы можем использовать библиотеки типа ctypes (для нативных DLL) или PythonNet (для .NET DLL) для взаимодействия с оригинальной DLL. Затем сервис будет формировать и отправлять XML на дисплей через стандартные Python-библиотеки для HTTP (например, requests).
    • C#: Аналогично, мы можем создать веб-сервис на C# с использованием ASP.NET Core Web API. Этот сервис будет напрямую работать с .NET DLL оборудования, поскольку оба написаны на .NET. Он будет предоставлять HTTP-интерфейс для 1С, который 1С будет легко вызывать.

Идея написать сервер на Python, как вы предложили в сообщении 8, вполне жизнеспособна и часто используется для подобных интеграций. Она обеспечивает хорошую гибкость и разделение логики.

Дополнительные рекомендации и инструменты

В процессе интеграции, особенно при скудной документации, нам помогут следующие подходы:

  1. Анализ сетевого трафика: Если у вас есть работающее приложение, которое успешно взаимодействует с дисплеем, это ваш главный источник информации. Мы настоятельно рекомендуем использовать инструменты для анализа сетевого трафика, такие как Fiddler, Wireshark или встроенные инструменты разработчика в браузере (если приложение использует веб-технологии). Эти программы позволят нам:
    • Увидеть точные HTTP-запросы: Какой метод используется (GET/POST), какой полный URL, какие заголовки отправляются (особенно Content-Type, Authorization и другие специфичные), какое тело запроса (формат XML, кодировка).
    • Изучить ответы сервера: Какие HTTP-коды состояния возвращаются, какое тело ответа (например, подтверждение в XML), что поможет в реализации обработки ошибок.

    Анализируя трафик, мы сможем воссоздать точный протокол взаимодействия и реализовать его в 1С или в промежуточном сервисе.

  2. Детальное изучение SDK: Даже если документация кажется скудной, мы должны внимательно изучить все файлы, входящие в состав SDK. Это включает:
    • Исполняемые файлы и DLL: Попробуйте определить, какие библиотеки используются, их версии. Возможно, в них есть метаданные.
    • Примеры кода: Если есть даже небольшие примеры кода на C# (как вы упомянули в сообщении 13), мы должны их тщательно проанализировать. Они часто содержат ключевые вызовы функций и демонстрацию правильного использования API.
    • Файлы конфигурации: Иногда в файлах конфигурации (например, .config для .NET приложений) могут быть указаны адреса серверов, порты, ключи API или другие важные параметры.
    • Названия функций и типов: В C# примере (если он будет доступен) или в самой DLL (через рефлекторы типа ILSpy) мы можем увидеть названия классов, методов и их параметров. Это даст нам представление о том, что делает каждая функция и какие данные она ожидает.

Выбор конкретного подхода зависит от множества факторов: от сложности DLL и протокола взаимодействия, требований к производительности и надежности, до доступности специалистов (например, программиста на C#) и общего архитектурного видения решения. Начните с самого простого — анализа HTTP-трафика и попытки прямого взаимодействия из 1С. Если это не сработает или окажется недостаточным, переходите к созданию внешней компоненты или промежуточного сервиса.

← На главную