При работе со сканерами штрихкодов (ШК) в терминальных сессиях (RDP) специалисты часто сталкиваются с неприятным эффектом: если отсканировать несколько кодов «в пустоту» (когда окно 1С не активно или форма не открыта), то при последующем открытии формы обработки все эти коды «прилетают» в систему одновременно. Это создает хаос в учетных документах и требует ручной очистки данных. Рассмотрим подробно, почему это происходит и как с этим бороться.
Проанализируем ситуацию, описанную в теме. Проблема возникает не в самой конфигурации 1С (будь то УТ 11, ERP или демо-БСП) и даже не в физической памяти сканера АТОЛ SB2108 Plus. Причина кроется в механизме проброса (редиректа) COM-портов через протокол RDP.
Когда сканер настроен в режиме USB-COM, операционная система видит его как последовательный порт. При работе через удаленный рабочий стол служба rdpdr.sys (RDP Device Redirector) создает виртуальный канал передачи данных. Если на стороне сервера приложение (1С) в данный момент не «слушает» порт (например, форма заказа закрыта), драйвер на стороне клиента все равно может принимать данные от физического устройства и накапливать их в системном буфере. Как только в 1С открывается форма и драйвер NativeApi инициализирует подключение к порту, накопленный стек данных моментально сбрасывается в сессию. 1С воспринимает это как серию очень быстрых последовательных событий ScanData.
Посмотрим на возможность программного управления драйвером. В старых версиях драйверов АТОЛ существовал специализированный метод для очистки накопленных сообщений. Рассмотрим пример обращения к такому методу:
// Пример использования старого метода для очистки буфера драйвера
Попытка
ОбъектДрайвера.УдалитьСообщение();
Исключение
// Метод может не поддерживаться в NativeApi драйверах
КонецПопытки;
Однако в современных конфигурациях, использующих БСП и 1С:Сканеры штрихкода (NativeApi), прямого метода очистки буфера через 1С часто не предусмотрено. Драйвер работает событийной моделью. Проанализируем процедуру ОбработкаВнешнегоСобытия в модуле приложения или формы:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
// Если событие пришло от сканера ШК
Если Источник = "BarCodeScanner" Тогда
// Здесь происходит обработка полученного штрихкода
// Если прилетает пачка кодов, эта процедура вызывается циклично
КонецЕсли;
КонецПроцедуры
Если проблема в буфере RDP, 1С просто получает эти события одно за другим, так как для нее они выглядят как реальный ввод пользователя в текущий момент времени.
Выясним, почему режим клавиатуры (HID) часто является более стабильным. Как было замечено в обсуждении, в режиме «в разрыв клавиатуры» двоения и накопления данных обычно не происходит. Это связано с тем, что эмуляция нажатий клавиш обрабатывается системой иначе, чем поток данных через последовательный порт.
Для реализации этого способа выполним следующие шаги:
F7 или редкое сочетание клавиш). Это необходимо, чтобы 1С могла перехватывать ввод сканера даже тогда, когда фокус не стоит в поле ввода, и вызывала внешнее событие, а не просто печатала цифры в активное поле.Важный момент: В режиме HID данные передаются как нажатия клавиш «здесь и сейчас». Если окно 1С не активно, нажатия просто уйдут «в никуда» и не будут буферизоваться службой проброса портов так агрессивно, как в случае с COM-портом.
Рассмотрим аппаратные настройки самого устройства АТОЛ SB2108 Plus. У современных сканеров есть встроенные таблицы программирования. Проанализируем настройки, отвечающие за передачу данных:
Если специфика бизнеса требует работы именно через COM-порт, и стандартный проброс портов Windows (RDPDR) работает некорректно, проанализируем альтернативные варианты:
RDPDR, однако это решение требует глубоких знаний системного администрирования и может повлиять на стабильность других устройств.Проанализировав ситуацию, мы видим, что проблема носит инфраструктурный характер. Для ее решения рекомендуем придерживаться следующего алгоритма:
Во-первых, проверьте версию прошивки сканера АТОЛ. Для ревизий Rev. 2 существуют обновления, оптимизирующие работу с буфером данных.
Во-вторых, если это возможно, переведите работу сканера в режим HID (клавиатура) с использованием префикса. Это самый простой и надежный способ избежать «кэширования» штрихкодов в RDP-канале.
В-третьих, если необходим именно COM-режим, рассмотрите возможность использования альтернативных средств проброса портов, которые гарантируют очистку канала при разрыве или неактивности соединения.
Соблюдение этих рекомендаций позволит исключить «фантомные» сканирования и обеспечит корректную работу сотрудников склада или магазина в терминальной среде 1С.