Как стать автором
Обновить

Маркировка сигарет. Строение кода маркировки

Время на прочтение9 мин
Количество просмотров69K

В этой статье я постараюсь прояснить техническую часть и состав маркировки сигарет.
Простите меня Хабр читатели за укороченный обзор.


Что такое маркированные сигареты?

Маркированными являются те сигареты, на потребительской упаковке которой нанесены средства идентификации с соблюдением требований Закона №381-ФЗ и принятых в соответствии с ним нормативно правовых актов Правительства РФ.
Таким образом, для признания товаров маркированными необходимо выполнить следующие условия:

  1. На товары должны быть нанесены средства идентификации (код маркировки)
  2. В информационной системе мониторинга должны содержаться сведения о нанесении средств идентификации на сигареты (это делает производитель сигарет)
  3. В информационной системе мониторинга должны содержаться достоверные сведения о товарах

Напоминаем, что наличие в информационной системе мониторинга сведений об обороте сигарет не является условием для признания продукции маркированной.
Для тех покупателей, кто приобрел маркированные сигареты до 01.07.2020 года на бумажных носителей, не нужно волноваться и подавать куда то остатки. Сигареты, введенные в оборот производителем до 01.07.2020 зарегистрированы в системе мониторинга как «временно не прослеживаемые» и в соответствии с Правилами допускается их дальнейший оборот.

Надо помнить, что в течение периода эксперимента для производителей (2018-07.2019) состав маркировки менялся. Производители сигарет совместно с оператором ЦРПТ пытались найти приемлемые решения. Вся произведенная продукция с нанесенной маркировкой в этот переходный период также являлась маркированной.

Давайте разберем строение кода маркировки сигарет, действующего сегодня.
Он, кстати, является копией кода маркировки сигарет в некоторых европейских странах. Именно поэтому для транснациональных компаний маркировка стала конкурентным преимуществом над Российскими производителями.

Для кодирования серийного номера сигарет и МРЦ (максимальной розничной цены) используется 80 символов:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!”%&’*+-./_,:;=<>?
Алгоритм кодирования-декодирования МРЦ основан на переводе размера МРЦ в копейках в 80-ричную систему исчисления, используя следующий алфавит:Alphabet for encoding

Кодирование
Процедура кодирования
  1. МРЦ преобразуем в копейки, например
  2. Находим целую часть и остаток от деления МРЦ на основание системы счисления (в нашем случае – 80)
  3. Берём символ из алфавита по индексу, равному остатку и записываем его в начало результирующей строки
  4. Повторяем шаги 2 и 3 пока целая часть не окажется равной 0
  5. Дополняем результирующую строку до 4 символов слева символом по индексу 0 из алфавита (“A”)
Пусть МРЦ = 146рублей 30копеек, переводим тогда МРЦ копейки = 14630к
Результирующая строка изначально пустая
  1. Находим целое и остаток от деления 14630 на 80: 182 и 70
  2. Находим символ по индексу 70 в алфавите и добавляем его в начало результирующей строки: “.”
  3. Целое от деления больше 0, поэтому находим новые целое и остаток от деления 182 на 80: 2 и 22
  4. Находим символ по индексу 22 в алфавите и добавляем его в начало результирующей строки: “W.”
  5. Целое от деления больше 0, поэтому находим новые целое и остаток от деления 2 на 80: 0 и 2
  6. Находим символ по индексу 2 в алфавите и добавляем его в начало результирующей строки: “CW.”
  7. Целое равно 0, поэтому дополняем результирующую строку слева нулевым символом: “ACW.”

Декодирование

Процедура декодирования

  1. Для каждого символа из закодированного представления МРЦ повторяем следующие шаги
  2. Возводим длину алфавита, равную 80, в степень, равную позиции текущего символа МРЦ, считая с конца строки и начиная с 0, и умножаем на индекс текущего символа в алфавите
  3. Прибавляем полученное значение к результирующему
Пусть закодированное значение МРЦ равно “ACW.”

Результирующее значение изначально равно 0.

