При работе с маркированной продукцией (обувь, одежда, табак, лекарства и другие категории Честного ЗНАКа) пользователи часто сталкиваются с тем, что при сканировании кода маркировки 2D-сканером система «1С:Предприятие» выдает ошибку «Неверный формат штрих кода» или «Штрихкод не идентифицирован». При этом визуально код кажется абсолютно целым, а при сканировании в обычный текстовый блокнот выдается длинная строка символов.
В этой статье мы подробно разберем, почему возникает эта проблема на популярном беспроводном сканере Honeywell Xenon 1902g-BF (и других моделях этой линейки), проанализируем внутреннюю структуру штрихкода GS1 DataMatrix и рассмотрим два надежных способа настройки оборудования для стабильной работы с 1С.
Для начала давайте выясним причину сбоя на техническом уровне. Код маркировки формата GS1 DataMatrix — это не просто последовательность букв и цифр. Это строго стандартизированная структура, состоящая из нескольких групп данных (идентификаторов применения — AI). Каждый блок имеет свое назначение:
Поскольку серийный номер и криптохвост могут иметь переменную длину, системе необходимо точно знать, где заканчивается одно поле и начинается другое. Для этого в стандарте GS1 используются скрытые управляющие символы, которые не выводятся на печать:
Проанализируем пример строки, которую получил автор темы при сканировании в текстовый документ:
01046600776804732191003926+505/+96048==
Как мы видим, в этой строке полностью отсутствуют скрытые символы-разделители GS. Сканер просто «склеил» данные в одну сплошную строку. При попытке разобрать этот штрихкод алгоритмы 1С (библиотека стандартных подсистем) пытаются найти разделитель с кодом ASCII 29 после окончания серийного номера. Не найдя его, программа не может определить границы блоков данных и возвращает ошибку «Неверный формат штрихкода».
Дополнительная сложность заключается в спецсимволах криптохвоста (таких как +, /, =). Если сканер настроен в режиме эмуляции клавиатуры, а на компьютере в момент сканирования активна русская раскладка, эти символы могут искажаться, превращаясь в буквы кириллицы, что окончательно ломает валидацию кода в системе Честный ЗНАК.
В ходе обсуждения проблемы автор сообщил, что ему помог простой сброс сканера Honeywell 1902 на заводские установки. Действительно, это частая практика. Сброс очищает внутреннюю память устройства от некорректно записанных префиксов, суффиксов или правил форматирования (Data Formatting), которые могли быть настроены ранее.
Однако сброс к заводским настройкам возвращает сканер в режим по умолчанию — USB HID (эмуляция клавиатуры). Этот режим имеет фундаментальные ограничения. Физическая клавиатура компьютера не имеет клавиши для передачи символа ASCII 29 (разделителя GS). Поэтому в режиме клавиатуры сканер пытается имитировать нажатия клавиш, и символ разделителя либо просто игнорируется, либо заменяется пробелом или табуляцией в зависимости от версии прошивки сканера и настроек Windows. Чтобы решить проблему раз и навсегда, рассмотрим два профессиональных метода настройки.
Рассмотрим самый надежный способ интеграции торгового оборудования. При подключении через виртуальный COM-порт сканер передает считанные данные напрямую в драйвер 1С в виде чистого байтового потока. Это полностью исключает влияние текущей раскладки клавиатуры (русская/английская) и гарантирует передачу всех управляющих символов, включая <FNC1> и GS (ASCII 29).
Разберем процесс настройки по шагам:
Бывают ситуации, когда перевести сканер в режим COM-порта невозможно. Например, при работе пользователей на удаленном сервере через терминальный доступ (RDP), где проброс виртуальных портов затруднен или нестабилен. В этом случае нам придется заставить сканер эмулировать непечатные символы через клавиатурный буфер.
Проанализируем, как настроить передачу символа GS через Alt-последовательности (Alt-коды Windows):
GS (ASCII 29) сканер будет имитировать быстрое зажатие левого Alt и набор цифр 0029 на цифровом блоке клавиатуры.Перед тем как подключать оборудование к учетной системе, мы рекомендуем убедиться, что сканер физически считывает и передает разделители. Для этого выполним простую проверку с помощью стороннего софта:
Рассмотрим проверку в бесплатном текстовом редакторе Notepad++:
[GS] или [ESC]). Если же перед вами предстала монолитная строка без выделенных темных блоков — значит, сканер по-прежнему «режет» управляющие символы, и настройку нужно повторить.Также вы можете воспользоваться онлайн-сервисом проверки сканеров на официальном сайте национальной системы цифровой маркировки Честный ЗНАК. Данный инструмент мгновенно анализирует полученную от сканера строку и подсвечивает, содержит ли она префикс FNC1 и разделители групп данных.
Если вы разрабатываете собственное решение на платформе «1С:Предприятие» или дорабатываете нетиповую конфигурацию, где не используется Библиотека Стандартных Подсистем (БСП), вам может потребоваться программный разбор считанной строки. Посмотрим на пример кода, который демонстрирует, как в алгоритмах 1С можно отследить наличие разделителя GS (в системе 1С он представляется функцией Символ(29)):
// Функция разбирает считанную строку DataMatrix на составляющие элементы
Функция РазобратьМаркировкуGS1(Знач СчитанныйШтрихкод) Экспорт
РезультатРазбора = Новый Структура;
РезультатРазбора.Вставить("Успешно", Ложь);
РезультатРазбора.Вставить("GTIN", "");
РезультатРазбора.Вставить("СерийныйНомер", "");
РезультатРазбора.Вставить("Криптохвост", "");
// Проверим длину штрихкода
Если ПустаяСтрока(СчитанныйШтрихкод) Или СтрДлина(СчитанныйШтрихкод) < 20 Тогда
Возврат РезультатРазбора;
КонецЕсли;
// В стандартах 1С префикс FNC1 часто отсекается драйвером, разбор начинается с AI 01
Если Лев(СчитанныйШтрихкод, 2) = "01" Тогда
РезультатРазбора.GTIN = Сред(СчитанныйШтрихкод, 3, 14);
ОстаточнаяСтрока = Сред(СчитанныйШтрихкод, 17); // Пропускаем GTIN и идентификатор AI 21
Если Лев(ОстаточнаяСтрока, 2) = "21" Тогда
ОстаточнаяСтрока = Сред(ОстаточнаяСтрока, 3);
// Ищем символ-разделитель GS (ASCII 29)
СимволРазделителя = Символ(29);
ПозицияРазделителя = Найти(ОстаточнаяСтрока, СимволРазделителя);
Если ПозицияРазделителя > 0 Тогда
// Выделяем серийный номер до разделителя
РезультатРазбора.СерийныйНомер = Лев(ОстаточнаяСтрока, ПозицияРазделителя - 1);
// Все что после разделителя — это проверочные реквизиты (криптохвост)
РезультатРазбора.Криптохвост = Сред(ОстаточнаяСтрока, ПозицияРазделителя + 1);
РезультатРазбора.Успешно = Истина;
Иначе
// Если разделитель не найден, разбор невозможен
РезультатРазбора.Успешно = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат РезультатРазбора;
КонецФункции
Использование этого кода наглядно демонстрирует разработчикам важность корректной передачи управляющих символов со сканирующего устройства. Без присутствия Символ(29) в переменной СчитанныйШтрихкод функция поиска разделителя вернет 0, и разбор завершится неудачей.
Резюмируя все вышесказанное: при возникновении ошибки формата штрихкода на Honeywell 1902 не ограничивайтесь простым сбросом на заводские настройки. Переводите устройство в режим виртуального COM-порта с установкой официального драйвера HSM USB Serial Driver. Это гарантирует бесперебойную работу вашего склада или торговой точки с любыми кодами маркировки Честного ЗНАКа.