Почему при сканировании марки ЕГАИС возникают спецсимволы и как это исправить в 1С?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

При работе с алкогольной продукцией и сканировании двумерных штрихкодов DataMatrix (марок ЕГАИС) кассиры и операторы иногда сталкиваются со сбоем: вместо привычной последовательности из заглавных латинских букв и цифр в программу попадают посторонние символы. Например, вместо цифры 1 считывается знак !, вместо 4 — знак $, а заглавные буквы превращаются в строчные (например, aSJI27JYD...).

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

Выясним причину искажения символов

Проблема возникает при использовании 2D-сканеров штрихкодов в режиме эмуляции клавиатуры (KeyBoard Wedge / USB-HID). Проанализируем, что происходит в момент сканирования:

  1. Рассинхронизация клавиш-модификаторов: Сканер передает символы в операционную систему с очень высокой скоростью. Для передачи цифр верхнего ряда или заглавных букв сканер программно имитирует нажатие и отпускание клавиши Shift. Буфер ввода операционной системы Windows не всегда успевает вовремя обрабатывать эти события, из-за чего часть символов считывается с инвертированным регистром. В результате 1 превращается в !, 4 — в $, 0 — в ).
  2. Случайное нажатие Shift или зажатый Caps Lock: Если оператор в момент считывания случайно задевает клавиатуру или на ней включен Caps Lock, переданный сканером поток символов меняет регистр прямо на лету.
  3. Работа автопереключателей раскладки: Фоновые утилиты (например, Punto Switcher) могут принимать быстро введенный текст со сканера за опечатку и переключать раскладку с английской на русскую прямо во время передачи строки.
  4. Сбои при работе через RDP: При работе в терминальном сеансе удаленного рабочего стола события клавиатуры пробрасываются с задержками, что регулярно приводит к рассинхронизации состояния Shift между локальным ПК и сервером.

Проанализируем основные способы устранения этой проблемы — от аппаратной настройки оборудования до доработки кода в 1С.

Способ 1. Перевод сканера в режим виртуального COM-порта (Рекомендуемый)

Самое надежное решение — отказаться от режима эмуляции клавиатуры и перевести USB-сканер в режим виртуального COM-порта (Virtual COM / VCP).

В этом режиме сканер передает данные напрямую в порт как единую готовую строку, минуя буфер ввода клавиатуры Windows. Это полностью исключает влияние активной раскладки, клавиш Shift, Caps Lock и программ-автопереключателей.

  1. Откройте руководство пользователя к вашему сканеру штрихкодов.
  2. Найдите и отсканируйте управляющий штрихкод перевода в режим USB Virtual COM.
  3. Установите соответствующий VCP-драйвер производителя сканера в операционной системе.
  4. В настройках торгового оборудования 1С перенастройте драйвер сканера на работу через образовавшийся COM-порт (укажите номер порта и скорость передачи).

Способ 2. Программная коррекция и восстановление марки в 1С

Если изменить режим работы сканера невозможно (например, из-за ограничений устаревших торговых конфигураций или платформы 1С 7.7 при работе в клавиатурном режиме), можно перехватывать и восстанавливать поврежденные марки программно.

Структура марки ЕГАИС строго регламентирована: она состоит только из заглавных латинских букв и цифр. Это позволяет создать алгоритм обратной замены спецсимволов на соответствующие цифры и перевода строчных букв в верхний регистр.

Посмотрим на пример функции обработки полученного штрихкода на языке 1С:


Функция ВосстановитьМаркуЕГАИС(ИсходныйШтрихкод)
    
    Результат = ИсходныйШтрихкод;
    
    // Замена спецсимволов верхнего ряда клавиатуры на цифры
    Результат = СтрЗаменить(Результат, "!", "1");
    Результат = СтрЗаменить(Результат, "@", "2");
    Результат = СтрЗаменить(Результат, "#", "3");
    Результат = СтрЗаменить(Результат, "$", "4");
    Результат = СтрЗаменить(Результат, "%", "5");
    Результат = СтрЗаменить(Результат, "^", "6");
    Результат = СтрЗаменить(Результат, "&", "7");
    Результат = СтрЗаменить(Результат, "*", "8");
    Результат = СтрЗаменить(Результат, "(", "9");
    Результат = СтрЗаменить(Результат, ")", "0");
    
    // Приведение всех латинских букв к верхнему регистру
    Результат = ВРег(Результат);
    
    Возврат Результат;
    
КонецФункции

Данная функция принимает считать обработанную строку и выполняет замену спецсимволов обратно на цифры. Применение метода ВРег() приводит все строчные символы к заглавному виду.

Способ 3. Настройка параметров сканера (Inter-character Delay и ALT-mode)

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

  1. Увеличение межсимвольной задержки (Inter-character Delay / Key Delay): Установите задержку между отправкой символов в диапазоне от 10 до 30 миллисекунд. Операционная система начнет успевать корректно отрабатывать смену состояния Shift.
  2. Включение режима ALT-кода (ALT Mode / ASCII Mode): Настройте сканер на передачу символов через комбинации ALT + NumPad. Данный режим делает ввод полностью независимым от текущего языка и состояния клавиш модификаторов.
  3. Исключения для автопереключателей: Добавьте исполняемый файл 1С в список исключений утилит вроде Punto Switcher или полностью отключите их на кассовых терминалах.
← На главную