Приветствуем всех специалистов и администраторов, которые столкнулись с автоматизацией торговых точек на базе операционных систем семейства Linux. В этой статье мы подробно разберем одну из самых распространенных и неприятных проблем при подключении торгового оборудования — некорректную работу USB-сканера штрихкодов в режиме клавиатуры на нативном Linux-клиенте 1С:Предприятие.
Часто при тестировании или развертывании рабочих мест на CentOS, Ubuntu или RedHat системные администраторы замечают странное поведение сканера: в среде Windows устройство работает идеально, генерируя внешнее событие 1С, но в Linux-клиенте при сканировании в форме списка номенклатуры событие не срабатывает. При этом в поле быстрого поиска успевает прописаться только первый символ штрихкода. Давайте подробно разберем, почему возникает эта проблема, и рассмотрим проверенные способы её окончательного решения.
Для того чтобы понять суть неисправности, проанализируем, как операционная система обрабатывает сигналы от сканера в режиме эмуляции клавиатуры. В ОС Windows драйвер 1С перехватывает клавиатурные события на глобальном уровне за счет системных хуков (hooks). Это позволяет драйверу мгновенно «склеивать» быстро идущие друг за другом нажатия клавиш от сканера в единый массив (штрихкод) и отправлять его непосредственно в платформу 1С, вызывая внешнее событие.
В Linux-системах (особенно в графических средах на базе серверов X11 или Wayland) аналогичный глобальный перехват ввода стандартными средствами сильно затруднен в целях безопасности. Когда в настройках подключаемого оборудования 1С выбран порт «Клавиатура», система воспринимает сканер как обычного пользователя, который невероятно быстро печатает на клавиатуре. Графический сервер Linux не всегда успевает передавать этот плотный поток символов в активное окно 1С единым буфером. В результате:
ОбработкаВнешнегоСобытия не генерируется, так как драйвер не смог распознать целостный штрихкод.Чтобы решить эту проблему, нам нужно заставить систему и 1С обрабатывать данные напрямую, минуя подсистему эмуляции ввода графического сервера.
---
Наиболее быстрый и эффективный способ исправить проблему в рамках нативного драйвера «Сканеры штрихкода (NativeApi)» — переключить устройство в режим прямого чтения данных. Рассмотрим по шагам, как это сделать.
Параметр «HID-устройство» заставляет драйвер 1С обращаться напрямую к низкоуровневой подсистеме ввода операционной системы Linux (чтение сырых данных из файлов устройств в каталоге /dev/input/ или /dev/hidraw). Драйвер сам забирает пакеты данных от конкретного USB-устройства, полностью игнорируя фокус ввода и эмуляцию клавиатуры. Это позволяет стабильно получать весь штрихкод целиком и корректно генерировать внешнее событие.
Выполним первоначальную настройку в 1С:
После этого сканирование должно начать генерировать внешние события аналогично тому, как это происходит в Windows.
---
Очень часто после переключения в режим «HID-устройство» администраторы сталкиваются с тем, что сканер вообще перестает реагировать в 1С. Это происходит из-за строгой политики безопасности Linux. Разберем этот момент подробнее.
По умолчанию файлы устройств в директории /dev/input/event* принадлежат суперпользователю root и группе безопасности input (или plugdev). Обычный пользователь, под которым запущен графический сеанс 1С, просто не имеет прав на чтение этих файлов. Следовательно, драйвер 1С не может получить доступ к устройству напрямую.
Чтобы исправить это, мы можем пойти двумя путями:
Самый простой путь — добавить пользователя 1С в соответствующую группу. Откроем терминал и выполним команду (для дистрибутивов CentOS / RedHat / Ubuntu):
sudo usermod -a -G input имя_пользователя
Здесь вместо имя_пользователя укажите имя учетной записи Linux, под которой работает кассир или оператор 1С. После выполнения команды обязательно нужно завершить сеанс пользователя (разлогиниться) или перезагрузить ПК, чтобы новые права вступили в силу.
Если вы хотите настроить доступ точечно только для конкретной модели сканера штрихкодов, правильнее будет создать правило для службы udev. Для этого нам нужно узнать Vendor ID (VID) и Product ID (PID) сканера. Подключим сканер к USB и выполним команду:
lsusb
В выводе команды найдем строчку с нашим сканером, она будет выглядеть примерно так:
Bus 003 Device 004: ID 05e0:0610 Symbol Technologies, Inc.
Здесь 05e0 — это VID, а 0610 — это PID.
Теперь создадим файл правил:
sudo nano /etc/udev/rules.d/99-barcode-scanner.rules
Добавим в него следующую строку (заменив значения на свои):
SUBSYSTEMS=="usb", ATTRS{idVendor}=="05e0", ATTRS{idProduct}=="0610", MODE="0664", GROUP="input"
Сохраним файл и применим новые правила без перезагрузки системы:
sudo udevadm control --reload-rules && sudo udevadm trigger
---
Для корректного разбора штрихкода драйвер 1С должен точно знать, в какой момент заканчивается передача данных от сканера. Для этого используются служебные символы завершения (суффиксы).
В операционной системе Windows традиционным суффиксом окончания строки является символ возврата каретки CR (ASCII 13). Однако в средах Linux и Android стандартным завершителем строки чаще выступает символ перевода строки LF (Line Feed — ASCII 10).
Если после перевода в HID-режим штрихкод считывается, но внешнее событие отрабатывает некорректно или с задержкой, выполним следующие шаги:
10 для LF или 13 10 для CR+LF).---
Даже отлично настроенный HID-режим таит в себе одну потенциальную проблему — опасность «случайного ввода». Если кассир случайно свернет окно 1С, откроет текстовый редактор, чат или браузер и нажмет на курок сканера, весь штрихкод распечатается в активное поле стороннего приложения. Это может привести к порче данных или отправке конфиденциальной информации в рабочий чат.
Чтобы полностью исключить этот фактор риска, мы рекомендуем перевести сканер в режим эмуляции COM-порта (USB-COM). В этом режиме данные передаются строго в выделенный виртуальный порт и считываются исключительно программой 1С, независимо от того, где сейчас находится фокус ввода на экране.
Разберем по шагам, как это реализовать в Linux:
cdc-acm). Сканер перестанет определяться как клавиатура и появится в системе как виртуальный последовательный порт. Проверить это можно командой:
ls /dev/ttyACM*
Или:
ls /dev/ttyUSB*
Обычно устройство монтируется как /dev/ttyACM0.
dialout или uucp). Выполним команду:
sudo usermod -a -G dialout имя_пользователя
Перезапустим сеанс пользователя или перезагрузим ПК.
/dev/ttyACM0).Мы подробно проанализировали причины сбоев при интеграции торгового оборудования и разобрали два надежных сценария исправления ситуации. Использование режима «HID-устройство» решает проблему в пару кликов, а переход на «USB-COM» гарантирует максимальную стабильность и безопасность рабочего места кассира в Linux-среде.