Работа с торговым и промышленным оборудованием, таким как автомобильные весы, сканеры или датчики, часто строится на использовании внешних компонент для работы с последовательным портом (COM-портом). Одной из классических библиотек для этих целей является vk_rs232.dll. Однако разработчики часто сталкиваются с ситуацией, когда порт успешно открывается, данные в сторонних программах (например, Putty) видны, но процедура ОбработкаВнешнегоСобытия в 1С не вызывается. Рассмотрим подробно, почему это происходит и как настроить систему для стабильной работы.
Проанализируем архитектурную особенность библиотеки vk_rs232.dll. Данная компонента была разработана как 32-битное приложение (x86). В мире Windows и 1С существует строгое правило: 64-битный процесс не может напрямую загружать и полноценно взаимодействовать с 32-битными динамическими библиотеками (DLL) в рамках одного адресного пространства, если не реализован специальный мост (Bit Bridge).
Если вы используете 64-битный клиент 1С (исполняемый файл из папки bin64), компонента может загрузиться через механизмы эмуляции, но генерация внешних событий (callback-функций) будет заблокирована. Выясним, как это исправить:
1cv8.exe из папки bin (не bin64). Именно в этой конфигурации vk_rs232.dll сможет корректно «пробрасывать» события в поток 1С.Посмотрим на нюансы регистрации библиотеки в операционной системе. При использовании Windows 7, 10 или 11 x64 стандартная команда регистрации может отработать некорректно. Разберем правильный алгоритм регистрации через командную строку:
Для 64-битных ОС необходимо использовать версию regsvr32.exe, расположенную в системной папке SysWOW64. Выполним следующие шаги от имени администратора:
C:\Windows\SysWOW64\regsvr32.exe "C:\DLL\vk_rs232.dll"
Важно: Если вы регистрируете библиотеку из обычной папки System32 на 64-битной системе, вы используете 64-битную утилиту регистрации, которая не всегда корректно прописывает ключи в реестре для 32-битных COM-объектов.
Рассмотрим пример кода, который гарантирует правильное удержание объекта в памяти. Одной из частых ошибок является создание объекта компоненты в локальной переменной процедуры. В этом случае после завершения процедуры сборщик мусора удаляет объект, и связь с портом разрывается. Выясним, как сделать правильно в «Обычном приложении»:
В модуле обычного приложения объявим глобальную переменную и инициализируем её:
Перем СОМ_Порт Экспорт;
Процедура ПриНачалеРаботыСистемы()
Попытка
ЗагрузитьВнешнююКомпоненту("C:\DLL\vk_rs232.dll");
СОМ_Порт = Новый("AddIn.vk_rs232");
// Настройка параметров связи
СОМ_Порт.Скорость = 9600;
СОМ_Порт.СтоповыеБиты = 1;
СОМ_Порт.Четность = 0;
СОМ_Порт.БитыДанных = 8;
// Указываем символ, по которому компонента поймет, что строка принята
СОМ_Порт.КонецСтроки = Символы.ПС;
Если СОМ_Порт.ОткрытьПорт("COM1") = 1 Тогда
Сообщить("Порт успешно открыт");
Иначе
Сообщить("Не удалось открыть порт!");
КонецЕсли;
Исключение
Сообщить("Ошибка при загрузке vk_rs232: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Проанализируем механику генерации события. Компонента vk_rs232.dll не отправляет событие в 1С на каждый пришедший байт. Она накапливает данные во внутреннем буфере и ждет появления специального символа, указанного в свойстве КонецСтроки. Если весы передают данные непрерывным потоком без символа переноса строки (LF) или возврата каретки (CR), событие в 1С никогда не наступит.
Разберем, что можно предпринять:
СОМ_Порт.КонецСтроки = ""; (пустая строка). Некоторые версии компоненты в этом режиме начинают отдавать данные по мере поступления.СОМ_Порт.КонецСтроки = Символы.ВК; или используйте числовой код, если библиотека это поддерживает.Ситуация, когда Putty видит данные, а 1С — нет, иногда связана с тем, что Putty автоматически выставляет сигналы DTR (Data Terminal Ready) и RTS (Request to Send), которые «будят» передатчик весов. В 1С эти флаги нужно выставлять принудительно, если оборудование того требует:
СОМ_Порт.АктивироватьDTR = 1;
СОМ_Порт.АктивироватьRTS = 1;
Также проанализируем права доступа. Запуск 1С должен осуществляться от имени пользователя, имеющего права на работу с оборудованием. Попробуйте запустить 1С от имени администратора (правой кнопкой мыши — «Запуск от имени администратора»), чтобы исключить блокировку доступа к портам со стороны системы безопасности Windows.
Напомним, что в обычном приложении внешнее событие попадает в модуль управляемого приложения (если используется гибридный режим) или, что чаще, обрабатывается в форме. Убедитесь, что в форме, где вы ожидаете данные, определена процедура:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Источник обычно равен "vk_rs232"
// Данные — строка, пришедшая из порта
Сообщить("Получены данные: " + Данные);
КонецПроцедуры
Важный нюанс: Если в 1С открыто модальное окно (например, вопрос «Вы уверены?» или модальная форма выбора), обработка очереди внешних событий может быть приостановлена до закрытия этого окна. Старайтесь избегать модальности при работе с потоковыми данными.
Подводя итог, в большинстве случаев проблема решается именно переходом на 32-битную версию платформы 1С и правильной регистрацией библиотеки через SysWOW64. Если эти меры не помогают, стоит рассмотреть современные альтернативы, такие как Native API компоненты, которые лишены проблем с регистрацией в реестре и поддерживают 64-битные системы «из коробки».