Как исправить ошибку «Неверный формат штрихкода» при сканировании DataMatrix в 1С на сканере Honeywell 1902?

Системный администратор 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

При работе с маркированной продукцией (обувь, одежда, табак, лекарства и другие категории Честного ЗНАКа) пользователи часто сталкиваются с тем, что при сканировании кода маркировки 2D-сканером система «1С:Предприятие» выдает ошибку «Неверный формат штрих кода» или «Штрихкод не идентифицирован». При этом визуально код кажется абсолютно целым, а при сканировании в обычный текстовый блокнот выдается длинная строка символов.

В этой статье мы подробно разберем, почему возникает эта проблема на популярном беспроводном сканере Honeywell Xenon 1902g-BF (и других моделях этой линейки), проанализируем внутреннюю структуру штрихкода GS1 DataMatrix и рассмотрим два надежных способа настройки оборудования для стабильной работы с 1С.

Суть проблемы: почему 1С не распознает штрихкод?

Для начала давайте выясним причину сбоя на техническом уровне. Код маркировки формата GS1 DataMatrix — это не просто последовательность букв и цифр. Это строго стандартизированная структура, состоящая из нескольких групп данных (идентификаторов применения — AI). Каждый блок имеет свое назначение:

Поскольку серийный номер и криптохвост могут иметь переменную длину, системе необходимо точно знать, где заканчивается одно поле и начинается другое. Для этого в стандарте GS1 используются скрытые управляющие символы, которые не выводятся на печать:

  1. Префикс <FNC1> (символ с кодом ASCII 232) в самом начале штрихкода. Он сообщает декодеру, что перед ним именно стандарт GS1 DataMatrix, а не обычный промышленный DataMatrix.
  2. Разделитель групп данных GS (символ с кодом ASCII 29 / hex 1D). Он вставляется перед каждым полем переменной длины (например, перед идентификаторами 91 или 92).

Проанализируем пример строки, которую получил автор темы при сканировании в текстовый документ:

01046600776804732191003926+505/+96048==

Как мы видим, в этой строке полностью отсутствуют скрытые символы-разделители GS. Сканер просто «склеил» данные в одну сплошную строку. При попытке разобрать этот штрихкод алгоритмы 1С (библиотека стандартных подсистем) пытаются найти разделитель с кодом ASCII 29 после окончания серийного номера. Не найдя его, программа не может определить границы блоков данных и возвращает ошибку «Неверный формат штрихкода».

Дополнительная сложность заключается в спецсимволах криптохвоста (таких как +, /, =). Если сканер настроен в режиме эмуляции клавиатуры, а на компьютере в момент сканирования активна русская раскладка, эти символы могут искажаться, превращаясь в буквы кириллицы, что окончательно ломает валидацию кода в системе Честный ЗНАК.

Почему помог сброс на заводские настройки?

В ходе обсуждения проблемы автор сообщил, что ему помог простой сброс сканера Honeywell 1902 на заводские установки. Действительно, это частая практика. Сброс очищает внутреннюю память устройства от некорректно записанных префиксов, суффиксов или правил форматирования (Data Formatting), которые могли быть настроены ранее.

Однако сброс к заводским настройкам возвращает сканер в режим по умолчанию — USB HID (эмуляция клавиатуры). Этот режим имеет фундаментальные ограничения. Физическая клавиатура компьютера не имеет клавиши для передачи символа ASCII 29 (разделителя GS). Поэтому в режиме клавиатуры сканер пытается имитировать нажатия клавиш, и символ разделителя либо просто игнорируется, либо заменяется пробелом или табуляцией в зависимости от версии прошивки сканера и настроек Windows. Чтобы решить проблему раз и навсегда, рассмотрим два профессиональных метода настройки.

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

Рассмотрим самый надежный способ интеграции торгового оборудования. При подключении через виртуальный COM-порт сканер передает считанные данные напрямую в драйвер 1С в виде чистого байтового потока. Это полностью исключает влияние текущей раскладки клавиатуры (русская/английская) и гарантирует передачу всех управляющих символов, включая <FNC1> и GS (ASCII 29).

