DataMatrix
DataMatrix (DM) — обязательный код маркировки для товаров, подлежащих прослеживаемости в системе "Честный знак". Эта страница описывает внутреннюю структуру кода, правила валидации и нормализации DataMatrix до UIT.
О передаче кодов через API: CIS-коды. Общая информация о маркировке: Обзор маркировки.
Формат DataMatrix
Полный DataMatrix состоит из блоков, разделённых GS-символами (\u001d). Каждый блок начинается с AI-идентификатора (Application Identifier):
| AI | Название | Длина данных | Описание | Входит в UIT? |
01
|
GTIN | 14 цифр (фиксированная) | Глобальный идентификатор товара | Да |
21
|
Serial Number | 13 символов | Уникальный серийный номер единицы товара | Да |
240
|
ТН ВЭД | 4 цифры | Код товарной номенклатуры (опционально) | Да (если есть) |
91
|
Validation | переменная | Валидационная часть криптохвоста | Нет |
92
|
Crypto | переменная | Криптоподпись | Нет |
UIT = AI 01 + GTIN + AI 21 + Serial + [AI 240 + ТН ВЭД]. Длина: 31 символ (без ТН ВЭД) или 38 символов (с ТН ВЭД). Lamoda хранит только UIT.
Примеры
Полный DataMatrix (с ТН ВЭД):
010467003301005321gJk6o54AQBJfX\u001d2406401\u001d91ffd0\u001d92LGYcm3FRQrRdNOO+8t0pz78QTyxxBmYKhLXaAS03jKV7oy+DWGy1SeU+BZ8o7B8+hs9LvPdNA7B6NPGjrCm34A==
UIT (с ТН ВЭД) — 38 символов:
010467003301005321gJk6o54AQBJfX2406401
Полный DataMatrix (без ТН ВЭД):
010467003301005321gJk6o54AQBJfX\u001d91ffd0\u001d92LGYcm3FRQrRdNOO+8t0pz78QTyxxBmYKhLXaAS03jKV7oy+DWGy1SeU+BZ8o7B8+hs9LvPdNA7B6NPGjrCm34A==
UIT (без ТН ВЭД) — 31 символ:
010467003301005321gJk6o54AQBJfX
Скрытые символы (GS)
В DataMatrix присутствуют управляющие символы-разделители:
| Символ | Unicode | JSON-представление | Описание |
| GS | U+001D |
\u001d
|
Group Separator — разделитель блоков данных |
| FNC1 | — | Не передаётся | Функциональный символ (только для сканера) |
⚠ Частая ошибка: При копировании кода из сканера GS-символ может потеряться или отображаться как пустой символ. При передаче полного DataMatrix в JSON убедитесь, что \u001d присутствует между блоками.
Валидация
Правила валидации UIT
| Проверка | Требование |
| Длина | Ровно 31 символ (без ТН ВЭД) или ровно 38 символов (с ТН ВЭД) |
| Начало |
Начинается с 01 (AI для GTIN)
|
| GTIN | Позиции 2–15: 14 цифр |
| AI серийного номера |
Позиции 16–17: 21
|
| Серийный номер | Позиции 18–30: 13 символов из набора GS1 AI-21 (ASCII 33–122) |
| AI ТН ВЭД (если 38 символов) |
Позиции 31–33: 240
|
| ТН ВЭД (если 38 символов) | Позиции 34–37: 4 цифры |
| Уникальность | Каждый UIT уникален для единицы товара |
Примеры валидации и парсинга (Python)
import re
def validate_uit(uit):
"""Валидация UIT-кода"""
# Серийный номер: 13 символов из набора GS1 AI-21 (ASCII 33-122)
pattern_short = r'^01\d{14}21[!-z]{13}$' # 31 символ
pattern_long = r'^01\d{14}21[!-z]{13}240\d{4}$' # 38 символов
if len(uit) == 31 and re.match(pattern_short, uit):
return {'valid': True, 'type': 'UIT без ТН ВЭД'}
elif len(uit) == 38 and re.match(pattern_long, uit):
return {'valid': True, 'type': 'UIT с ТН ВЭД'}
else:
return {'valid': False, 'error': 'Неверный формат UIT'}
def parse_uit(uit):
"""Парсит UIT и возвращает компоненты"""
result = {}
if uit.startswith('01') and len(uit) >= 31:
result['gtin'] = uit[2:16] # 14 цифр GTIN
result['serial'] = uit[18:31] # 13 символов серийного номера
if len(uit) == 38 and uit[31:34] == '240':
result['tnved'] = uit[34:38] # 4 цифры ТН ВЭД
return result
# Примеры
validate_uit("010467003301005321gJk6o54AQBJfX")
# {'valid': True, 'type': 'UIT без ТН ВЭД'}
validate_uit("010467003301005321gJk6o54AQBJfX2406401")
# {'valid': True, 'type': 'UIT с ТН ВЭД'}
parse_uit("010467003301005321gJk6o54AQBJfX2406401")
# {'gtin': '04670033010053', 'serial': 'gJk6o54AQBJfX', 'tnved': '6401'}
Нормализация DataMatrix → UIT
Lamoda автоматически нормализует полный DataMatrix до UIT при получении через API. Внутренняя реализация использует парсинг по AI-идентификаторам: извлекаются AI 01 (GTIN), AI 21 (серийный номер) и опционально AI 240 (ТН ВЭД). Криптохвост (AI 91, 92) отбрасывается.
Если вы хотите нормализовать DataMatrix на своей стороне, рекомендуемый подход — парсинг по AI-идентификаторам:
def normalize_datamatrix(dm: str) -> str:
"""Извлечь UIT из полного DataMatrix через парсинг AI-идентификаторов.
Подход аналогичен внутренней реализации Lamoda:
1. Разбиваем по GS-символу (\x1d) на блоки
2. Извлекаем GTIN (AI 01), серийный номер (AI 21), ТН ВЭД (AI 240)
3. Собираем UIT, отбрасывая криптохвост (AI 91, 92)
"""
blocks = dm.split('\x1d')
gtin = None
serial = None
tnved = None
# Первый блок: AI(01) + GTIN(14) + AI(21) + Serial(13) идут вместе
first = blocks[0]
if first.startswith('01') and len(first) >= 31:
gtin = first[2:16] # 14 цифр GTIN
serial = first[18:31] # 13 символов серийного номера
# Ищем AI 240 (ТН ВЭД) в оставшихся блоках
for block in blocks[1:]:
if block.startswith('240'):
tnved = block[3:7] # 4 цифры ТН ВЭД
break
elif block.startswith('91') or block.startswith('92'):
continue # Пропускаем криптохвост
# Также проверяем ТН ВЭД в первом блоке (если GS перед 240 отсутствует)
if tnved is None and first.startswith('01') and len(first) > 31:
tail = first[31:]
if tail.startswith('240'):
tnved = tail[3:7]
if gtin is None or serial is None:
raise ValueError(f'Не удалось распарсить DataMatrix: {dm[:40]}...')
# Собираем UIT
uit = f'01{gtin}21{serial}'
if tnved:
uit += f'240{tnved}'
return uit
# Пример
full_dm = "010467003301005321gJk6o54AQBJfX\x1d2406401\x1d91ffd0\x1d92LGYcm3..."
uit = normalize_datamatrix(full_dm)
print(uit) # 010467003301005321gJk6o54AQBJfX2406401
⚠ Рекомендация: Передавайте уже нормализованный UIT для предсказуемости. Автоматическая нормализация на стороне Lamoda — подстраховка, а не основной сценарий.
См. также
Помогла эта информация?
Спасибо за отзыв