FNC1 и GS: почему ваш сканер может «не видеть» код маркировки

06.06.2024

Когда вы сканируете код маркировки на кассе или в приложении Честного ЗНАКа, вы видите набор цифр и букв. Но внутри DataMatrix есть скрытые символы, которые не печатаются и не отображаются на экране, — но именно от них зависит, правильно ли система прочитает код. Это FNC1 и GS.

Что такое FNC1
FNC1 (Function 1 Symbol Character) — это специальный управляющий символ в штрихкодах стандарта GS1. Он не имеет печатного представления и не передаётся в текстовом виде в информационную систему. Его задача — сообщить сканеру, что перед ним именно GS1-код, а не просто DataMatrix .

В GS1 DataMatrix FNC1 используется в двух ролях:

1. Стартовый символ. FNC1 кодируется в первой позиции данных. Когда сканер видит этот символ в начале, он понимает: «Это GS1 DataMatrix, обрабатывай данные по правилам GS1» . Без стартового FNC1 сканер не сможет отличить GS1 DataMatrix от обычного DataMatrix ECC 200. Более того, без FNC1 код просто не является GS1 DataMatrix — это будет обычный DataMatrix, который не пройдёт проверку в системе маркировки .

2. Разделитель полей. Когда в коде несколько элементов данных переменной длины, FNC1 используется как разделитель между ними . Например, если в коде есть GTIN (фиксированная длина), срок годности (фиксированная длина) и серийный номер (переменная длина), то после серийного номера ставится FNC1, чтобы сканер понял, где заканчивается одно поле и начинается следующее .

Что такое GS
GS (Group Separator) — это управляющий символ с кодом ASCII 29 (в шестнадцатеричном виде — 1D). В отличие от FNC1, который является внутренним символом штрихкода, GS — это то, во что превращается FNC1 при передаче данных в информационную систему .

Проще говоря: в самом штрихкоде стоит FNC1. Когда сканер его считывает, он передаёт в систему GS (ASCII 29) как признак того, что поле закончилось. Стандарт GS1 требует, чтобы разделитель передавался именно как <GS> (ASCII 29) .

Это создаёт известную проблему: символ GS не отображается на экране в виде какого-то значка. В текстовых редакторах он может выглядеть как странный пробел или вообще отсутствовать. Поэтому при настройке сканера часто возникают сложности — сканер «теряет» разделитель, и система получает склеенные данные .

Почему это критично для Честного ЗНАКа
Коды маркировки Честного ЗНАКа — это GS1 DataMatrix. Они построены по стандарту GS1, а значит, обязаны содержать FNC1 в первой позиции .

Если код сформирован неправильно — например, без стартового FNC1 или без разделителей GS там, где они нужны, — возникают две проблемы:

1. Сканер не распознаёт код как GS1. Вместо того чтобы передать данные как структурированный набор Application Identifier (AI) и значений, сканер выдаёт «сырую» строку. Система Честного ЗНАКа не может её корректно обработать.

2. Данные «склеиваются». Если в коде несколько полей переменной длины, и между ними нет разделителя GS, система не понимает, где заканчивается серийный номер и начинается, например, срок годности. Результат — ошибка при проверке или при формировании документов.

Что значит «проверка валидности кода»
Валидность кода — это не просто «сканируется или нет». Это соответствие структуры кода стандарту GS1 DataMatrix. Проверка включает:

Наличие стартового FNC1 в первой позиции.

Корректность Application Identifier (AI) — правильные ли идентификаторы использованы.

Правильные разделители GS между полями переменной длины.

Соответствие данных формату, определённому для каждого AI.

Именно поэтому в INCISMARK поиск кодов — это не просто «показать статус». Это проверка, что код действительно является GS1 DataMatrix, а не просто DataMatrix, который «выглядит похоже».

Почему DMSlicer это учитывает
DMSlicer работает с DataMatrix кодами на уровне стандарта GS1. При конвертации и генерации кодов учитываются:

Стартовый FNC1 для маркировки символа как GS1 DataMatrix.

Разделители GS между полями переменной длины.

Корректная структура Application Identifier.

Если исходный файл содержит коды, которые не соответствуют стандарту, DMSlicer это выявит. Если код нужно сгенерировать заново — он будет сформирован правильно, с FNC1 и GS на своих местах.

Итог
FNC1 и GS — это не «детали реализации», а условие того, что код вообще будет прочитан системой. Код без стартового FNC1 — это не GS1 DataMatrix. Код без разделителей GS — это код, который система не сможет корректно разобрать. Проверка валидности и соответствия стандарту GS1 DataMatrix — это не формальность, а защита от ошибок, которые могут привести к отказу системы принять документы или к проблемам при обороте товара.