При интеграции торгового или промышленного оборудования (весов, сканеров, датчиков) с платформой 1С:Предприятие 8.3 через последовательный порт (RS-232 / COM-порт) разработчики часто сталкиваются с аппаратными и программными сбоями. Типичная ситуация: внешняя компонента вроде vk_rs232.dll или rs232.dll загружается методом ПодключитьВнешнююКомпоненту(), но при попытке создания объекта через конструктор Новый система аварийно завершает работу или выдает ошибку «Тип не определен».
В этой статье мы подробно разберем причины этой проблемы, проанализируем влияние разрядности клиентского приложения 1С и рассмотрим пошаговые сценарии успешного подключения внешних компонент.
Выясним главную причину неудачи, с которой сталкивается большинство разработчиков. Если ваше клиентское приложение 1С запущено в 64-разрядном режиме (x64), платформа физически не сможет загрузить в свой процесс 32-разрядную динамическую библиотеку (DLL). Популярные старые компоненты для работы с COM-портами компилировались исключительно под архитектуру x86 (32-бит). Пытаясь вызвать такую компоненту в x64-сессии через ТипВнешнейКомпоненты.Native, вы неизбежно получите ошибку инициализации.
Решение проблемы разрядности:
vk_rs232.dll работают стабильно и без нареканий.Когда мы упаковываем 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-битный соответственно), что предотвратит появление ошибки неопределенного типа.
Разберем разницу технологий. Старые компоненты часто разрабатывались по технологии 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 успешно подключена!");
Исключение
Предупреждение("Не удалось создать объект компоненты: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Ошибка при подключении файла внешней компоненты!");
КонецЕсли;
Рассмотрим очень удобный «лайфхак», который избавляет от необходимости искать сторонние неофициальные DLL-файлы. В составе стандартной «Библиотеки подключаемого оборудования» (БПО) от 1С поставляется сертифицированная Native-компонента для работы со сканерами штрихкодов.
Эта компонента полностью кроссплатформенная (поддерживает Windows, Linux, x32 и x64). По сути, любой сканер штрихкода, работающий в режиме эмуляции последовательного порта (Virtual COM), отправляет в порт обычный текстовый поток данных. Вы можете использовать эту официальную компоненту 1С для чтения данных из абсолютно любого устройства, подключенного к COM-порту (весы, терминалы, контроллеры), обрабатывая входящую информацию через стандартную процедуру платформы ВнешнееСобытие.
Начиная с версий платформы 1С 8.3.12, разработчикам доступна возможность минимизировать риски аварийного падения всего сеанса 1С из-за внутренних ошибок стороннего кода в DLL. Для этого рекомендуется использовать свойство изоляции при вызове метода подключения:
ПодключитьВнешнююКомпоненту(ПутьКФайлу, "Uni", ТипВнешнейКомпоненты.Native, ТипПодключенияВнешнейКомпоненты.Изолированно);
В таком режиме компонента будет запущена в отдельном системном процессе операционной системы. Если при опросе физического порта или потере связи с оборудованием в коде библиотеки произойдет критический сбой, аварийно закроется только изолированный процесс компоненты, а сам сеанс пользователя в 1С продолжит работу в штатном режиме.