Почему сканер неверно распознает символ GS в коде маркировки и как это исправить

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

При работе с системой маркировки «Честный Знак» одной из самых распространенных и неприятных проблем является некорректная передача спецсимвола GS (Group Separator, ASCII 29). Особенно часто эта проблема проявляется при использовании сканеров в режиме эмуляции клавиатуры (Keyboard Wedge) при работе через удаленный рабочий стол (RDP). Проанализируем ситуацию, когда на обычных компьютерах сканер работает корректно, а на ноутбуке вместо разделителя вставляет посторонние символы, например, квадратную скобку [.

Суть проблемы и роль символа GS

Символ GS является непечатным управляющим символом. В кодах DataMatrix он используется для разделения групп данных (Application Identifiers), например, чтобы отделить серийный номер от ключа проверки (криптохвоста). Если информационная система (1С) не получает этот символ или получает его в искаженном виде, код маркировки считается некорректным, и документ не проходит проверку в системе «Честный Знак».

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

Причина 1: Конфликт раскладки клавиатуры

Это самая частая причина искажения символов. Разберем механизм: сканер посылает код символа, который драйвер клавиатуры должен преобразовать в знак. Если на локальном ноутбуке включена русская раскладка, а на сервере — английская (или наоборот), спецсимволы и префиксы трансформируются в случайные знаки. Символ [ в английской раскладке находится на той же клавише, что и х в русской.

Что нужно сделать:

  1. Убедимся, что на ноутбуке (клиенте) по умолчанию установлена английская раскладка клавиатуры.
  2. Проверим, чтобы в момент сканирования раскладка в терминальной сессии (на сервере) также была английской.
  3. В идеале, для корректной работы торгового оборудования, рекомендуется установить английский язык языком ввода по умолчанию в обеих системах.

Причина 2: Эмуляция Alt-кодов и отсутствие NumPad на ноутбуке

Многие сканеры, включая серию Datalogic QuickScan, по умолчанию передают символ GS через комбинацию Alt + 029. Сканер имитирует зажатие клавиши Alt и последовательный ввод цифр на малой цифровой клавиатуре (NumPad).

Выясним причину сбоя на ноутбуках: у большинства ноутбуков отсутствует физический блок цифровых клавиш. Эмуляция Alt-кодов на таких устройствах может работать некорректно или требовать зажатой клавиши Fn, чего сканер сделать не может. В результате вместо управляющего символа в систему «прилетает» мусорный символ или часть цифрового кода.

Решение: необходимо перенастроить сканер на передачу GS другим способом (например, через замену символа на управляющую последовательность Ctrl + ]) или отключить режим Alt Mode в настройках сканера через утилиту Datalogic Aladdin или программирующие штрих-коды из руководства.

Причина 3: Настройки проброса клавиш в RDP

Проанализируем параметры подключения к удаленному рабочему столу. В настройках RDP-клиента (mstsc.exe) есть важная вкладка «Локальные ресурсы». Параметр «Клавиатура: Использовать сочетания клавиш Windows» определяет, где будут обрабатываться системные нажатия.

Если установлено значение «На этом компьютере», то быстрые последовательности, генерируемые сканером, перехватываются ноутбуком. Для стабильной работы сканера в режиме эмуляции клавиатуры необходимо установить значение «На удаленном компьютере». Это позволит передавать скан-код напрямую в сессию 1С без предварительной обработки локальной Windows.

Причина 4: Внутренняя подмена символов в сканере (Character Conversion)

Как было замечено в обсуждении, иногда сканер специально настраивают на замену невидимого символа GS на печатный символ [. Это делается для визуального контроля кода в Блокноте или других редакторах, которые не умеют отображать ASCII 29.

Проверим настройки Character Conversion. Если сканер запрограммирован менять ASCII 29 на [ (ASCII 91), то 1С получит именно скобку. Для 1С это критично, так как она ожидает именно управляющий символ. Посмотрим на алгоритм исправления:

  1. Сбросим настройки сканера к заводским значениям (Reset to Factory Defaults).
  2. Убедимся, что функции «GS1-128 Formatting» включены.
  3. Проверим через стандартный «Блокнот» на сервере: если при сканировании курсор просто перепрыгивает или ничего не отображается в месте разделителя — это хороший знак, значит символ передается как непечатный.

Причина 5: Скорость передачи и задержки (Inter-character Delay)

Ноутбуки часто имеют агрессивные настройки энергосбережения для USB-портов. Если сканер «выстреливает» код маркировки (который может содержать более 80 символов) слишком быстро, буфер клавиатуры RDP-клиента может захлебнуться, что приведет к подмене или потере символов.

Рассмотрим решение через установку задержки: в настройках сканера (раздел Inter-character Delay) установим небольшую паузу между символами (например, 5–10 миллисекунд). Это замедлит ввод, но сделает его значительно надежнее при работе через нестабильные каналы связи или на слабых клиентских устройствах.

Программная обработка на стороне 1С

Если аппаратная настройка всех ноутбуков невозможна, можно рассмотреть вариант программной «очистки» кода в самой 1С. Хотя это считается «костылем», в ряде случаев это спасает ситуацию.

Проанализируем пример кода в 1С, который можно внедрить в обработку внешнего события сканера, если мы точно знаем, что символ [ приходит вместо GS:


// Пример предварительной обработки считанного штрихкода
Функция ОбработатьШтрихкодМаркировки(ДанныеСканера)
    
    // ASCII 29 (GS) часто заменяется на "[" (код 91)
    СимволГС = Символ(29);
    ИскаженныйСимвол = "[";
    
    // Заменяем только в контексте маркировки (DataMatrix начинается с 01)
    Если Лев(ДанныеСканера, 2) = "01" Тогда
        Результат = СтрЗаменить(ДанныеСканера, ИскаженныйСимвол, СимволГС);
    Иначе
        Результат = ДанныеСканера;
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

Важное примечание: Будьте осторожны с этим методом, так как символ [ может теоретически встретиться в самом коде (хотя в серийных номерах и криптохвостах он обычно не используется). Лучшим решением всегда остается перевод сканера в режим Native HID (COM-эмуляция), где символы передаются кодами, а не нажатиями клавиш, что полностью исключает влияние раскладки и RDP. Для перевода оборудования в данный режим можно воспользоваться инструкцией по переключению 2D-сканера в режим эмуляции COM-порта.

Итоговый чек-лист для исправления:

← На главную