Расшифровка DataMatrix кода с пачки сигарет (табачная продукция)

Публикация № 1247366

Разработка - Защита и шифрование

DataMatrix Честный ЗНАК МРЦ кодировка программирование торговое оборудование

Разбор считанного DataMatrix кода с пачки сигарет - какие символы за что отвечают. Декодирование МРЦ

Сразу оговорюсь, что данный код не претендует на краткость или оптимальность. Он лишь призван показать состав кода DATAMATRIX с пачки табачной продукции и, главным образом, алгоритм кодирования значения максимальной розничной цены (МРЦ) в этом самом коде.

Итак. При считывании 2D-сканером кода DATAMATRIX с пачки, мы получаем строку.

Пример с реальной упаковки: "046062030980264!2zVAAADD8JV/x", где:

1. первые 14 символов (цифры) "04606203098026" - содержат код товара (GTIN);

2. следующие 7 символов (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) "4!2zVAA" - индивидуальный серийный номер упаковки табачной продукции;

3. следующие 4 символа (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) "ADD8" - максимальная розничная цена (МРЦ) в копейках закодированная по строке из 80 символов "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!"%&'*+-./_,:;=<>?";

4. последние 4 символа (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) "JV/x" - код проверки

Процедура РасшифроватьDataMatrixСПачкиСигарет()
	//Считываем содержание кода DataMatrix с пачки сигарет
	//Описание содержания кода:
	// - первая группа состоит из 14 цифр и содержит код товара;
	// - вторая группа состоит из 7 символов (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) и содержит индивидуальный серийный номер упаковки табачной продукции;
	// - третья группа состоит из 4 символов (цифр,строчных и прописных букв латинского алфавита, а также специальных символов) и содержит в перекодированном виде максимальную розничную цену потребительской упаковки с точностью до одной копейки;
	// - четвертая группа состоит из 4 символов (цифр, строчных и прописных букв латинского алфавита, а также специальных символов) и содержит код проверки.	
	
	//В данном случае содержание кода указано явно, для примера
	СодержаниеКодаDATAMATRIX = "046062030980264!2zVAAADD8JV/x";
	//Выделяем код товара - первые 14 символов
	ИдентификаторGTIN = Лев(СодержаниеКодаDATAMATRIX,14);
	//Выделяем серийный номер упаковки - 7 символов после кода товара
	СерийныйНомер = Сред(СодержаниеКодаDATAMATRIX,15,7);
	//Выделяем МРЦ в зашифрованном виде - 4 символа после серийного номера упаковки
	МРЦИзШтрихКода = Сред(СодержаниеКодаDATAMATRIX,22,4);
	//Выделяем код проверки - последние 4 символа
	КодПроверки = Прав(СодержаниеКодаDATAMATRIX,4);
	//Получаем МРЦ в десятиричном виде (в копейках)
	ДесятичноеЧислоМРЦ = ПолучитьДесятичноеМРЦ(МРЦИзШтрихКода);
	//Если получили десятичное значение МРЦ в копейках, пересчитываем в рубли 
	Если ДесятичноеЧислоМРЦ <> Неопределено Тогда
		МРЦ = ДесятичноеЧислоМРЦ/100;
	КонецЕсли;
КонецПроцедуры

//Функция декодирования максимальной розничной цены с пачки (табачная продукция). Алгоритм кодирования.
Функция ПолучитьДесятичноеМРЦ(МРЦИзШтрихКода)
	//Строка кодирования МРЦ
	//ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!"%&'*+-./_,:;=<>?
	//!!!ВАЖНО
	//!!!Если строка кодирования устанавливается не в коде,
	//!!!а в значении реквизита (константы, справочники и т.п.,
	//!!!то строку брать из комментария,
	//!!!т.к. в значении переменной СтрокаКодирования в коде функции присутствуют лишние кавычки
	СтрокаКодирования = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!""%&'*+-./_,:;=<>?";
	ДлинаСтрокиКодирования = СтрДлина(СтрокаКодирования);
	ДлинаЦеныИзШтрихКода = СтрДлина(МРЦИзШтрихКода);
	ДесятичноеЧисло = 0;
	Для Сч = 1 По ДлинаЦеныИзШтрихКода Цикл
		ТекМножитель = Pow(ДлинаСтрокиКодирования,ДлинаЦеныИзШтрихКода-Сч);
		ТекСимвол = Сред(МРЦИзШтрихКода,Сч,1);
		ПозицияСимволаВСтрокеКодирования = Найти(СтрокаКодирования,ТекСимвол);
		Если ПозицияСимволаВСтрокеКодирования = 0 Тогда
			Возврат Неопределено;
		КонецЕсли;
		ТекМножимое = ПозицияСимволаВСтрокеКодирования-1;
		ДесятичноеЧисло = ДесятичноеЧисло + ТекМножимое*ТекМножитель;
	КонецЦикла;
	Возврат ДесятичноеЧисло;
