Почему не приходят внешние события от COM-порта через vk_rs232.dll в 1С и как это исправить?

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

Работа с торговым и промышленным оборудованием, таким как автомобильные весы, сканеры или датчики, часто строится на использовании внешних компонент для работы с последовательным портом (COM-портом). Одной из классических библиотек для этих целей является vk_rs232.dll. Однако разработчики часто сталкиваются с ситуацией, когда порт успешно открывается, данные в сторонних программах (например, Putty) видны, но процедура ОбработкаВнешнегоСобытия в 1С не вызывается. Рассмотрим подробно, почему это происходит и как настроить систему для стабильной работы.

Разрядность приложения — главный фактор успеха

Проанализируем архитектурную особенность библиотеки vk_rs232.dll. Данная компонента была разработана как 32-битное приложение (x86). В мире Windows и 1С существует строгое правило: 64-битный процесс не может напрямую загружать и полноценно взаимодействовать с 32-битными динамическими библиотеками (DLL) в рамках одного адресного пространства, если не реализован специальный мост (Bit Bridge).

Если вы используете 64-битный клиент 1С (исполняемый файл из папки bin64), компонента может загрузиться через механизмы эмуляции, но генерация внешних событий (callback-функций) будет заблокирована. Выясним, как это исправить:

  1. Проверим версию установленного клиента 1С. Если в заголовке программы или в окне «О программе» указано «x86_64», значит, используется 64-битная версия.
  2. Установим 32-битную версию клиента 1С. Даже если сервер 1С работает в 64-битном режиме, клиентская часть на рабочем месте оператора весов должна быть 32-битной.
  3. Запустим базу через 1cv8.exe из папки bin (не bin64). Именно в этой конфигурации vk_rs232.dll сможет корректно «пробрасывать» события в поток 1С.

Корректная регистрация компоненты в 64-битной Windows

Посмотрим на нюансы регистрации библиотеки в операционной системе. При использовании 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-битные системы «из коробки».

← На главную