Почему не работает клавиатура в Windows и как решить проблему со сменой COM-портов сканера штрихкодов?

Системный администратор IT и автоматизация бизнеса
← На главную

В процессе обслуживания рабочих станций и кассовых узлов нередко возникают ситуации, когда операционная система внезапно перестает принимать ввод с клавиатуры или мыши, а в Диспетчере устройств напротив оборудования отображается желтый восклицательный знак с ошибкой 41: «Драйвер для этого устройства успешно загружен, но само устройство не обнаружено». Параллельно с этим на рабочих местах операторов или кассиров может наблюдаться сбой торгового оборудования: сканер штрихкодов при каждом переподключении или перезагрузке захватывает новый виртуальный COM-порт, доходя до сотых номеров, из-за чего программа 1С теряет связь со сканером.

Разберем по шагам причины возникновения этих сбоев, выясним внутреннюю механику работы системных фильтров ввода и приведем детальные инструкции по восстановлению работы устройств.

Восстановление работы клавиатуры и мыши через реестр

Проанализируем ситуацию с блокировкой клавиатур: замена устройств с интерфейсом PS/2 на USB или удаление устройств из конфигурации не приносят результата, поскольку сбой происходит на уровне системного стека драйверов класса устройств. Чаще всего сбой вызывается некорректным обновлением или удалением антивирусных решений, средств защиты информации, систем контроля действий сотрудников (DLP) или программ виртуализации. При деинсталляции модуль удаляет свои бинарные файлы драйверов с диска, но оставляет ссылку на них в системных фильтрах реестра. В результате стек драйверов ввода не может инициализироваться целиком.

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

  1. Обеспечим доступ к управлению операционной системой. Если клавиатура полностью заблокирована, запустим экранную клавиатуру osk.exe (ее можно открыть прямо с экрана блокировки Windows через меню специальных возможностей) либо подключимся к компьютеру по протоколу RDP (удаленный рабочий стол перехватывает ввод на терминальном уровне в обход локального стека драйверов ввода).
  2. Откроем редактор реестра, нажав сочетание клавиш Win + R и введя команду regedit.
  3. Перейдем в ветку реестра, отвечающую за класс клавиатур: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318}
  4. Найдем параметр с именем UpperFilters. По умолчанию для стандартной клавиатуры Windows его значение должно содержать исключительно kbdclass. Если в параметре присутствуют хвосты сторонних драйверов (например, DwDevGuard, klkbdflt и другие), откроем параметр на редактирование и удалим все посторонние строки, оставив только значение kbdclass.
  5. Проверим аналогичную ветку для мыши, если манипулятор также не определяется: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96F-E325-11CE-BFC1-08002BE10318}. Здесь в параметре UpperFilters по умолчанию должно быть прописано только mouclass.
  6. Обратим особое внимание на тип данных параметра UpperFilters: он строго должен иметь тип «Многострочный параметр» (REG_MULTI_SZ). Если параметр был поврежден твикером или неопытным пользователем и пересоздан как обычный строковый параметр (REG_SZ), где значения разделены запятыми, система выдаст ошибку инициализации. В таком случае удалим строковый параметр и создадим заново параметр типа REG_MULTI_SZ со значением kbdclass с новой строки.
  7. Для устройств стандарта PS/2 убедимся, что драйвер контроллера включен в системе: перейдем в ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i804prt и проверим значение параметра Start. Оно должно быть равно 1 (автоматический запуск на этапе загрузки ядра) или 3 (по требованию). Значение 4 свидетельствует о полном отключении контроллера.
  8. Перезагрузим операционную систему для применения параметров. После перезапуска стандартные драйверы Windows инициализируются корректно.

Решение проблемы с бесконечной сменой COM-портов сканера штрихкодов

Рассмотрим подробнее проблему, упомянутую участниками обсуждения: сканер штрихкодов самопроизвольно меняет номера виртуальных COM-портов (COM5, COM7 ... COM200), оставляя старые порты занятыми в списке скрытых устройств. В среде 1С это приводит к фатальным сбоям: внешняя компонента торгового оборудования (например, ScanOPOS) или Библиотека подключаемого оборудования (БПО) обращаются к жестко заданному в карточке устройства порту. При смене номера порта 1С выдает ошибку «Порт недоступен», блокируя работу кассы или склада, а при номерах портов выше COM16 старые библиотеки вовсе не способны открыть соединение.

Причиной такого поведения является отсутствие у микросхемы USB-сканера уникального серийного номера (дескриптора) либо перевод сканера в режим виртуального COM-порта (USB-VCP/CDC) при нестабильном питании USB-контроллера. Windows считает каждое повторное подключение в разъем появлением нового физического оборудования и выделяет под него следующий свободный номер порта.

Разберем по шагам, как очистить таблицу занятых портов и зафиксировать номер:

  1. Включим отображение всех неактивных скрытых устройств. Для этого откроем командную строку от имени администратора и выполним команду:
    
    set devmgr_show_nonpresent_devices=1
    start devmgmt.msc
    
    В открывшемся Диспетчере устройств выберем меню Вид -> Показать скрытые устройства, раскроем ветку Порты (COM и LPT) и удалим серые неактивные дубликаты сканера.
  2. Сбросим внутренний счетчик занятых портов операционной системы. Откроем редактор реестра и перейдем по пути: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter. Параметр ComDB представляет собой битовую карту распределения портов от 1 до 256. Очистим или обнулим значение этого параметра (установив шестнадцатеричные нули) и перезагрузим компьютер. Это сбросит карту занятости, и нумерация начнется сначала (с COM1/COM3).
  3. Отключим привязку создания портов к физическому USB-разъему при отсутствии серийного номера сканера. В Диспетчере устройств в свойствах сканера на вкладке «Сведения» выясним его аппаратные идентификаторы VID (Vendor ID) и PID (Product ID). Затем в ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\UsbFlags создадим двоичный параметр с именем вида IgnoreHWSerNumVIDPID (например, IgnoreHWSerNum05E01200) и присвоим ему значение 01. Это запретит системе дублировать COM-порты при переподключении устройства.

Оптимальная настройка торгового оборудования в 1С

Проанализируем архитектурные альтернативы подключения сканеров в 1С:Предприятии, позволяющие навсегда избавиться от проблем с виртуальными COM-портами:

  1. Режим эмуляции клавиатуры (HID Keyboard / Разрыв клавиатуры): переведем сканер штрихкодов в режим эмуляции клавиатуры путем считывания соответствующего сервисного штрихкода из руководства к сканеру. В этом режиме устройство не требует драйверов COM-портов и не создает виртуальных портов в системе. Для корректной обработки событий в 1С настроим префикс (например, клавишу F7) или завершающий суффикс (CR/Enter).
  2. Режим прямого обмена USB HID POS (Native USB): современные типовые конфигурации 1С на базе актуальной Библиотеки подключаемого оборудования (БПО) поддерживают работу со сканерами через нативный интерфейс USB HID POS. Переведя сканер сервисным кодом в данный режим, выберем в 1С тип оборудования «1С:Сканеры штрихкода (NativeApi)». В этом случае 1С взаимодействует со сканером напрямую на уровне системных событий USB без участия механизмов эмуляции COM-портов, что полностью исключает потерю связи и блокировку оборудования.
← На главную