КонецФункции

 

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Рейтинг всех уровней
1. CnupT 57 07.06.20 17:24 Сейчас в теме
Спасибо за статью, долгое время искал как выковырнуть МРЦ из DataMatrix, в итоге решил проблему найдя код в типовой рознице

Функция МРЦКодаМаркировкиТабачнойПачки(КодМаркировки) Экспорт
	
	ДлинаКода = СтрДлина(КодМаркировки);
	
	Если ДлинаКода <> 29 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	СтрокаМРЦ = Сред(КодМаркировки, 22, 4);
	
	Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789!""%&'*+-./_,:;=<>?";
	
	МРЦ    = 0;
	Индекс = 1;
	Пока Индекс <= 4 Цикл
		
		Символ = Сред(СтрокаМРЦ, Индекс, 1);
		ИндексСимвола = СтрНайти(Алфавит, Символ) - 1;
		Если ИндексСимвола < 0 Тогда
			Возврат Неопределено;
		КонецЕсли;
		
		МРЦ = МРЦ + Pow(80, 4 - Индекс) * ИндексСимвола;
		
		Индекс = Индекс + 1;
		
	КонецЦикла;
	
	// Если цена <= 5000 и нет копеек, то высокая вероятность, что это реальное МРЦ.
	Если МРЦ <= 500000
		И МРЦ%100 = 0 Тогда
		Возврат МРЦ / 100;
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции
Показать
2. Tasselhof 15 07.06.20 21:08 Сейчас в теме
(1) Да, у нас конфигурация самописная, розницы под рукой не оказалось, пришлось самому изобретать.
В моем случае, функцию раскодирования сделал универсальной и строку кодирования передаю вторым параметром. Мало ли кому в голову придет еще "что-то" и "чем-то" кодировать в дальнейшем. Очень уж у нас все динамично =)
Функция мфРаскодироватьЧисло(ЗакодированнаяСтрока,СтрокаКодирования)
	Результат = 0;
	ДлинаСтрокиКодирования = СтрДлина(СтрокаКодирования);
	ДлинаЗакодированнойСтроки = СтрДлина(ЗакодированнаяСтрока);
	Для Сч = 1 По ДлинаЗакодированнойСтроки Цикл
		ТекМножитель = Pow(ДлинаСтрокиКодирования,ДлинаЗакодированнойСтроки-Сч);
		ТекСимвол = Сред(ЗакодированнаяСтрока,Сч,1);
		ПозицияСимволаВСтрокеКодирования = Найти(СтрокаКодирования,ТекСимвол);
		Если ПозицияСимволаВСтрокеКодирования = 0 Тогда
			Возврат Неопределено;
		КонецЕсли;
		ТекМножимое = ПозицияСимволаВСтрокеКодирования-1;
		Результат = Результат + ТекМножимое*ТекМножитель;
	КонецЦикла;
	Возврат Результат;
КонецФункции

