При работе с операционными системами семейства Linux, в частности Ubuntu, специалисты часто сталкиваются со специфическим поведением торгового оборудования. Типичный сценарий: после обновления конфигурации (например, 1С:Розница) со старых версий на актуальные перестает функционировать сканер штрихкодов, работающий через клавиатурный интерфейс. Попытка установить драйвер заново завершается сообщением о том, что внешняя компонента установлена, но само устройство не инициализируется. Переход с 32-битной платформы 1С на 64-битную решает проблему с установкой компоненты, но приводит к новой ошибке: при попытке выполнить "Тест подключения" в настройках торгового оборудования программа 1С зависает наглухо.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы взаимодействия платформы 1С с устройствами ввода в Linux и рассмотрим по шагам несколько надежных способов устранения зависания.
Для того чтобы понять причину зависания, необходимо заглянуть во внутреннее устройство взаимодействия операционной системы Linux и драйвера 1С. Когда сканер штрихкодов подключен в режиме эмуляции клавиатуры (режим клавиатурного ввода), операционная система воспринимает его как стандартное устройство ввода. Драйвер 1С:Сканеры штрихкода (NativeApi) должен уметь отделять поток символов, идущих от сканера, от символов, которые пользователь вводит с обычной клавиатуры.
Для реализации этого разделения драйвер 1С пытается перехватить низкоуровневые события ввода напрямую из файлов устройств, расположенных по пути /dev/input/event*. Здесь и кроются две главные проблемы:
/dev/input/. При попытке запустить тест подключения драйвер делает запрос к этим файлам, получает отказ в доступе, но из-за некорректной обработки исключений в коде самой компоненты Native API уходит в бесконечный цикл ожидания, что и вызывает глухое зависание всего интерфейса 1С.Рассмотрим подробнее по шагам, как решить каждую из этих проблем и заставить сканер работать стабильно.
Самый первый шаг, который необходимо выполнить, — предоставить пользователю операционной системы права на чтение и запись файлов устройств ввода. Выясним, как это сделать через терминал.
Откроем терминал Ubuntu и добавим текущего пользователя в системную группу input. Для этого выполним следующую команду:
sudo usermod -a -G input $USER
В этой команде переменная $USER автоматически подставляет имя текущего активного пользователя. Если вы настраиваете систему удаленно или под другой учетной записью, замените её на конкретное имя пользователя, под которым запускается среда 1С.
Важный момент: права групп в Linux не применяются мгновенно для уже запущенных процессов и текущей сессии пользователя. После выполнения команды необходимо обязательно завершить текущий сеанс (выйти из системы) и войти заново, а лучше полностью перезагрузить компьютер.
После перезагрузки мы можем проверить, состоит ли пользователь в нужной группе, выполнив команду:
groups
В списке групп обязательно должна присутствовать группа input.
Если добавление в группу input не решило проблему и 1С по-прежнему зависает при обращении к сканеру, проанализируем используемый графический сервер. Если в вашей системе активен Wayland, монопольный захват ввода будет заблокирован на уровне ядра графической оболочки.
Выполним переключение на Xorg по следующему алгоритму:
После смены графического окружения на X11 механизмы перехвата клавиатурных событий Native API смогут беспрепятственно работать с устройствами из /dev/input/, что предотвратит зависания.
Использование сканера штрихкодов в режиме эмуляции клавиатуры в среде Linux исторически считается нестабильным решением из-за постоянной борьбы за фокус ввода. Если при сканировании штрихкода фокус не установлен в активное поле ввода (например, в строку поиска или табличную часть чека), данные уйдут "в пустоту".
Мы настоятельно рекомендуем перевести сканер в режим работы Virtual COM (USB-to-Serial). В этом режиме сканер штрихкодов начинает определяться операционной системой как последовательный порт, а драйвер 1С подключается к нему напрямую. При этом данные будут гарантированно попадать в 1С независимо от того, где находится фокус ввода и какая раскладка клавиатуры активна в данный момент.
Разберем процесс настройки по шагам:
ls -l /dev/ttyACM* /dev/ttyUSB*
Обычно устройство определяется как /dev/ttyACM0 или /dev/ttyUSB0. Зафиксируем это имя.
Для того чтобы платформа 1С имела доступ к чтению и записи этого порта, пользователю требуются права доступа к группе dialout. Добавим пользователя в эту группу через терминал:
sudo usermod -a -G dialout $USER
После этого перезагрузим компьютер для применения прав доступа.
Теперь зайдем в 1С в меню настройки торгового оборудования. В свойствах нашего сканера изменим тип порта с "Клавиатура" на полученный порт (например, выберем /dev/ttyACM0 из выпадающего списка или введем этот путь вручную). Нажмем кнопку "Тест подключения". Теперь тест пройдет мгновенно, без каких-либо намеков на зависание.
При переводе сканера в режим виртуального COM-порта под Linux вы можете столкнуться со следующей проблемой: сканер подключается, но тест выдает ошибку, либо порт оказывается постоянно занят. Виновником этой ситуации является системная служба ModemManager, которая по умолчанию активна во многих дистрибутивах Ubuntu.
Эта служба предназначена для автоматического определения подключаемых USB-модемов. Когда вы переводите сканер в режим COM-порта и вставляете его в USB, ModemManager видит новое serial-устройство, считает его потенциальным модемом и начинает отправлять туда специальные AT-команды для инициализации. В этот момент порт блокируется, а сканер может начать вести себя непредсказуемо (пищать или зависать).
Чтобы решить эту проблему, мы можем полностью отключить службу ModemManager, если на данном рабочем месте не используются мобильные USB-модемы для выхода в интернет. Выполним в терминале команды:
sudo systemctl stop ModemManager
sudo systemctl disable ModemManager
Если модемы на компьютере все же используются, мы можем настроить правила менеджера устройств udev, чтобы служба ModemManager игнорировала конкретно наш сканер по его идентификаторам Vendor ID (VID) и Product ID (PID). Посмотреть VID и PID сканера можно с помощью утилиты lsusb в терминале.
Если вы твердо решили оставить сканер работать в режиме клавиатуры, обратим внимание на настройки драйвера 1С:Сканеры штрихкода (NativeApi) внутри самой программы 1С.
При работе в операционной системе Linux в форме настроек драйвера при выборе порта "Клавиатура" появляется дополнительное поле ввода — "HID устройство". По умолчанию там может быть установлено значение автоматического поиска устройств.
При автоматическом поиске драйвер пытается опросить абсолютно все HID-устройства в системе, включая вашу системную клавиатуру, мышь, а также другие HID-совместимые контроллеры. Если к какому-то из этих сторонних устройств нет прав доступа, происходит зависание.
Для решения этой проблемы выполним следующие действия:
input настроены верно (как описано в Способе 1).Такой явный выбор устройства защитит драйвер от попыток сканирования чужих веток устройств в каталоге /dev/input/ и предотвратит зависания системы при инициализации оборудования.