1. Берём первый символ МРЦ: “A”2. Индекс символа “A”: 03. Возводим 80 в степень 3 (позиция текущего символа, считая от конца строки из 4 символов) и умножаем на 0, получаем 04. Прибавляем 0 к результирующему значению строке: 05. Берём второй символ МРЦ: “C”6. Индекс символа “C”: 27. Возводим 80 в степень 2 и умножаем на 2, получаем 128008. Прибавляем 12800 к результирующей строке: 128009. Берём третий символ МРЦ: “W”10. Индекс символа “W”: 2211. Возводим 80 в степень 1 и умножаем на 22, получаем 176012. Прибавляем 1760 к результирующему значению: 1456013. Берём четвёртый символ МРЦ: “.”14. Индекс символа “.”: 7015. Возводим 80 в степень 0 и умножаем на 70, получаем 7016. Прибавляем 70 к результирующему значению: 1463017. Итоговое значение МРЦ = 14360к или 146р30к

mrp encoder on с++
using System;
using System.Text;

namespace SharedUtil.Mrp
{
    public static class MrpEncoder
    {
        public const string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"%&\'*+-./_,:;=<>?";

        public static string Encode(uint value, byte paddingLength = 4)
        {
            var builder = new StringBuilder();
            long result = value;
            do
            {
                long rmdr;
                result = Math.DivRem(result, Alphabet.Length, out rmdr);
                builder.Insert(0, Alphabet[(int) rmdr]);
            } while (result > 0);

            return builder.ToString().PadLeft(paddingLength, Alphabet[0]);
        }

        public static uint Decode(string value)
        {
            uint result = 0;
            for (int i = 0; i < value.Length; i++)
            {
                var characterIndex = Alphabet.IndexOf(value[i]);
                if (characterIndex < 0)
                {
                    throw new ArgumentException(string.Format("Invalid character: '{0}'", value[i]));
                }
                result += (uint) (Math.Pow(Alphabet.Length, value.Length - 1 - i) * characterIndex);
            }

            return result;
        }
    }
}
Поскольку на практике МРЦ(максимальная розничная цена) округляется до рублей и имеет диапазон от 60 до 500 рублей, можно сделать вывод: МРЦ в 80-ричной кодировке всегда начинается с «A», а заканчивается на один из четырех символов «A»,«U»,«o,»8". Можно использовать это для проверки валидности МРЦ в коде маркировки пачки.

Таблица кодирования МРЦ.
Таблица МРЦ

Рассмотрим маркировку на примере Сигарет с фильтром «T&W» ОРИДЖИНАЛ КОМПАКТ МРЦ 106"

Вот как выглядит маркировка на пачках и блоках:
Маркировка сигарет на пачках и блокахИзвините, я не нашел блок с МРЦ 106, для фото брал 115.

Маркировка пачки:
DataMatrix пачки
0461003014152700000HdAB0oOnE1

Строка длиной 29 символов, содержит:
  • GTIN-14 (14 цифровых символов). Содержит лидирующие «0» и EAN-13 код для единицы измерения «пачка» прижаты к правому краю. Аналогичен обычному EAN-13, нанесенному на пачке.
  • Серийный номер (7 символов) . Идентификационный код, сгенерированный оператором эмиссии из набора 80 символов. Задумывался он как уникальный для указанного EAN.
  • МРЦ (4 символа). Максимальная розничная цена, указанная в копейках в 80-ричном исчислении.
  • Криптохвост (4 символа). Код создается на производстве в «черном ящике» при запросе очередного пула кодов у оператора эмиссии маркировки. Его запрещено накапливать в базах данных и передавать третьим лицам. Именно это ограничение хоть и защищает от утечки кодов маркировки, но порождает проблемы, описанные ниже.
Исправление неточности в статье
GTIN-14 (14 цифровых символов). Содержит лидирующие «0» и EAN-13 код для единицы измерения «пачка» прижаты к правому краю. Аналогичен обычному EAN-13, нанесенному на пачке.
АО «ФИЛИП МОРРИС ИЖОРА» так не считает и делает различными GTIN в маркировке и в нанесенном с боку штрихкоде EAN13.


Маркировка блоков:
DataMatrix блокаЧеловекочитаемая копия кода маркировки
(01)04610030141534(21)00000!&<FNC1>(8005)106000<FNC1>(93)yikZ

