При работе с торговым оборудованием в среде Linux пользователи часто сталкиваются со специфической проблемой: сканер штрихкодов, работающий в режиме эмуляции клавиатуры (USB-HID), начинает «перемешивать» символы. Например, вместо корректной последовательности 123456789 в поле ввода 1С попадает 671234589. При этом в обычных текстовых редакторах (например, Gedit или Nano) данные могут отображаться корректно, а ошибка проявляется именно внутри платформы 1С:Предприятие.
В этой статье мы подробно разберем причины такого поведения системы, проанализируем разницу между режимами работы и найдем эффективные способы решения проблемы на примере популярного сканера Honeywell Voyager 1200g.
Проанализируем ситуацию: почему символы меняются местами? Основная причина кроется в разнице скоростей передачи данных сканером и обработки событий ввода операционной системой Linux. Когда сканер эмулирует клавиатуру, он «выстреливает» всю последовательность символов штрихкода практически мгновенно. В Linux (особенно в графических оболочках на базе X11 или Wayland) существует очередь событий ввода.
Если система или приложение (в данном случае клиент 1С) в этот момент нагружены обработкой интерфейса, прерывания от USB-устройства могут приходить быстрее, чем приложение успевает забирать их из буфера. В результате некоторые символы обрабатываются «вне очереди». Интересно, что в режиме отладки 1С проблема может исчезать. Это объясняется тем, что при запуске из конфигуратора платформа может изменять приоритеты потоков или вносить микро-задержки в отрисовку интерфейса, что парадоксальным образом дает системе время «переварить» поток данных.
Самый простой и эффективный способ, который помог автору темы, — это программное замедление работы сканера. Мы заставим устройство делать микроскопические паузы после каждого отправленного символа. Это позволит драйверу клавиатуры Linux корректно регистрировать каждое нажатие.
Для реализации этого метода выполним следующие шаги:
Рассмотрим, как это работает: добавив задержку в 4ms, мы увеличиваем общее время передачи 13-значного штрихкода EAN-13 всего на 52 миллисекунды. Для пользователя это будет незаметно, но для очереди событий X-сервера это станет критически важным временем для упорядочивания символов.
Если работа через эмуляцию клавиатуры продолжает доставлять неудобства (например, из-за зависимости от текущей раскладки языка), рассмотрим более профессиональное решение — перевод сканера в режим виртуального COM-порта.
Преимущества данного метода:
/dev/ttyACM0 (или аналогичный).Для настройки в 1С выполним следующие действия:
ls /dev/ttyACM*./dev/ttyACM0).Иногда проблема усугубляется агрессивными настройками повтора клавиш в дистрибутивах Linux (особенно в Debian или Ubuntu). Если системные параметры delay и rate установлены в слишком низкие значения, фильтр ввода может интерпретировать быструю последовательность от сканера как дребезг клавиш.
Попробуем проанализировать настройки клавиатуры через терминал. Мы можем временно изменить параметры повтора, чтобы проверить их влияние на сканер:
# Посмотреть текущие настройки:
xset q | grep -A 1 "Keyboard Control"
# Увеличить задержку перед повтором (первое число — задержка, второе — скорость):
xset r rate 500 30
Это может помочь, если вы не хотите менять настройки самого сканера или используете старое оборудование, которое не поддерживает Inter-character Delay.
Обратим внимание на выбор драйвера в самой 1С. Как было отмечено в обсуждении, драйверы от сторонних производителей (например, Атол) в среде Linux могут вести себя нестабильно. Рекомендуется использовать встроенный в платформу NativeApi драйвер.
Проанализируем важные параметры настройки в 1С:
CR (код 13). Это критично для того, чтобы 1С понимала, где заканчивается штрихкод.Выясним причину, почему в текстовый документ данные падают верно, а в 1С — нет. Текстовый редактор — это простое окно ввода, которое принимает символы по мере их поступления в буфер. Форма 1С — это сложный объект с множеством обработчиков событий (ПриИзменении, Автоподбор и т.д.). Каждое нажатие клавиши может инициировать программный код на встроенном языке 1С, что создает дополнительную нагрузку и приводит к «захлебыванию» очереди ввода без установленных пауз.
Резюме: Если ваш сканер «путает педали» под Linux, первым делом увеличивайте Inter-character Delay до 3-5 мс. Если это не помогает или требуется работа с разными раскладками — переходите на режим USB-COM.