Почему сканер штрихкода выдает два или три сообщения вместо одного при работе через RDP?

Системный администратор 1С v8.3 (Обычные формы) Торговля и дистрибуция
← На главную

В практике автоматизации торговых точек и складов часто возникает классическая системная неполадка: при сканировании штрихкода в терминальной сессии (RDP) драйвер торгового оборудования генерирует сразу несколько внешних событий (два или три сообщения подряд), разбивая один штрихкод на части. При этом локально на компьютере (например, в блокнот) штрихкод считывается идеально — одним целым куском.

Давайте подробно проанализируем эту ситуацию на примере сканера Aokia AK-928 и старого бесплатного драйвера АТОЛ 6.5.3, работающих в конфигурации «1С:Управление торговым предприятием» (УТП), и найдем самые надежные способы устранения проблемы.

Прежде всего, проясним важную деталь, упомянутую в обсуждении. Изначально штрихкод длиной 19 символов ошибочно определялся как стандарт EAN13. Как справедливо заметили участники обсуждения, стандарт EAN13 по определению содержит только 13 цифр (12 значащих и 1 контрольный). В процессе диагностики выяснилось, что реальный тип штрихкода на этикетке — это Code128, который отлично поддерживает передачу длинных буквенно-цифровых последовательностей.

---

Выясняем причину: почему штрихкод «рвется» на части?

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

  1. Режим эмуляции клавиатуры (USB-HID): В этом режиме компьютер воспринимает сканер как очень быстро печатающего пользователя. Когда сканер считывает штрихкод Code128 на 19 символов, он пытается мгновенно отправить эти 19 нажатий клавиш в операционную систему.
  2. Особенности протокола RDP: Передача нажатий клавиш через удаленный рабочий стол происходит не единым пакетом, а посимвольно. Каждое нажатие («нажали клавишу» — «отпустили клавишу») оборачивается в сетевой пакет и отправляется на сервер. Из-за микролагов сети, колебаний пинга или загруженности процессора пакеты с символами приходят на сервер с неравномерными интервалами времени.
  3. Таймаут драйвера ввода: Драйвер АТОЛ (особенно старых версий) ожидает непрерывного потока данных. У него есть параметр чувствительности (таймаут). Если пауза между приходом двух символов превышает этот таймаут (по умолчанию часто установлено 30–50 мс), драйвер считает, что пользователь закончил сканирование. Он склеивает то, что успел получить, генерирует событие в 1С и передает первую часть кода. Оставшиеся символы, дошедшие по сети чуть позже, драйвер воспринимает как новое сканирование, порождая второе и третье внешние события.

Локально сетевые задержки отсутствуют, поэтому локальный блокнот успевает принять все символы подряд без единого разрыва.

---

Способ 1. Корректировка таймаута чувствительности в драйвере АТОЛ

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

  1. Запустите на терминальном сервере утилиту «Тест драйвера устройств ввода» от имени того пользователя, у которого наблюдаются разрывы при сканировании.
  2. Перейдите в раздел «Настройка свойств» (в некоторых версиях — «Параметры свойства»).
  3. Найдите поле «Таймаут» (в некоторых сборках АТОЛ оно называется «Чувствительность» или «Таймаут клавиатуры»). По умолчанию там будет стоять значение в районе 30 или 50 миллисекунд.
  4. Увеличьте это значение до 150–250 мс. Если качество интернет-соединения с сервером RDP оставляет желать лучшего, можно экспериментально поднять лимит до 300 мс.
  5. Нажмите кнопку «Применить» и протестируйте сканирование в окне теста драйвера. Код должен начать приходить одной строкой.

Важное предупреждение: не устанавливайте таймаут слишком большим (более 500 мс). При высоком значении драйвер будет долго «задумываться» перед отправкой штрихкода в 1С. Кроме того, обычный быстрый ввод пользователя с физической клавиатуры может начать ложно распознаваться драйвером как попытка сканирования.

---

Способ 2. Перевод сканера в режим эмуляции COM-порта (Рекомендуемый способ)

Работа сканера штрихкодов «в разрыв клавиатуры» по RDP признана устаревшим и нестабильным решением. Самым надежным вариантом является перевод устройства в режим эмуляции COM-порта (USB-Virtual COM). В этом режиме данные передаются не как нажатия клавиш, а как цельный буфер данных через виртуальный последовательный порт. Сетевые задержки RDP при этом перестают влиять на целостность пакета.

