При автоматизации торговых точек на базе устаревших, но все еще активно используемых конфигураций 1С:Предприятие 7.7 технические специалисты часто сталкиваются со следующей проблемой: необходимо подключить сканер штрихкодов, работающий исключительно в клавиатурном режиме (эмуляции клавиатуры), но сама конфигурация рассчитана только на обработку данных через предопределенную процедуру ОбработкаВнешнегоСобытия. Ситуация усложняется, если работа ведется в терминальной сессии (через удаленный рабочий стол RDP).
В этой статье мы подробно разберем, как заставить клавиатурный сканер генерировать внешнее событие в 1С 7.7, проанализируем неочевидные тонкости настройки драйверов АТОЛ, рассмотрим альтернативные методы интеграции и развенчаем популярный миф о некоторых моделях сканеров (на примере популярного Zebex Z-3051HS).
По умолчанию сканер, работающий в режиме эмуляции клавиатуры, передает считанные символы штрихкода в активное текстовое поле так, словно пользователь очень быстро набирает их на физической клавиатуре. Для работы встроенного механизма поиска (например, по нажатию клавиши F7) этого достаточно. Однако для вызова процедуры ОбработкаВнешнегоСобытия() платформе 1С требуется аппаратный сигнал от специального драйвера (внешней компоненты), который слушает конкретный порт (обычно COM-порт) и инициирует событие в системе при поступлении данных.
Давайте разберем по шагам, как настроить эту связку, используя бесплатный драйвер, суффиксы и правильное позиционирование оборудования.
Для того чтобы драйвер оборудования смог однозначно понять, где заканчивается штрихкод, сканер должен передавать управляющий символ окончания ввода. В качестве такого символа используется суффикс возврата каретки (Carriage Return, обозначается как CR или ASCII-код #13), который имитирует нажатие клавиши Enter.
Выясним причину, почему это критически важно: без суффикса драйвер АТОЛ или любая другая компонента не сможет определить завершение передачи пакета данных и внешнее событие просто не произойдет.
Проанализируем процедуру настройки суффикса на примере сканера Zebex Z-3051HS:
Как проверить успешность настройки? Откройте стандартный Блокнот (Notepad) на локальном компьютере и отсканируйте любой штрихкод. Если после вывода цифр курсор автоматически перепрыгнул на новую строку — суффикс настроен корректно.
Для интеграции клавиатурного сканера в 1С 7.7 с генерацией внешнего события традиционно используется Драйвер устройств ввода АТОЛ. Здесь есть важное лицензионное ограничение: современные версии драйверов (8.х и выше) являются платными и в демо-режиме обрезают символы или вносят искусственную задержку в 10 секунд. Для корректной и полностью бесплатной работы нам потребуется старая, но стабильная версия драйвера — 6.5.3 (или любая из веток 6.х, например, 6.8 или 6.12), которая содержит библиотеку Scaner1C.dll. Для упрощения конфигурирования и интеграции оборудования в систему можно использовать внешнюю обработку для настройки параметров подключения сканера.
Рассмотрим подробнее процесс конфигурирования драйвера:
regsvr32 "C:\PathToDriver\Scaner1C.dll".#13 в конце. Это подтверждает, что драйвер видит поток данных со сканера.При работе в режиме клавиатуры драйвер АТОЛ должен как-то отличать ввод данных пользователем вручную от сканирования штрихкода. Для этого используется параметр «Чувствительность» (Sensitivity), измеряемый в миллисекундах. Он определяет максимальное время задержки между приходом отдельных символов штрихкода.
Посмотрим на пример логики работы драйвера:
Рекомендуется экспериментально установить значение чувствительности в диапазоне от 30 до 100 мс. Если выставить слишком маленькую чувствительность, то при малейшем сетевом лаге (особенно актуально для RDP) драйвер решит, что ввод прекратился, и не распознает штрихкод как единое целое. Если установить слишком большую чувствительность, то быстрый ручной ввод пользователя на клавиатуре начнет ошибочно перехватываться драйвером и отправляться в процедуру ОбработкаВнешнегоСобытия.
В оригинальном обсуждении утверждалось, что модель Zebex Z-3051HS принципиально не поддерживает работу в режиме виртуального COM-порта. Это не так. Данный сканер отлично поддерживает эмуляцию виртуального COM-порта (USB Virtual COM / CDC-ACM).
Давайте проанализируем, почему перевод сканера в режим виртуального COM-порта — это наиболее предпочтительный вариант, особенно при работе через удаленный рабочий стол (RDP):
Как перевести сканер в режим виртуального COM-порта?
COM3.mstsc, перейдите на вкладку «Локальные ресурсы», нажмите кнопку «Подробно» в разделе «Локальные устройства и ресурсы» и отметьте галочкой пункт «Порты». После этого порт COM3 локального ПК автоматически пробросится на сервер RDP и будет доступен для 1С 7.7.Стандартная старая внешняя компонента ScanOPOS.dll от фирмы 1С, поставляемая с платформой 7.7, не умела работать с клавиатурными портами напрямую. Однако мало кто знает, что более свежие версии этой библиотеки (выпускаемые для платформы 1С 8.х, начиная с версии 8.0.х) сохранили обратную совместимость с 7.7.
Новые версии ScanOPOS.dll поддерживают выбор порта «Клавиатура». Вы можете зарегистрировать обновленную библиотеку на сервере через regsvr32 и подключить ее стандартным образом в глобальном модуле 1С 7.7. Она также успешно перехватывает поток клавиатуры и генерирует внешнее событие при наличии суффикса #13.
Если в вашей конфигурации 1С 7.7 уже установлена и используется популярная внешняя компонента расширения интерфейса FormEx, вы можете обойтись вообще без установки драйверов торгового оборудования на сервере RDP.
FormEx предоставляет возможность глобального перехвата нажатий клавиш клавиатуры. Мы можем реализовать алгоритм, который замеряет скорость ввода символов и при быстром последовательном вводе цифр, завершающемся клавишей Enter, программно инициирует обработку штрихкода.
Посмотрим на пример реализации такого перехвата в модуле формы или в глобальном модуле:
// Предопределенная процедура FormEx для перехвата нажатий клавиатуры
Процедура ПриНажатииКнопкиКлавиатуры(Контекст, Клавиша, Состояние, Флаги)
// Код клавиши Enter (суффикс нашего сканера) - 13
Если Клавиша = 13 Тогда
// Проверяем накопленный буфер символов
Если ПустаяСтрока(НакопленныйШтрихкод) = 0 Тогда
// Программно вызываем обработку штрихкода
ОбработатьШтрихкод(НакопленныйШтрихкод);
НакопленныйШтрихкод = "";
// Отменяем дальнейшую обработку клавиши Enter системой, чтобы избежать лишних переходов
Контекст.ФлагСтандартнойОбработки = 0;
КонецЕсли;
ИначеЕсли (Клавиша >= 48) И (Клавиша <= 57) Тогда
// Накапливаем только цифры (коды 48-57 для 0-9)
// Здесь также можно добавить замер времени между нажатиями (для отсечения ручного ввода)
НакопленныйШтрихкод = НакопленныйШтрихкод + Симв(Клавиша);
КонецЕсли;
КонецПроцедуры
Данный подход полностью решает проблему "залипания" и зависимости от раскладки клавиатуры в RDP, поскольку коды клавиш перехватываются напрямую на уровне операционной системы до их интерпретации текстовым полем ввода.
Подводя итоги, выделим основные правила успешного подключения клавиатурного сканера в 1С 7.7 через терминальный доступ: