При подключении торгового оборудования к платформе 1С:Предприятие 7.7 часто возникает ситуация, когда USB-сканер штрихкодов по умолчанию работает в режиме эмуляции клавиатуры (HID). В таком режиме сканируемые данные имитируют ручной ввод с клавиатуры и не вызывают штатную процедуру ОбработкаВнешнегоСобытия. Это критично для большинства нетиповых и отраслевых конфигураций, где алгоритм обработки завязан исключительно на перехват асинхронных событий от виртуального последовательного порта. Разберем по шагам, как перевести сканер Honeywell (Metrologic) Eclipse MS5145 в режим эмуляции COM-порта, правильно установить драйверы в операционной системе и корректно настроить прием данных в 1С 7.7.
Для того чтобы сканер перестал определяться операционной системой как стандартная HID-клавиатура и начал работать как виртуальный последовательный порт, выполним аппаратную перенастройку с помощью управляющих сервисных штрихкодов из официального руководства (MetroSelect Configuration Guide):
После перевода устройства в новый режим Windows обнаружит новое непознанное устройство, для которого необходимо установить официальный драйвер виртуального порта производителя. Проанализируем правильный порядок действий:
SCANOPOS.DLL, она зачастую не может работать с номерами портов выше COM4. Если системе автоматически назначен порт, например, COM5 или выше, откроем свойства устройства в Диспетчере устройств, перейдем на вкладку Параметры порта → Дополнительно и вручную изменим номер порта на свободный в диапазоне от COM1 до COM4.Платформа 1С 7.7 не умеет напрямую обращаться к портам без внешних COM-объектов. Для работы со сканером применяются два основных варианта библиотек:
Выясним причину возможных проблем при регистрации библиотек в современных ОС: поскольку клиент 1С 7.7 является 32-разрядным приложением, в 64-битных версиях Windows внешнюю компоненту необходимо регистрировать через 32-битную утилиту командой из командной строки от имени администратора:
C:\Windows\SysWOW64\regsvr32.exe "C:\PathToDll\Scaner1C.dll"
Перед тем как переходить к отладке кода конфигурации, проверим работоспособность связки на уровне драйвера. Запустим тестовую утилиту драйвера (например, «Тест устройств ввода» АТОЛ) или тестовый режим в обработке обслуживания ТО:
CR или 10 — LF). Если суффикса нет, необходимо настроить его через сервисные штрихкоды сканера (штрихкод Add CR Suffix), так как драйвер завершает прием пакета именно по символу суффикса.Разберем типичную ошибку, из-за которой в нетиповых конфигурациях (например, в «Квартплата для ТСЖ, ЖСК») штрихкод успешно считывается в тесте оборудования, но не обрабатывается в формах справочников и документов.
В платформе 1С 7.7 внешнее событие от оборудования никогда не приходит напрямую в модуль документа или справочника. Событие всегда сначала перехватывается предопределенной процедурой в Глобальном модуле. Если в ней не реализована маршрутизация в активное окно, форма события не увидит.
Рассмотрим пример реализации маршрутизации события в Глобальном модуле:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Источник - имя источника события (например, "Scanner")
// Событие - тип события (например, "BarCodeRead")
// Данные - считанный штрихкод
Если Событие = "BarCodeRead" Тогда
// Очищаем считанную строку от возможных служебных символов
СчитанныйШК = СокрЛП(Данные);
// Передаем управление в процедуру активной открытой формы
Форма = АктивноеОкно();
Если ПустоеЗначение(Форма) = 0 Тогда
Попытка
// Вызываем экспортную процедуру обработки в модуле текущей формы
Форма.ОбработатьЧтениеШтрихкода(СчитанныйШК);
Исключение
// Если в открытой форме процедура не предусмотрена
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Посмотрим на реализацию принимающей процедуры непосредственно в модуле формы справочника или документа:
Процедура ОбработатьЧтениеШтрихкода(Знач Штрихкод) Экспорт
Если ПустаяСтрока(Штрихкод) = 1 Тогда
Возврат;
КонецЕсли;
// Выполняем поиск элемента по штрихкоду
Спр = СоздатьОбъект("Справочник.ЛицевыеСчета");
Если Спр.НайтиПоРеквизиту("Штрихкод", Штрихкод, 1) = 1 Тогда
ТекущийЭлемент = Спр.ТекущийЭлемент();
Иначе
Предупреждение("Элемент со штрихкодом " + Штрихкод + " не найден!");
КонецЕсли;
КонецПроцедуры
УстройствоВключено = 1 или соответствующий метод внешней компоненты). Если компонента выключена, события генерироваться не будут.ОбработкаВнешнегоСобытия в Глобальном модуле. Если отладчик не останавливается при сканировании — проблема в драйвере или COM-объекте. Если останавливается — проверяем корректность логики поиска и заполнения реквизитов формы.