Рассмотрим детально, как выполнить эту настройку:

  1. Возьмите инструкцию (руководство пользователя) к вашему сканеру Aokia AK-928. Если бумажной версии нет, найдите её электронный вариант на сайте производителя.
  2. Найдите раздел настроечных штрихкодов интерфейса и отсканируйте штрихкод с подписью «USB-COM», «Enable Virtual COM Port» или «USB-to-Serial». После этого сканер может издать характерный звуковой сигнал, а в диспетчере устройств Windows на локальном компьютере появится неопознанное устройство.
  3. Установите на локальном компьютере драйвер виртуального COM-порта для чипсета вашего сканера (обычно это драйверы Prolific, FTDI или специфический драйвер от производителя сканера). Убедитесь, что в диспетчере устройств в разделе «Порты (COM и LPT)» появился новый порт (например, COM3).
  4. Настройте проброс портов в RDP-клиенте. Для этого откройте окно подключения mstsc.exe на локальном ПК, перейдите во вкладку «Локальные ресурсы», в блоке «Локальные устройства и ресурсы» нажмите кнопку «Подробнее...» и установите флажок напротив пункта «Порты».
  5. Подключитесь к терминальному серверу. Теперь ваш локальный COM3 будет проброшен на сервер под именем COM3 (или под другим свободным номером, например, COM4).
  6. В тесте драйвера АТОЛ на сервере измените значение порта с «Клавиатура» на соответствующий проброшенный COM-порт.

При таком подходе данные всегда будут приходить одним пакетом, независимо от сетевых лагов и пинга.

---

Способ 3. Изменение настроек клавиатуры RDP-клиента

Иногда исправить ситуацию с задержками клавиатурного ввода можно простой регулировкой параметров клиента удаленного рабочего стола на локальном компьютере:

  1. Запустите клиент mstsc.exe, но не подключайтесь сразу к серверу.
  2. Нажмите кнопку «Показать параметры» и перейдите на вкладку «Локальные ресурсы».
  3. В группе настроек «Клавиатура» найдите параметр «Использовать сочетания клавиш Windows» и переключите его в значение «На этом компьютере».
  4. Сохраните конфигурацию подключения и войдите в систему.

Это заставит Windows оптимизировать сетевой буфер обмена клавиатурными нажатиями и значительно снизит вероятность разрыва длинных штрихкодов, а также решит проблему с периодической хаотичной сменой регистра букв (когда строчные буквы в коде внезапно становятся заглавными).

---

Способ 4. Использование пакетного режима и задержек на самом сканере

Если нет возможности использовать эмуляцию COM-порта, можно попробовать перенастроить поведение самого сканера при передаче символов в режиме клавиатуры. Для этого обратитесь к руководству вашего оборудования:

---

Способ 5. Переход со старого драйвера АТОЛ 6.x на современные решения

Драйверы АТОЛ линейки 6.x давно устарели, не поддерживаются разработчиком и часто некорректно работают на современных операционных системах и платформах 1С. Рассмотрим две альтернативы, которые избавят вас от необходимости использовать этот софт:

Использование стандартного NativeAPI драйвера от 1С

В современных конфигурациях разработчики рекомендуют использовать бесплатный сертифицированный драйвер «1С:Сканер штрихкода». Он работает по технологии NativeAPI, полностью бесплатен, регулярно обновляется и содержит встроенные гибкие механизмы настройки таймаута клавиатуры, которые работают на порядок стабильнее старых компонент АТОЛ.

Работа в разрыв клавиатуры без сторонних драйверов

В платформе 1С реализован альтернативный механизм работы со сканером «в разрыв клавиатуры», который вообще не требует установки специальных драйверов торгового оборудования на стороне сервера:

  1. Настройте ваш сканер с помощью сервисных кодов так, чтобы перед штрихкодом он посылал префикс (например, клавишу F7), а в конце штрихкода отправлял суффикс (клавишу Enter).
  2. В стандартных конфигурациях 1С нажатие клавиши F7 вызывает штатное диалоговое окно поиска и ввода штрихкода.
  3. Когда окно открыто, сканер передает туда штрихкод напрямую как поток символов с клавиатуры и автоматически завершает ввод нажатием клавиши Enter. Этот метод полностью исключает влияние драйвера АТОЛ на процесс разбора данных.

Для наглядности, в программном коде обычных форм обработка внешнего события при использовании COM-порта или специализированного драйвера выглядит следующим образом:


Процедура ВнешнееСобытие(Источник, Событие, Данные)
    
    // Проверим, что событие пришло от сканера штрихкода
    Если ПолучитьПолучателяСобытия(Источник) = "СканерШтрихкода" Тогда
        
        // Очистим считанные данные от возможных пробелов и лишних символов
        ОчищенныйШтрихкод = СокрЛП(Данные);
        
        // Передаем обработанный штрихкод в процедуру поиска товара
        ОбработатьШтрихкод(ОчищенныйШтрихкод);
        
    КонецЕсли;

КонецПроцедуры

Использование предложенных подходов — особенно переход на эмуляцию COM-порта (Способ 2) или тонкая регулировка чувствительности (Способ 1) — позволит вам полностью избавиться от проблем разрыва кодов Code128 на удаленном рабочем столе и сделает работу пользователей быстрой и комфортной.

← На главную