Строка длиной не менее 41 символов и содержит код в формате GS1. Скобочки добавлены для наглядности. Содержит символы GS1 <FNC1>
  • (01) GTIN-14 (14 цифровых символов). Содержит лидирующие «0» и EAN-13 код для единицы измерения «блок». Аналогичен обычному EAN-13 нанесенному на блоке.
  • (21) Серийный номер (7 символов). Идентификационный код, сгенерированный производителем из набора 80 символов. Задумывался как уникальный для указанного GTIN-14.
  • (8005) МРЦ (6 цифровых символов). Максимальная розничная цена, указанная цифрами в копейках для блока. В нашем примере 1060.00 рублей для блока (106 для пачки)
  • (93) Криптохвост (4 символа). Код создается на производстве в «черном ящике» при запросе очередного пула кодов у оператора эмиссии маркировки. Его запрещено накапливать в базах данных и передавать третьим лицам.
В код могут быть включены дополнительные данные, но первыми должны идти коды 01 и 21.

Маркировка коробов:
Маркировка короба в виде GS1-CODE128
(01)14610030141524 (21)0011986<FNC1>(8005)106000<FNC1>(37)50

Строка длиной не менее 25 символов. Содержит обязательные коды 01 и 21 в формате GS1. Каждый производитель сам определяет состав кода маркировки для транспортной упаковки. Не имеет криптохвоста. Может быть нанесен как GS-1 DataMatrix код.
Часто производители дублируют GS-1 (CODE-128) и GS-1 DataMatrix, вот пример:
Другие производителя иногда не указывают МРЦ, а некоторые добавляют элемент 240 для указания внутреннего кода номенклатуры производителя.
Разберем пример кода маркировки транспортной упаковки «короб»:
  • (01) GTIN-14 (14 цифровых символов). Содержит IFT-14 код для единицы измерения «короб». Аналогичен обычному IFT-14, нанесенному на коробе в черной рамке.
  • (21) Серийный номер (7-20 цифр). Идентификационный код, сгенерированный производителем и обеспечивающий неповторимость в рамках одного IFT-14 кода.
  • (8005) МРЦ юнита (6 цифровых символов). Максимальная розничная цена, указанная в копейках для вложенного юнита – «блока».
  • (37) Количество вложенных юнитов  (2 и более цифровых символов). Количество вложенных в короб блоков сигарет.
В код могут быть включены дополнительные данные, но первыми должны идти коды 01.

ВНИМАНИЕ! ИЗМЕНЕНИЯ В МАРКИРОВКЕ КОРОБОВ ПОСЛЕ ВЫПУСКА СТАТЬИ:
Мы получили несколько официальных разъяснений от ЦРПТ по поводу маркировки коробов и я считаю необходимым отразить их в статье.

ВОПРОС: Какие символы могут применяться при указания серийного номера (21) кода маркировки для транспортного КОРОБА.
Допустимые значения:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!"%&'()*+,-./_:;=<>?.
ВОПРОС: Какое количество символов в поле (21) возможно указывать в коде маркировки транспортной упаковки КОРОБ. Только 7 символов или любое до 20 символов?
Серийный номер должен быть не короче 7 символов.
Рекомендуем начать серийный номер с префикса фабрики и линии, если применимо, и использовать простой счетчик (инкремент) коробов.
Вопрос: Могут ли быть одинаковыми серийные номера в поле (21) для разных МРЦ при маркировки КОРОБОВ и наличии в коде поля (8005)?
Да, в данном случае, серийные номера могут быть одинаковыми.
Маркировка паллет:
<img src=«habrastorage.org/webt/oh/dt/9t/ohdt9tprqmxhzjls4tiitbtb4ru.png» alt=«Маркировка паллет»/>
(00)946100301410004634

Строка длиной 20 символов. Содержит префикс 00 и обязательный логистический код паллеты (контейнера) SSCC.

На всех упаковках, кроме пачек, наносится как машиночитаемый код, так и его человекочитаемый эквивалент. Это позволяет набрать код маркировки вручную, если по какой-то причине код не сканируется сканером.