Разберем процесс настройки по шагам:

  1. Установка драйвера на компьютер. Перед подключением сканера необходимо скачать и установить официальный драйвер виртуального COM-порта от производителя. Для устройств Honeywell он называется Honeywell HSM USB Serial Driver. Обратите внимание, что разрядность драйвера должна соответствовать разрядности вашей операционной системы Windows.
  2. Перевод сканера в режим эмуляции. Распечатайте официальное руководство пользователя (User Guide) для Honeywell 1902. Найдите в нем раздел «USB Connection» и отсканируйте управляющий штрихкод USB Serial Emulation (в некоторых редакциях инструкций он может называться TRMUSB130 или PAP232). После успешного считывания сканер издаст характерный звуковой сигнал и перезагрузится.
  3. Проверка в диспетчере устройств. Откройте диспетчер устройств Windows. В разделе «Порты (COM и LPT)» должно появиться новое устройство, например, Honeywell USB Serial Device (COM3). Запомните номер выделенного COM-порта.
  4. Настройка в «1С:Предприятие». Откройте вашу базу 1С под правами администратора. Перейдите в раздел «Администрирование» — «Подключаемое оборудование». Создайте новое устройство с типом «Сканеры штрихкодов» и выберите драйвер «1С:Сканер штрихкодов» (или сертифицированный драйвер от Атол/Гексагон).
  5. В окне настройки параметров выберите способ подключения «COM-порт», укажите номер порта из диспетчера устройств (например, COM3). Скорость передачи (Baud rate) обычно устанавливается по умолчанию (9600 или 115200). Нажмите кнопку «Тест подключения» и отсканируйте код маркировки. Вы должны увидеть строку, в которой четко видны управляющие символы разделителей.

Способ 2. Настройка передачи разделителя GS в режиме клавиатуры (USB HID)

Бывают ситуации, когда перевести сканер в режим COM-порта невозможно. Например, при работе пользователей на удаленном сервере через терминальный доступ (RDP), где проброс виртуальных портов затруднен или нестабилен. В этом случае нам придется заставить сканер эмулировать непечатные символы через клавиатурный буфер.

Проанализируем, как настроить передачу символа GS через Alt-последовательности (Alt-коды Windows):

  1. Найдите в руководстве пользователя Honeywell раздел, посвященный эмуляции клавиатуры и передаче управляющих символов ASCII (раздел Control Character Output или Keyboard Modifier HTML/ALT).
  2. Отсканируйте управляющий код для включения режима отправки символов по их ASCII-кодам через зажатую клавишу Alt (обычно это штрихкод KBDALT6 или KBDALT7). При считывании разделителя GS (ASCII 29) сканер будет имитировать быстрое зажатие левого Alt и набор цифр 0029 на цифровом блоке клавиатуры.
  3. Важное условие: Для работы этого метода на клавиатуре компьютера обязательно должна быть активна клавиша NumLock, иначе Alt-последовательности не будут корректно преобразовываться операционной системой.
  4. Чтобы спецсимволы криптохвоста не превращались в русские буквы при активной кириллической раскладке Windows, найдите в инструкции и отсканируйте код Universal Keyboard Helpline или переведите сканер в режим работы с раскладкой по кодам клавиш (HTML Keyboard Emulation).

Как проверить корректность работы сканера без 1С?

Перед тем как подключать оборудование к учетной системе, мы рекомендуем убедиться, что сканер физически считывает и передает разделители. Для этого выполним простую проверку с помощью стороннего софта:

Рассмотрим проверку в бесплатном текстовом редакторе Notepad++:

  1. Запустите Notepad++.
  2. В верхнем меню программы перейдите в раздел «Вид» — «Отображение символов» и установите галочку напротив пункта «Отображать все символы».
  3. Переведите раскладку клавиатуры на английский язык и отсканируйте код маркировки GS1 DataMatrix.
  4. Если сканер настроен правильно, то в месте разделителей вы увидите специальный непечатный символ на черном фоне (например, [GS] или [ESC]). Если же перед вами предстала монолитная строка без выделенных темных блоков — значит, сканер по-прежнему «режет» управляющие символы, и настройку нужно повторить.

Также вы можете воспользоваться онлайн-сервисом проверки сканеров на официальном сайте национальной системы цифровой маркировки Честный ЗНАК. Данный инструмент мгновенно анализирует полученную от сканера строку и подсвечивает, содержит ли она префикс FNC1 и разделители групп данных.

Пример обработки считанного штрихкода в кодовой базе 1С

Если вы разрабатываете собственное решение на платформе «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. Это гарантирует бесперебойную работу вашего склада или торговой точки с любыми кодами маркировки Честного ЗНАКа.

← На главную