При работе с алкогольной продукцией и сканировании двумерных штрихкодов DataMatrix (марок ЕГАИС) кассиры и операторы иногда сталкиваются со сбоем: вместо привычной последовательности из заглавных латинских букв и цифр в программу попадают посторонние символы. Например, вместо цифры 1 считывается знак !, вместо 4 — знак $, а заглавные буквы превращаются в строчные (например, aSJI27JYD...).
Разберем подробно причины, по которым происходят подобные искажения при считывании штрихкодов, и рассмотрим практические варианты устранения этой проблемы в 1С.
Проблема возникает при использовании 2D-сканеров штрихкодов в режиме эмуляции клавиатуры (KeyBoard Wedge / USB-HID). Проанализируем, что происходит в момент сканирования:
Shift. Буфер ввода операционной системы Windows не всегда успевает вовремя обрабатывать эти события, из-за чего часть символов считывается с инвертированным регистром. В результате 1 превращается в !, 4 — в $, 0 — в ).Caps Lock, переданный сканером поток символов меняет регистр прямо на лету.Shift между локальным ПК и сервером.Проанализируем основные способы устранения этой проблемы — от аппаратной настройки оборудования до доработки кода в 1С.
Самое надежное решение — отказаться от режима эмуляции клавиатуры и перевести USB-сканер в режим виртуального COM-порта (Virtual COM / VCP).
В этом режиме сканер передает данные напрямую в порт как единую готовую строку, минуя буфер ввода клавиатуры Windows. Это полностью исключает влияние активной раскладки, клавиш Shift, Caps Lock и программ-автопереключателей.
Если изменить режим работы сканера невозможно (например, из-за ограничений устаревших торговых конфигураций или платформы 1С 7.7 при работе в клавиатурном режиме), можно перехватывать и восстанавливать поврежденные марки программно.
Структура марки ЕГАИС строго регламентирована: она состоит только из заглавных латинских букв и цифр. Это позволяет создать алгоритм обратной замены спецсимволов на соответствующие цифры и перевода строчных букв в верхний регистр.
Посмотрим на пример функции обработки полученного штрихкода на языке 1С:
Функция ВосстановитьМаркуЕГАИС(ИсходныйШтрихкод)
Результат = ИсходныйШтрихкод;
// Замена спецсимволов верхнего ряда клавиатуры на цифры
Результат = СтрЗаменить(Результат, "!", "1");
Результат = СтрЗаменить(Результат, "@", "2");
Результат = СтрЗаменить(Результат, "#", "3");
Результат = СтрЗаменить(Результат, "$", "4");
Результат = СтрЗаменить(Результат, "%", "5");
Результат = СтрЗаменить(Результат, "^", "6");
Результат = СтрЗаменить(Результат, "&", "7");
Результат = СтрЗаменить(Результат, "*", "8");
Результат = СтрЗаменить(Результат, "(", "9");
Результат = СтрЗаменить(Результат, ")", "0");
// Приведение всех латинских букв к верхнему регистру
Результат = ВРег(Результат);
Возврат Результат;
КонецФункции
Данная функция принимает считать обработанную строку и выполняет замену спецсимволов обратно на цифры. Применение метода ВРег() приводит все строчные символы к заглавному виду.
Если переключение на COM-порт откладывается, можно скорректировать работу сканера в режиме эмуляции клавиатуры с помощью сервисных штрихкодов из его инструкции:
Shift.ALT + NumPad. Данный режим делает ввод полностью независимым от текущего языка и состояния клавиш модификаторов.