Агрегации и дезагрегации.
В системе маркировки заложены такие возможности, как агрегация и дезагрегация упаковок.До недавнего времени агрегация производилась только на заводе изготовителе. С завода информация передается в систему не только о нанесенных кодах маркировки, но и об ее агрегации. JSON файл, передаваемый с завода в СУЗ, содержит структуру, в которой нельзя отправить данные о маркировке без данных о заводской агрегации. На заводе агрегация блоков/коробов/паллет производится при повторном сканировании маркировки с каждого вложенного элемента и кодов упаковки. Этим обеспечивается проверка читаемости кода и гарантия правильной агрегации, т.е. соответствие кодов, входящих в состав упаковки, коду самой упаковки.
Поэтому старайтесь сохранять заводскую упаковку до последнего момента. Вскрыв заводскую коробку, уже нельзя гарантировать, что все блоки относятся именно к этому коробу. Привет всем торговым сетям, которые проверяют вложенные блоки и вскрывают заводские короба для этого ;)

Недавно функция агрегации сигарет появилась в API для торговых организаций. Видим большую перспективу здесь для отгрузки паллетами с логистических складов.

Дезагрегация производится автоматически, как только вложенная в упаковку единица была использована в документах выбытия или смены собственника. Другими словами, если продать пачку сигарет, то блок, в котором она находилась, автоматически дезагрегируется на пачки, а короб, в котором находился этот блок, дезагрегируется на блоки и т.д. Использовать в дальнейшем дезагрегированные коды блока, короба, паллет будет невозможно. Это очень изящное решение. Сегодня дезагрегация короба/блока производится только в том случае, если выбытие вложенного агрегата произошло на стороне текущего собственника. Если сторонний контрагент попытается продать ваши сигареты из вашей коробки, это не приведет к ее автоматической дезагрегации, поскольку по данным ГИС МТ, контрагент не являлся собственником на момент сканирования маркировки при подачи сведений о выбытии.

Описание кодов идентификации потребительских упаковок, наборов, групповых упаковок, транспортных упаковок при указании в УПД, УКД
Табачная продукция КИ

с указанием максимальной розничной цены
код товара (14 цифр) ИСН (7 символов) максимальная розничная ценапачки (4 символа)

пример: 00000046198532%J_zMZ401er

без указания максимальной розничной ценыкод товара (14 цифр) ИСН (7 символов)

пример: 00000046214805ltCeK2L

КИГУ

с указанием максимальной розничной цены
01 код товара (14 цифр) 21 (7 символов) 8005 сумма максимальнойрозничной цены (6 символов)

пример: (01)04600266012586(21)E'd8ZnM(8005)100000
пример: 010460026601258621E'd8ZnM8005100000
допустимо указание КИГУ со скобками и без

без указания максимальной розничной цены01 код товара (14 цифр) 21(7 символов

пример: (01)04600266012586(21)E'd8ZnM
пример: 010460026601258621E'd8ZnM
допустимо указание КИГУ со скобками и без

КИТУ

короба: группа1+группа2+группа3
• группа 1
01 код товара (14 цифр) или
02 код товара, входящего в короб (14 цифр)
• группа 2
11 дата изготовления (6 символов) или
13 дата упаковки (6 символов)
• группа 3
21 серийный номер (до 20 символов)
пример:
02046002660125991302071921E'd8ZnMZx
или
01046002660125861101071921E'd8ZnM

паллеты, контейнера:
серийный код транспортной упаковки, SSCC (20 символов) (стандартGS1-128, указывается с идентификатором применения AI (00))
пример: 00177102981700000049

Производители ПО обратите внимание: В примере нигде не применяется символ «FNC1» (код 29). Он вырезается при подстановке в УПД.

Формируемый для подачи сведений файл УПД должен иметь в названии признак маркировки — "«MARK»"

PDF: Официальные методические рекомендации по оформлению УПД/УПДи/УКД

Образцы ЭУПД:

XML. Образец ЭУПД от Мегаполис.

XML. Образец ЭУПД c разными видами упаковок.

XML. Образец уведомления об уточнении счет фактуры.

Теги:
Хабы:
Всего голосов 59: ↑55 и ↓4+71
Комментарии151

Публикации

Истории

Работа

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань