Как подключить внешнюю компоненту для работы с COM-портом (RS-232) в 1С:Предприятие 8.3 и избежать ошибки «Тип не определен»?

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

При интеграции торгового или промышленного оборудования (весов, сканеров, датчиков) с платформой 1С:Предприятие 8.3 через последовательный порт (RS-232 / COM-порт) разработчики часто сталкиваются с аппаратными и программными сбоями. Типичная ситуация: внешняя компонента вроде vk_rs232.dll или rs232.dll загружается методом ПодключитьВнешнююКомпоненту(), но при попытке создания объекта через конструктор Новый система аварийно завершает работу или выдает ошибку «Тип не определен».

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

Причина 1: Конфликт разрядности (Bit-depth mismatch)

Выясним главную причину неудачи, с которой сталкивается большинство разработчиков. Если ваше клиентское приложение 1С запущено в 64-разрядном режиме (x64), платформа физически не сможет загрузить в свой процесс 32-разрядную динамическую библиотеку (DLL). Популярные старые компоненты для работы с COM-портами компилировались исключительно под архитектуру x86 (32-бит). Пытаясь вызвать такую компоненту в x64-сессии через ТипВнешнейКомпоненты.Native, вы неизбежно получите ошибку инициализации.

Решение проблемы разрядности:

  1. Переход на 32-битный клиент 1С. Если у вас нет жесткой технологической необходимости использовать именно 64-битный тонкий или толстый клиент, проще и надежнее всего установить стандартный 32-битный клиент 1С. В среде x86 старые библиотеки vk_rs232.dll работают стабильно и без нареканий.
  2. Использование x64-версий внешних компонент. Если работа должна происходить строго под x64, вам потребуется найти или скомпилировать native-компоненту, собранную под архитектуру x86_64.

Причина 2: Ошибки в манифесте ZIP-архива компоненты

Когда мы упаковываем Native-компоненту в ZIP-архив для автоматической установки из макета 1С, платформа ориентируется на служебный файл MANIFEST.XML. Если в этом файле не прописаны соответствия библиотек разрядности операционной системы, или указана только архитектура i386, то на 64-битном клиенте попытка установки вернет результат Ложь.

Проанализируем правильную структуру файла MANIFEST.XML, который должен находиться в корне ZIP-архива вместе с файлами библиотек:


<?xml version="1.0" encoding="UTF-8"?>
<bundle xmlns="http://v8.1c.ru/8.2/addin/bundle">
    <component os="Windows" path="YourComponent32.dll" type="native" arch="i386"/>
    <component os="Windows" path="YourComponent64.dll" type="native" arch="x86_64"/>
</bundle>

При таком описании платформа 1С самостоятельно определит разрядность запущенного сеанса и распакует нужный файл (32-битный или 64-битный соответственно), что предотвратит появление ошибки неопределенного типа.

Причина 3: Попытка зарегистрировать COM-компоненту как Native API

Разберем разницу технологий. Старые компоненты часто разрабатывались по технологии COM (ActiveX/OCX). Метод ТипВнешнейКомпоненты.Native для них не подходит. Для COM-компонент требуется предварительная регистрация в операционной системе с помощью утилиты regsvr32, а код их инициализации в 1С выглядит иначе.

Посмотрим на классический рабочий пример подключения зарегистрированной в системе COM-библиотеки vk_rs232 в режиме совместимости с более ранними версиями платформы:


// Подключение компоненты из каталога программы
ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() + "vk_rs232.dll");
ПодключитьВнешнююКомпоненту("AddIn.vk_rs232");

// Создание объекта работы с портом
КомПорт = Новый ("AddIn.vk_rs232");

Если же библиотека написана по технологии Native API, правильный и безопасный вариант ее инициализации с проверкой результата выглядит следующим образом:


ПутьКБиблиотеке = КаталогВременныхФайлов() + "rs232.dll";
РезультатПодключения = ПодключитьВнешнююКомпоненту(ПутьКБиблиотеке, "Uni", ТипВнешнейКомпоненты.Native);

Если РезультатПодключения Тогда
    Попытка
        КомПорт = Новый ("AddIn.Uni.rs232");
        Сообщить("Компонента RS-232 успешно подключена!");
    Исключение
        Предупреждение("Не удалось создать объект компоненты: " + ОписаниеОшибки());
    КонецПопытки;
Иначе
    Сообщить("Ошибка при подключении файла внешней компоненты!");
КонецЕсли;

Альтернативное решение: Использование стандартного драйвера 1С для сканеров

Рассмотрим очень удобный «лайфхак», который избавляет от необходимости искать сторонние неофициальные DLL-файлы. В составе стандартной «Библиотеки подключаемого оборудования» (БПО) от 1С поставляется сертифицированная Native-компонента для работы со сканерами штрихкодов.

Эта компонента полностью кроссплатформенная (поддерживает Windows, Linux, x32 и x64). По сути, любой сканер штрихкода, работающий в режиме эмуляции последовательного порта (Virtual COM), отправляет в порт обычный текстовый поток данных. Вы можете использовать эту официальную компоненту 1С для чтения данных из абсолютно любого устройства, подключенного к COM-порту (весы, терминалы, контроллеры), обрабатывая входящую информацию через стандартную процедуру платформы ВнешнееСобытие.

Рекомендация по безопасности: Изолированный режим

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


ПодключитьВнешнююКомпоненту(ПутьКФайлу, "Uni", ТипВнешнейКомпоненты.Native, ТипПодключенияВнешнейКомпоненты.Изолированно);

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

← На главную