Рассмотрим ситуацию, с которой часто сталкиваются при внедрении маркировки «Честный Знак». При сканировании двумерного штрихкода (например, сканером Honeywell Orbit 7910g) данные считываются, но часть символов или вся строка внезапно переводится в верхний регистр (капслок). Из-за этого система маркировки не принимает значение, так как криптохвост кода строго чувствителен к регистру.
Проанализируем причину такого поведения и разберем по шагам, как навсегда избавиться от проблем с искажением регистра при сканировании кодов DataMatrix в 1С.
Выясним причину этого явления. Коды маркировки формата GS1 DataMatrix содержат не только привычные буквы и цифры, но и скрытые управляющие символы. К ним относятся разделители блоков данных (символ GS с кодом ASCII 29) и признак символики (FNC1 с кодом ASCII 232). Они критически важны для корректного разделения GTIN, серийного номера и криптохвоста.
Если ваш сканер настроен в режиме эмуляции клавиатуры (USB-HID), он передает считанный код не как единую строку, а как последовательность очень быстрых виртуальных нажатий клавиш. Чтобы передать заглавные буквы, сканер программно «зажимает» и «отпускает» виртуальную клавишу Shift.
Проблема возникает в момент, когда в этот процесс вмешивается пользователь или особенности платформы:
Backspace или перемещается стрелками. Это сдвигает курсор на невидимые управляющие символы, нарушая последовательность буфера клавиатуры Windows. В итоге происходит программное «залипание» регистра — все последующие вводы идут заглавными буквами.Backspace остается из-за системного буфера клавиатуры.Может показаться, что проблему легко решить программной обработкой полученной строки с помощью встроенных функций платформы. Однако использовать функцию Нрег() категорически нельзя. Эта функция переведет абсолютно все символы в нижний регистр.
Код «Честного Знака» (в частности, его криптографическая часть) содержит как строчные, так и прописные буквы английского алфавита. Принудительное изменение регистра сделает код невалидным, и система маркировки ответит ошибкой валидации.
Посмотрим на пример решения, которое можно применить, если по каким-то причинам перенастроить сканер невозможно. Суть заключается в изоляции процесса ввода от рук пользователя.
Поскольку сбой возникает в тот момент, когда кладовщик стирает символы или использует стрелки в поле ввода, мы можем лишить его этой возможности:
В таком случае пользователь физически не сможет нажать Backspace внутри поля со служебными символами, и залипания CapsLock не произойдет. Однако это решение является «костылем» и не защищает от потери управляющих символов в буфере клавиатуры. Для восстановления пропущенных разделителей при работе в таком режиме можно использовать расширение для дополнения кодов маркировки символами GS.
Рассмотрим самое надежное и профессиональное решение. Чтобы полностью исключить влияние раскладки клавиатуры, залипание клавиш Shift и случайные нажатия кладовщиков, необходимо отказаться от режима эмуляции клавиатуры.
Разберем алгоритм действий по шагам:
При такой настройке сканер больше не имитирует нажатие клавиш. Данные передаются напрямую в порт в виде готовой строки, сохраняя все спецсимволы и правильный регистр. В коде 1С эти данные перехватываются специальной предопределенной процедурой.
Посмотрим на пример обработки такого события в модуле формы:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
Если (Источник = "Scanner") И (Событие = "BarCodeValue") Тогда
// Переменная Данные содержит чистую строку штрихкода без искажений
// Здесь мы можем безопасно разобрать DataMatrix на составляющие
ОбработатьОтсканированныйКодМаркировки(Данные);
КонецЕсли;
КонецПроцедуры
Преимущества режима COM-порта:
GS корректно доходят до 1С, что позволяет правильно распарсить код DataMatrix на GTIN и серийный номер.Используя режим виртуального COM-порта, вы обеспечите стабильную и безошибочную работу склада с кодами маркировки «Честного Знака», избежав непредвиденных искажений данных. Для настройки оборудования в типовых конфигурациях можно использовать драйвер NativeAPI для подключения сканеров штрихкода.