Интеграция 1С с внешним оборудованием (сканерами, контроллерами, датчиками или RFID-считывателями) — это классическая задача для разработчика, которая требует понимания сетевых протоколов и механизмов взаимодействия систем. В данной статье мы подробно разберем, как организовать управление внешним устройством, используя встроенные инструменты платформы 1С:Предприятие 8.3.
Чаще всего оборудование предоставляет два пути взаимодействия: через сетевой интерфейс (HTTP/REST или SOAP) или через локальную библиотеку (DLL). Мы проанализируем оба сценария, рассмотрим конкретные примеры кода и разберем типичные ошибки, с которыми сталкиваются программисты.
Если в документации к вашему устройству указаны методы типа GET или POST, а также параметры в формате IP и Port, значит, мы имеем дело с REST-сервисом. Рассмотрим ситуацию, когда нам нужно отправить команду на запуск считывания.
Для начала разберем, как правильно инициировать соединение. Мы будем использовать объект HTTPСоединение. Важно помнить, что работа с физическим устройством требует установки таймаутов, так как оборудование может отвечать не мгновенно.
Рассмотрим пример кода для выполнения GET-запроса:
&НаСервере
Процедура ВыполнитьЗапускУстройства(АдресУстройства, ПортУстройства, IPПараметр, НомерПорта)
// Создаем соединение с устройством.
// Указываем таймаут (например, 10 секунд), чтобы 1С не "зависла" вечно.
Соединение = Новый HTTPСоединение(АдресУстройства, ПортУстройства, , , , 10);
// Формируем строку запроса с параметрами.
// Важно использовать кодирование строк для корректной передачи спецсимволов.
СтрокаЗапроса = "/Start?IP=" + IPПараметр + "&Port=" + Формат(НомерПорта, "ЧГ=0");
Запрос = Новый HTTPЗапрос(СтрокаЗапроса);
Попытка
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодОтвета = 200 Тогда
// Проанализируем тело ответа. Предположим, устройство возвращает JSON.
ТекстОтвета = Ответ.ПолучитьТелоКакСтроку();
РезультатОбработки = ПрочитатьРезультатИзJSON(ТекстОтвета);
Сообщить("Команда принята. Результат: " + РезультатОбработки);
Иначе
Сообщить("Ошибка устройства! Код ответа: " + Ответ.КодОтвета);
КонецЕсли;
Исключение
Сообщить("Не удалось связаться с устройством: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Важный нюанс: при формировании параметров запроса всегда используйте функцию КодироватьСтроку, если передаваемые значения могут содержать пробелы или спецсимволы. Это исключит ошибки интерпретации URL на стороне устройства.
Некоторые промышленные системы используют более строгий протокол 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-метода: " + ОписаниеОшибки());
КонецПопытки;
Если производитель предоставил 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-битной. Напрямую они работать не смогут. Проанализируем варианты решения:
Современные API редко возвращают простые числа. Как правило, ответ приходит в формате JSON. Чтобы эффективно работать с этими данными в 1С, выясним, как правильно десериализовать ответ.
Функция ПрочитатьРезультатИзJSON(ТекстJSON)
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТекстJSON);
Данные = ПрочитатьJSON(Чтение); // Получаем Структуру или Соответствие
Чтение.Закрыть();
Возврат Данные.Result; // Извлекаем конкретное поле из ответа API
КонецФункции
Прежде чем приступать к написанию кода в 1С, мы настоятельно рекомендуем протестировать API устройства с помощью сторонних утилит, таких как Postman или Insomnia. Рассмотрим, что это дает:
Content-Type: application/json или Authorization).Если запрос в Postman проходит успешно, а в 1С возвращается ошибка — проанализируем структуру заголовков. Скорее всего, вы забыли добавить какой-то важный параметр в HTTPЗапрос.Заголовки.
Также помните об асинхронности. В современных управляемых формах (версии 8.3.18+) для сохранения отзывчивости интерфейса рекомендуется использовать асинхронные вызовы, такие как HTTPСоединение.ОбещатьОтправитьЗапрос(), чтобы пользователь мог продолжать работу, пока 1С ожидает ответа от оборудования.
Интеграция с оборудованием — это всегда итерационный процесс. Начните с простого пинга устройства, затем выполните простейший GET-запрос и только после этого переходите к сложной бизнес-логике управления.