При интеграции беспроводного сканера штрихкодов Honeywell Voyageur 1452g (или его проводного аналога 1450g) с конфигурациями на платформе 1С:Предприятие (особенно со старыми решениями вроде УПП 1.3, КА 1.1 или УТ 10.3) часто возникает классическая проблема. Устройство успешно определяется операционной системой, проходит тесты в драйвере торгового оборудования, без проблем считывает данные в Блокнот, но процедура ВнешнееСобытие в модуле формы 1С упорно отказывается запускаться.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем физические настройки сканера и разберем два надежных метода решения проблемы: через эмуляцию клавиатуры (HID) и через виртуальный COM-порт.
---
Для начала выясним причину, почему данные со сканера не доходят до обработчика формы. Платформа 1С:Предприятие умеет обрабатывать сигналы торгового оборудования в фоновом режиме только тогда, когда драйвер штрихкодирования генерирует для нее специальное асинхронное событие. Это происходит в двух случаях:
Если вы используете устаревшие драйверы АТОЛ (например, платные версии 6.x/8.x без лицензии), они могут работать в демо-режиме с задержкой в 10 секунд или блокировать генерацию событий для оборудования сторонних производителей (не АТОЛ). Поэтому рекомендуется полностью отказаться от старых драйверов АТОЛ и использовать современные компоненты 1С.
---
Этот способ привлекателен тем, что не требует установки специализированных системных драйверов в Windows. Сканер определяется как обычное USB-устройство ввода, а вся магия перехвата реализуется на стороне 1С с помощью стандартной компоненты «1С:Сканеры штрихкода (NativeApi)».
Рассмотрим этот метод по шагам:
Для того чтобы 1С понимала, где заканчивается штрихкод, сканер должен физически посылать символ возврата каретки (CR) в конце каждого сканирования. Настроим это:
0, 1, 3 и завершите настройку кодом Save.Теперь необходимо правильно связать устройство с базой данных:
13 (или выберите символ 'CR' из выпадающего списка).---
Этот способ является наиболее отказоустойчивым и профессиональным. Сканер изолируется от клавиатурного ввода, данные никогда не будут «просыпаться» мимо активного поля ввода в операционной системе, а внешнее событие в 1С будет срабатывать гарантированно.
Рассмотрим детальный алгоритм настройки виртуального COM-порта:
Очень важно соблюдать последовательность действий, иначе Windows сопоставит сканеру стандартный драйвер клавиатуры, и COM-порт не создастся:
Сам сканер по умолчанию работает в режиме клавиатуры. Переведем его в режим эмуляции последовательного интерфейса:
TRMUSB130).Даже в режиме COM-порта сканеру необходим суффикс возврата каретки для корректной отсечки данных драйвером 1С. Повторите процедуру программирования суффикса 13 (CR), описанную в Меоде 1.
Также откройте свойства созданного COM-порта в Диспетчере устройств и убедитесь, что скорость передачи данных (Baud rate), четность и стоповые биты соответствуют настройкам, которые вы укажете в 1С (стандартно: 9600 bps, 8 data bits, no parity, 1 stop bit).
---
Если физически сканер настроен верно, но 1С по-прежнему игнорирует сканирование, проблема кроется в коде конфигурации или привязке событий в форме.
Если вы используете старый драйвер ScanOPOS.dll, убедитесь, что его разрядность соответствует разрядности клиента 1С. Для 32-битного клиента 1С (даже на 64-битной Windows) библиотека должна быть зарегистрирована в системе через командную строку от имени администратора:
regsvr32 "C:\PathToDll\ScanOPOS.dll"
Для того чтобы форма начала принимать внешние события от торгового оборудования, при её открытии должен инициализироваться механизм работы со сканером. Проанализируем правильный шаблон написания кода инициализации в модуле формы (для обычных форм, таких как в УПП):
Процедура ПриОткрытии()
// Проверим подключение торгового оборудования и зарегистрируем форму как получателя событий
Если ПолучитьСерверТО() <> Неопределено Тогда
ПолучитьСерверТО().ПодключитьКлиента(ЭтаФорма);
КонецЕсли;
КонецПроцедуры
Процедура ПриЗакрытии()
// Обязательно отключаем прослушивание при закрытии формы, чтобы освободить порт
Если ПолучитьСерверТО() <> Неопределено Тогда
ПолучитьСерверТО().ОтключитьКлиента(ЭтаФорма);
КонецЕсли;
КонецПроцедуры
Это одна из самых частых ошибок начинающих разработчиков 1С. Процедура ВнешнееСобытие может быть написана в коде модуля формы абсолютно корректно, но если в свойствах самой формы (в палитре свойств на вкладке «События») поле «Внешнее событие» пустое — платформа никогда не передаст управление в эту процедуру. Обязательно выберите имя вашей процедуры в свойствах формы!
Шаблон обработки события в модуле формы должен выглядеть следующим образом:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Проверяем, что событие сгенерировано именно сканером штрихкода
Если ПолучитьСерверТО().ПолучитьСобытиеОтСканера(Событие) Тогда
// Временно приостанавливаем прослушивание, чтобы избежать дребезга или повторного сканирования
ПолучитьСерверТО().ИсключитьПрослушивание(ЭтаФорма);
Штрихкод = СокрЛП(Данные);
// Наша функция обработки полученного штрихкода
ОбработатьПолученныйШтрихкод(Штрихкод);
// Возвращаем форму в режим прослушивания событий сканера
ПолучитьСерверТО().ВключитьПрослушивание(ЭтаФорма);
КонецЕсли;
КонецПроцедуры
---
Поскольку модель 1452g является беспроводной (Bluetooth), у нее есть несколько специфических аппаратных нюансов, которые могут влиять на генерацию событий:
Применяя данные методы и последовательно исключая возможные проблемы на уровне прошивки сканера, системных драйверов Windows и кода конфигурации 1С, мы гарантированно добьемся стабильного срабатывания внешнего события при каждом сканировании штрихкода.