При работе с двумерными штрихкодами (QR-кодами), содержащими кириллицу, разработчики и системные администраторы часто сталкиваются с неприятной проблемой. При чтении кода сканером Zebra вместо понятных русских слов в блокноте или в документе 1С появляются непонятные иероглифы («кракозябры») либо текст в неверной раскладке (например, «ghbdtn» вместо «привет»). При этом, если отсканировать тот же самый QR-код камерой обычного смартфона, текст отображается абсолютно корректно.
В этой статье мы подробно разберем физические и программные причины возникновения этой проблемы, проанализируем поведение оборудования под управлением Windows и предложим несколько надежных способов решения: от быстрой программной конвертации в коде 1С до глубокой аппаратной настройки самого сканера Zebra.
Прежде чем переходить к настройкам, давайте разберемся в механизме передачи данных от сканера в операционную систему. Существуют две основные проблемы, приводящие к искажению русских букв:
Рассмотрим по шагам все доступные способы решения этой проблемы — от простой программной обработки до профессиональной перенастройки оборудования.
Если у вас нет возможности перенастраивать сам сканер на рабочем месте пользователя (например, сканер используется на удаленном складе или у вас нет прав администратора), можно решить проблему программно на стороне 1С. Этот метод упомянут опытными разработчиками в обсуждении на форуме.
Суть метода заключается в том, что при получении данных от сканера в английской раскладке («ghbdtn») система автоматически перекодирует символы в правильную русскую раскладку клавиатуры.
Ниже представлен готовый пример функции на языке 1С, которую можно встроить в модуль управляемого приложения или в обработчик внешнего события формы:
// Функция преобразует строку, ошибочно введенную в английской раскладке клавиатуры, в русскую.
// Используется для обработки данных со сканеров штрихкодов в режиме эмуляции клавиатуры.
Функция ПреобразоватьЛатиницуВКириллицу(Знач ВходнаяСтрока) Экспорт
// Определяем соответствие символов двух раскладок
Латиница = "qwertyuiop[]asdfghjkl;'zxcvbnm,.QWERTYUIOP{}ASDFGHJKL:""ZXCVBNM<>";
Кириллица = "йцукенгшщзхъфывапролджэячсмитьбюЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ";
Результат = "";
КоличествоСимволов = СтрДлина(ВходнаяСтрока);
Для Индекс = 1 По КоличествоСимволов Цикл
ТекущийСимвол = Сред(ВходнаяСтрока, Индекс, 1);
Позиция = СтрНайти(Латиница, ТекущийСимвол);
Если Позиция > 0 Тогда
// Если символ найден в английской раскладке, заменяем его на соответствующий русский
Результат = Результат + Сред(Кириллица, Позиция, 1);
Иначе
// Если символ не найден (например, цифра или спецсимвол), оставляем без изменений
Результат = Результат + ТекущийСимвол;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Для того чтобы использовать эту функцию при сканировании, мы должны вызвать её в обработчике внешнего события 1С. Рассмотрим шаблон вызова:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Проверяем, что событие пришло от сканера штрихкода
Если ПолучитьСигналОтСканера(Событие) Тогда
СчитанныйШтрихкод = Данные;
// Если в считанных данных присутствуют только английские буквы, но мы ожидаем русский текст
Если СодержитТолькоЛатиницу(СчитанныйШтрихкод) Тогда
СчитанныйШтрихкод = ПреобразоватьЛатиницуВКириллицу(СчитанныйШтрихкод);
КонецЕсли;
// Дальнейшая обработка корректного штрихкода
ОбработатьСчитанныйШтрихкод(СчитанныйШтрихкод);
КонецЕсли;
КонецПроцедуры
Преимущества метода: Работает мгновенно, не требует физического доступа к сканеру и изменения его внутренних настроек.
Недостатки: Это «костыль», который борется с симптомами, а не с причиной. Метод не поможет, если сканер передает неудобочитаемые иероглифы (кракозябры UTF-8) вместо латинских букв.
Профессиональное решение проблемы интеграции торгового оборудования с 1С — это полный отказ от режима эмуляции клавиатуры (USB HID) в пользу режима эмуляции виртуального COM-порта (USB CDC / Virtual COM). В этом режиме сканер передает данные напрямую в порт Windows, минуя системную раскладку клавиатуры и фокус ввода.
Проанализируем шаги по настройке данного режима:
Zebra CDC Scanner (COM3). Запомните номер выделенного порта.1С:Сканеры штрихкода (NativeApi).COM3).UTF-8 (или CP1251 в зависимости от исходной кодировки ваших этикеток).После выполнения этих шагов сканер будет идеально передавать любые кириллические символы напрямую в 1С, независимо от того, какой язык выбран на компьютере пользователя в данный момент.
Если бизнес-процесс требует, чтобы сканер работал именно как клавиатура (например, данные необходимо сканировать напрямую в веб-браузер, документы Microsoft Excel или текстовый Блокнот), необходимо научить сканер корректно обрабатывать двухбайтовые символы UTF-8.
Для этого выполните следующие действия:
Эта настройка заставит внутренний микроконтроллер сканера правильно сопоставлять двухбайтовые последовательности UTF-8 и транслировать их в операционную систему как полноценные символы кириллической раскладки Windows.
Для централизованного управления парком торгового оборудования Zebra предоставляет бесплатную профессиональную утилиту 123Scan. С её помощью можно создать единый конфигурационный файл и загрузить его в сканер через USB-кабель.
Разберем процесс настройки по шагам:
Medium Delay (20ms) или Long Delay (40ms). Это гарантированно защитит от «пропуска» букв при передаче данных.После завершения прошивки сканер перезагрузится и начнет эмулировать русскую клавиатуру аппаратно, что полностью устранит появление латинских букв.
Если вы столкнулись с аналогичной проблемой (иероглифы в QR-кодах) не на проводном сканере, а на мобильном терминале сбора данных Zebra под управлением операционной системы Android, решение кроется во встроенной утилите управления сканированием DataWedge.
Проанализируем последовательность действий для ТСД:
Profile0 или профиль, связанный с приложением 1С).Configure scanner settings -> Decoders.QR Code.UTF-8. Если ваши QR-коды генерируются в старой кодировке 1С, выберите WINDOWS-1251.Подводя итог, мы рекомендуем придерживаться следующей стратегии при решении проблемы с русскими буквами в QR-кодах: