В процессе обслуживания рабочих станций и кассовых узлов нередко возникают ситуации, когда операционная система внезапно перестает принимать ввод с клавиатуры или мыши, а в Диспетчере устройств напротив оборудования отображается желтый восклицательный знак с ошибкой 41: «Драйвер для этого устройства успешно загружен, но само устройство не обнаружено». Параллельно с этим на рабочих местах операторов или кассиров может наблюдаться сбой торгового оборудования: сканер штрихкодов при каждом переподключении или перезагрузке захватывает новый виртуальный COM-порт, доходя до сотых номеров, из-за чего программа 1С теряет связь со сканером.
Разберем по шагам причины возникновения этих сбоев, выясним внутреннюю механику работы системных фильтров ввода и приведем детальные инструкции по восстановлению работы устройств.
Проанализируем ситуацию с блокировкой клавиатур: замена устройств с интерфейсом PS/2 на USB или удаление устройств из конфигурации не приносят результата, поскольку сбой происходит на уровне системного стека драйверов класса устройств. Чаще всего сбой вызывается некорректным обновлением или удалением антивирусных решений, средств защиты информации, систем контроля действий сотрудников (DLP) или программ виртуализации. При деинсталляции модуль удаляет свои бинарные файлы драйверов с диска, но оставляет ссылку на них в системных фильтрах реестра. В результате стек драйверов ввода не может инициализироваться целиком.
Для исправления ошибки выполним следующие действия:
osk.exe (ее можно открыть прямо с экрана блокировки Windows через меню специальных возможностей) либо подключимся к компьютеру по протоколу RDP (удаленный рабочий стол перехватывает ввод на терминальном уровне в обход локального стека драйверов ввода).regedit.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96B-E325-11CE-BFC1-08002BE10318}kbdclass. Если в параметре присутствуют хвосты сторонних драйверов (например, DwDevGuard, klkbdflt и другие), откроем параметр на редактирование и удалим все посторонние строки, оставив только значение kbdclass.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96F-E325-11CE-BFC1-08002BE10318}. Здесь в параметре UpperFilters по умолчанию должно быть прописано только mouclass.REG_MULTI_SZ). Если параметр был поврежден твикером или неопытным пользователем и пересоздан как обычный строковый параметр (REG_SZ), где значения разделены запятыми, система выдаст ошибку инициализации. В таком случае удалим строковый параметр и создадим заново параметр типа REG_MULTI_SZ со значением kbdclass с новой строки.HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i804prt и проверим значение параметра Start. Оно должно быть равно 1 (автоматический запуск на этапе загрузки ядра) или 3 (по требованию). Значение 4 свидетельствует о полном отключении контроллера.Рассмотрим подробнее проблему, упомянутую участниками обсуждения: сканер штрихкодов самопроизвольно меняет номера виртуальных COM-портов (COM5, COM7 ... COM200), оставляя старые порты занятыми в списке скрытых устройств. В среде 1С это приводит к фатальным сбоям: внешняя компонента торгового оборудования (например, ScanOPOS) или Библиотека подключаемого оборудования (БПО) обращаются к жестко заданному в карточке устройства порту. При смене номера порта 1С выдает ошибку «Порт недоступен», блокируя работу кассы или склада, а при номерах портов выше COM16 старые библиотеки вовсе не способны открыть соединение.
Причиной такого поведения является отсутствие у микросхемы USB-сканера уникального серийного номера (дескриптора) либо перевод сканера в режим виртуального COM-порта (USB-VCP/CDC) при нестабильном питании USB-контроллера. Windows считает каждое повторное подключение в разъем появлением нового физического оборудования и выделяет под него следующий свободный номер порта.
Разберем по шагам, как очистить таблицу занятых портов и зафиксировать номер:
set devmgr_show_nonpresent_devices=1
start devmgmt.msc
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter.
Параметр ComDB представляет собой битовую карту распределения портов от 1 до 256. Очистим или обнулим значение этого параметра (установив шестнадцатеричные нули) и перезагрузим компьютер. Это сбросит карту занятости, и нумерация начнется сначала (с COM1/COM3).VID (Vendor ID) и PID (Product ID). Затем в ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\UsbFlags создадим двоичный параметр с именем вида IgnoreHWSerNumVIDPID (например, IgnoreHWSerNum05E01200) и присвоим ему значение 01. Это запретит системе дублировать COM-порты при переподключении устройства.Проанализируем архитектурные альтернативы подключения сканеров в 1С:Предприятии, позволяющие навсегда избавиться от проблем с виртуальными COM-портами: