Почему сканер штрихкодов меняет местами символы под Linux и как это исправить?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с торговым оборудованием в среде Linux пользователи часто сталкиваются со специфической проблемой: сканер штрихкодов, работающий в режиме эмуляции клавиатуры (USB-HID), начинает «перемешивать» символы. Например, вместо корректной последовательности 123456789 в поле ввода 1С попадает 671234589. При этом в обычных текстовых редакторах (например, Gedit или Nano) данные могут отображаться корректно, а ошибка проявляется именно внутри платформы 1С:Предприятие.

В этой статье мы подробно разберем причины такого поведения системы, проанализируем разницу между режимами работы и найдем эффективные способы решения проблемы на примере популярного сканера Honeywell Voyager 1200g.

Разберем причину возникновения ошибки

Проанализируем ситуацию: почему символы меняются местами? Основная причина кроется в разнице скоростей передачи данных сканером и обработки событий ввода операционной системой Linux. Когда сканер эмулирует клавиатуру, он «выстреливает» всю последовательность символов штрихкода практически мгновенно. В Linux (особенно в графических оболочках на базе X11 или Wayland) существует очередь событий ввода.

Если система или приложение (в данном случае клиент 1С) в этот момент нагружены обработкой интерфейса, прерывания от USB-устройства могут приходить быстрее, чем приложение успевает забирать их из буфера. В результате некоторые символы обрабатываются «вне очереди». Интересно, что в режиме отладки 1С проблема может исчезать. Это объясняется тем, что при запуске из конфигуратора платформа может изменять приоритеты потоков или вносить микро-задержки в отрисовку интерфейса, что парадоксальным образом дает системе время «переварить» поток данных.

Способ 1. Установка задержки между символами (Inter-character Delay)

Самый простой и эффективный способ, который помог автору темы, — это программное замедление работы сканера. Мы заставим устройство делать микроскопические паузы после каждого отправленного символа. Это позволит драйверу клавиатуры Linux корректно регистрировать каждое нажатие.

Для реализации этого метода выполним следующие шаги:

  1. Найдем техническое руководство (Manual) к вашему сканеру (в данном случае для Honeywell Voyager 1200g).
  2. Найдем раздел Inter-character Delay.
  3. Считаем настроечный штрихкод, устанавливающий задержку. Рекомендуемое значение составляет 2–5 миллисекунд.
  4. Если ручного выбора миллисекунд нет, поищем параметр USB Keyboard Speed и установим значение Slow или Medium.

Рассмотрим, как это работает: добавив задержку в 4ms, мы увеличиваем общее время передачи 13-значного штрихкода EAN-13 всего на 52 миллисекунды. Для пользователя это будет незаметно, но для очереди событий X-сервера это станет критически важным временем для упорядочивания символов.

Способ 2. Перевод сканера в режим USB-COM (Virtual COM Port)

Если работа через эмуляцию клавиатуры продолжает доставлять неудобства (например, из-за зависимости от текущей раскладки языка), рассмотрим более профессиональное решение — перевод сканера в режим виртуального COM-порта.

Преимущества данного метода:

Для настройки в 1С выполним следующие действия:

  1. Переведем сканер в режим USB Serial с помощью управляющего штрихкода из мануала.
  2. В ОС Linux проверим появление устройства: ls /dev/ttyACM*.
  3. В 1С откроем «Подключаемое оборудование» и выберем драйвер «1С:Сканеры штрихкода (NativeApi)».
  4. В параметрах подключения укажем путь к устройству (например, /dev/ttyACM0).

Способ 3. Настройка параметров операционной системы

Иногда проблема усугубляется агрессивными настройками повтора клавиш в дистрибутивах Linux (особенно в Debian или Ubuntu). Если системные параметры delay и rate установлены в слишком низкие значения, фильтр ввода может интерпретировать быструю последовательность от сканера как дребезг клавиш.

Попробуем проанализировать настройки клавиатуры через терминал. Мы можем временно изменить параметры повтора, чтобы проверить их влияние на сканер:


# Посмотреть текущие настройки:
xset q | grep -A 1 "Keyboard Control"

# Увеличить задержку перед повтором (первое число — задержка, второе — скорость):
xset r rate 500 30

Это может помочь, если вы не хотите менять настройки самого сканера или используете старое оборудование, которое не поддерживает Inter-character Delay.

Рекомендации по настройке драйверов в 1С

Обратим внимание на выбор драйвера в самой 1С. Как было отмечено в обсуждении, драйверы от сторонних производителей (например, Атол) в среде Linux могут вести себя нестабильно. Рекомендуется использовать встроенный в платформу NativeApi драйвер.

Проанализируем важные параметры настройки в 1С:

Выясним причину, почему в текстовый документ данные падают верно, а в 1С — нет. Текстовый редактор — это простое окно ввода, которое принимает символы по мере их поступления в буфер. Форма 1С — это сложный объект с множеством обработчиков событий (ПриИзменении, Автоподбор и т.д.). Каждое нажатие клавиши может инициировать программный код на встроенном языке 1С, что создает дополнительную нагрузку и приводит к «захлебыванию» очереди ввода без установленных пауз.

Резюме: Если ваш сканер «путает педали» под Linux, первым делом увеличивайте Inter-character Delay до 3-5 мс. Если это не помогает или требуется работа с разными раскладками — переходите на режим USB-COM.

← На главную