Показать
3. mrsmrv 70 08.06.20 07:23 Сейчас в теме
Приятный бонус от современной платформы, что можно играться со сколь угодно большими числами. Раньше, лет 7 назад это не позволялось.
4. Renewal 17.06.20 10:03 Сейчас в теме
Почему-то МРЦ при раскодировании получается с копейками.
Например:
040129228509420000K?'AC0o2B9j - 169.74, на пачке -170,
00000046207821%aGl2c*ABgoNzGX - 68.94, на пачке вообще указана 90.
5. Tasselhof 15 18.06.20 20:36 Сейчас в теме
(4) Не везде МРЦ прописана. По части закона не скажу, почему кто-то вставляет МРЦ, а кто-то нет. Для того и сделана проверка в Рознице, если цена не заоблачная и делится без остатка - это МРЦ, иначе МРЦ не определено.
    Если МРЦ <= 500000
        И МРЦ%100 = 0 Тогда
        Возврат МРЦ / 100;
    Иначе
        Возврат Неопределено;
    КонецЕсли;
6. Renewal 19.06.20 06:26 Сейчас в теме
(5) Это понятно. Тем не менее, в мобильном приложении "Честного знака" МРЦ определяется корректно.
7. zurprog 29.06.20 13:26 Сейчас в теме
Ошибка в :
Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789!""%&'*+-./_,:;=<>?"

два знака "

Правильная строка : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567­89!"%&'*+-./_,:;=<>?
8. Tasselhof 15 29.06.20 20:08 Сейчас в теме
(7) Внимательнее читайте комментарий к коду, там это описано
9. Tasselhof 15 29.06.20 20:15 Сейчас в теме
(6) Проверил ваши коды - у меня МРЦ определяет правильно, где-то у вас ошибка в коде
10. Renewal 30.06.20 16:40 Сейчас в теме
(9) Оказалось, что ошибка не в коде, а что драйвер сканера передает марку заглавными буквами.
Оставьте свое сообщение

См. также

От Hello world - к защите конфигураций за 1 минуту Промо

Защита и шифрование Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

Вы всегда хотели но боялись создать COM объект? Тогда мы идем к вам! С обычным блокнотом, где будем программировать на c#, и таймером ...

19.05.2012    34927    O-Planet    130    

Обезличивание базы средствами Конвертации данных 2

Защита и шифрование v8 КД Бесплатно (free)

Быстро, просто, понятно обезличить нужные данные в любой базе.

14.06.2020    2250    Yashazz    20    

Кодирование по алфавиту. Большие целые числа

Защита и шифрование v8 1cv8.cf Бесплатно (free)

А вы знали, что 1С умеет в очень длинные числа? Кодирование информации в строку по указанному алфавиту, возможен любой алфавит и не только. В тексте приведён алгоритм для кодирования последовательности байт в любой и из любого односимвольного алфавита.

14.05.2020    1378    mrsmrv    5    

SHA512 и HMAC512 на 1С 8 без использования внешних компонент

Защита и шифрование v8 1cv8.cf Бесплатно (free)

Имплементация алгоритма расчета Hash 512 с ключом и без. С ключом по алгоритму HMAC. Используются механизмы платформы начиная с версии 8.3.11.

29.04.2020    2776    mrsmrv    21    

Танцы с бубном! Создаём демонстрационную базу

Защита и шифрование v8 Бесплатно (free)

В статье кратко расскажу Вам о моём опыте создания демонстрационной версии базы данных 1С и способах защиты кода.

08.02.2018    15189    user748289    41    

Симметричное шифрование в 1С

Защита и шифрование v8 1cv8.cf Бесплатно (free)

Настоящая статья посвящена реализации в 1С симметричного шифрования встроенными механизмами

02.06.2015    27139    alex271    8    

Защита конфигурации от ...

Защита и шифрование v8 1cv8.cf Бесплатно (free)

Бывают моменты в жизни, когда нужно сделать возможность входа только одному пользователю после определенного времени. Ниже приведен такой код.

18.05.2015    19025    hakerxp    29    

Хеширование данных с ключом по алгоритму SHA-1 штатными средствами 1С

Практика программирования Защита и шифрование v8 1cv8.cf Бесплатно (free)

Расчет хеш суммы данных по алгоритму SHA-1 с ключом штатными средствами 1С.

27.05.2014    27770    dour-dead    15    

И ещё несколько слов о защите разработок...

Защита и шифрование v8 1cv8.cf Россия Бесплатно (free)

Дневные мысли о механизмах защиты кода... (по мотивам http://www.infostart.ru/profile/8914/blogs/660/)

30.10.2008    40071    ValeriVP    79