Как интегрировать 1С с внешним устройством по API?

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

Интеграция 1С с внешним оборудованием (сканерами, контроллерами, датчиками или RFID-считывателями) — это классическая задача для разработчика, которая требует понимания сетевых протоколов и механизмов взаимодействия систем. В данной статье мы подробно разберем, как организовать управление внешним устройством, используя встроенные инструменты платформы 1С:Предприятие 8.3.

Чаще всего оборудование предоставляет два пути взаимодействия: через сетевой интерфейс (HTTP/REST или SOAP) или через локальную библиотеку (DLL). Мы проанализируем оба сценария, рассмотрим конкретные примеры кода и разберем типичные ошибки, с которыми сталкиваются программисты.

Вариант 1: Интеграция через REST API (протокол HTTP)

Если в документации к вашему устройству указаны методы типа GET или POST, а также параметры в формате IP и Port, значит, мы имеем дело с REST-сервисом. Рассмотрим ситуацию, когда нам нужно отправить команду на запуск считывания.

Для начала разберем, как правильно инициировать соединение. Мы будем использовать объект HTTPСоединение. Важно помнить, что работа с физическим устройством требует установки таймаутов, так как оборудование может отвечать не мгновенно.

Рассмотрим пример кода для выполнения GET-запроса:


&НаСервере
Процедура ВыполнитьЗапускУстройства(АдресУстройства, ПортУстройства, IPПараметр, НомерПорта)
    
    // Создаем соединение с устройством. 
    // Указываем таймаут (например, 10 секунд), чтобы 1С не "зависла" вечно.
    Соединение = Новый HTTPСоединение(АдресУстройства, ПортУстройства, , , , 10);
    
    // Формируем строку запроса с параметрами.
    // Важно использовать кодирование строк для корректной передачи спецсимволов.
    СтрокаЗапроса = "/Start?IP=" + IPПараметр + "&Port=" + Формат(НомерПорта, "ЧГ=0");
    
    Запрос = Новый HTTPЗапрос(СтрокаЗапроса);
    
    Попытка
        Ответ = Соединение.Получить(Запрос);
        
        Если Ответ.КодОтвета = 200 Тогда
            // Проанализируем тело ответа. Предположим, устройство возвращает JSON.
            ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
            РезультатОбработки = ПрочитатьРезультатИзJSON(ТекстОтвета);
            Сообщить("Команда принята. Результат: " + РезультатОбработки);
        Иначе
            Сообщить("Ошибка устройства! Код ответа: " + Ответ.КодОтвета);
        КонецЕсли;
    Исключение
        Сообщить("Не удалось связаться с устройством: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

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

Вариант 2: Использование SOAP (Web-сервисы)

Некоторые промышленные системы используют более строгий протокол SOAP. В этом случае взаимодействие строится через WSDL-описание. Проанализируем, как создать прокси-объект для обращения к такому устройству.


// Создание определения сервиса по ссылке WSDL
Определение = Новый WSОпределение("http://192.168.1.100/service?wsdl");

// Создание прокси для выполнения методов
Прокси = Новый WSПрокси(Определение, "http://namespace.uri", "ServiceName", "EndpointName");

// Вызов метода Start
Попытка
    Результат = Прокси.Start("192.168.1.101", 8080);
    Если Результат.Success Тогда
        Сообщить("Устройство успешно запущено");
    КонецЕсли;
Исключение
    Сообщить("Ошибка вызова WS-метода: " + ОписаниеОшибки());
КонецПопытки;

Вариант 3: Интеграция через DLL-библиотеку

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

Шаг 1: Подключение внешней компоненты. Если библиотека разработана по технологии Native API или COM для 1С, мы используем метод ПодключитьВнешнююКомпоненту. Рассмотрим пример:


// Установка компоненты из макета (если она упакована в конфигурацию)
Результат = УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверУстройства");

Если Результат Тогда
    // Создаем объект компоненты
    Драйвер = Новый("AddIn.DeviceDriver.CmpName");
    Драйвер.УстановитьПараметры("192.168.1.100", 1234);
    Драйвер.Запустить();
КонецЕсли;

Шаг 2: Работа с обычным COM-объектом. Если библиотека — это стандартный Windows DLL, её нужно зарегистрировать в системе через regsvr32 и обращаться к ней как к COMОбъекту.

Критически важный момент — разрядность! Рассмотрим типичную проблему: ваша 1С (сервер или клиент) является 64-битной, а DLL от производителя — 32-битной. Напрямую они работать не смогут. Проанализируем варианты решения:

  1. Использование 32-битного клиента 1С (если работа идет на стороне пользователя).
  2. Настройка COM+ Application в Windows. Это позволит запускать 32-битную библиотеку в отдельном процессе, к которому 64-битная 1С сможет обращаться удаленно.

Обработка данных (JSON и XML)

Современные API редко возвращают простые числа. Как правило, ответ приходит в формате JSON. Чтобы эффективно работать с этими данными в 1С, выясним, как правильно десериализовать ответ.


Функция ПрочитатьРезультатИзJSON(ТекстJSON)
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ТекстJSON);
    Данные = ПрочитатьJSON(Чтение); // Получаем Структуру или Соответствие
    Чтение.Закрыть();
    
    Возврат Данные.Result; // Извлекаем конкретное поле из ответа API
КонецФункции

Рекомендации по отладке

Прежде чем приступать к написанию кода в 1С, мы настоятельно рекомендуем протестировать API устройства с помощью сторонних утилит, таких как Postman или Insomnia. Рассмотрим, что это дает:

Если запрос в Postman проходит успешно, а в 1С возвращается ошибка — проанализируем структуру заголовков. Скорее всего, вы забыли добавить какой-то важный параметр в HTTPЗапрос.Заголовки.

Также помните об асинхронности. В современных управляемых формах (версии 8.3.18+) для сохранения отзывчивости интерфейса рекомендуется использовать асинхронные вызовы, такие как HTTPСоединение.ОбещатьОтправитьЗапрос(), чтобы пользователь мог продолжать работу, пока 1С ожидает ответа от оборудования.

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

← На главную