Работа с торговым оборудованием, таким как весы или сканеры штрихкода через COM-порт, часто сопряжена с техническими трудностями. Особенно остро это проявляется при переходе на 64-битные операционные системы и современные версии платформы 1С 8.3. В данной статье мы подробно разберем, почему возникают ошибки при загрузке внешних компонент и что делать, если порт открывается, но событие ОбработкаВнешнегоСобытия не срабатывает.
Одной из самых частых причин ошибки «Ошибка при загрузке внешней компоненты» является несовпадение разрядности клиентского приложения 1С и подключаемой библиотеки (DLL). Проанализируем ситуацию: если вы используете 64-битный клиент 1С, он физически не сможет загрузить старые 32-битные компоненты, такие как vk_rs232.dll или ScanOPOS.dll.
Решение: Для работы с такими библиотеками необходимо использовать 32-битный клиент 1С (x86). Даже если ваша Windows 64-битная, вы можете установить 32-битный дистрибутив платформы. В настройках запуска информационной базы (список баз -> Изменить -> Далее) в поле «Разрядность» принудительно укажите 32 (x86).
В современных конфигурациях на управляемых формах по умолчанию может быть запрещено использование синхронных вызовов внешних компонент. Если при попытке подключения возникает ошибка, нам необходимо проверить свойства конфигурации. Разберем по шагам, что нужно сделать:
Режим использования синхронных вызовов расширений платформы и внешних компонент.После этого попробуем подключить компоненту через метод ПодключитьВнешнююКомпоненту, который возвращает логическое значение (Истина/Ложь), что позволяет нам продиагностировать результат загрузки.
Рассмотрим пример кода, который позволяет инициализировать компоненту и открыть порт для чтения данных. Обратите внимание на использование ProgID.
// Пример инициализации в управляемом приложении
&НаКлиенте
Процедура ПодключитьОборудование()
ИмяФайла = "D:\distr\vk_rs232.dll";
РезультатЗагрузки = ЗагрузитьВнешнююКомпоненту(ИмяФайла);
Если РезультатЗагрузки Тогда
// Используем ProgID компоненты
ИмяОбъекта = "AddIn.vk_rs232";
Попытка
КОМПорт = Новый (ИмяОбъекта);
КОМПорт.ОткрытьПорт("COM1");
КОМПорт.СтоповыеБиты = 1;
КОМПорт.Четность = 0;
КОМПорт.КонецСтроки = Символы.ПС;
Сообщить("Порт успешно открыт");
Исключение
Сообщить("Не удалось создать объект компоненты");
КонецПопытки;
Иначе
Сообщить("Ошибка загрузки DLL");
КонецЕсли;
КонецПроцедуры
Выясним причину, по которой данные в порт приходят (это можно проверить через сторонние утилиты типа Putty), но 1С их не "видит". Самая распространенная ошибка программистов — это время жизни объекта. Если переменная, в которой хранится объект КОМПорт, объявлена внутри локальной процедуры, то после завершения работы этой процедуры объект уничтожается сборщиком мусора 1С. В этом случае связь с драйвером разрывается, и событие не доходит до платформы.
Важное правило: Объект внешней компоненты должен храниться в переменной, которая живет всё время, пока вы ожидаете данные. Для обычных форм это глобальная переменная в модуле приложения с ключевым словом Экспорт. Для управляемых форм это может быть реквизит формы с типом Произвольный.
Рассмотрим правильное объявление для обычного приложения:
// В модуле обычного приложения
Перем СОМ_Порт Экспорт;
Процедура ПриНачалеРаботыСистемы()
ЗагрузитьВнешнююКомпоненту("C:\DLL\vk_rs232.dll");
СОМ_Порт = Новый("AddIn.vk_rs232");
// Настройка параметров
СОМ_Порт.ОткрытьПорт("COM1");
КонецПроцедуры
Проанализируем ситуацию с автомобильными весами. Часто весовые терминалы требуют подтверждения готовности принимающей стороны. В свойствах объекта компоненты проверьте наличие параметров DTR (Data Terminal Ready) и RTS (Request to Send). Попробуйте установить их в значение 1 (Истина) перед открытием порта или сразу после него.
Также полезно использовать метод ПодключитьОбработчикОжидания. Несмотря на то, что компонента работает через события, наличие активного обработчика ожидания в 1С заставляет платформу чаще "опрашивать" очередь системных сообщений Windows, что может ускорить или вообще инициировать вызов ОбработкаВнешнегоСобытия.
Если старые библиотеки (COM/ActiveX) продолжают работать нестабильно, рекомендуем рассмотреть переход на технологию Native API. Компоненты Native API не требуют регистрации в реестре Windows через regsvr32 и гораздо стабильнее ведут себя в многопоточной среде.
Оптимальным решением для современных конфигураций является использование 1С:Библиотеки подключаемого оборудования (БПО). В её составе есть драйвер "1С:Сканеры штрихкода (COM)", который умеет работать с любым устройством, передающим текстовые данные в COM-порт. Этот драйвер поддерживает и x86, и x64 архитектуры, что полностью снимает проблемы с разрядностью операционной системы.
Резюмируем: Для успешной работы с COM-портом в 1С на Win64 необходимо убедиться в соответствии разрядности клиента и DLL, обеспечить глобальную видимость объекта компоненты и правильно настроить управляющие сигналы порта.