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

0. Tasselhof 16 06.06.20 15:24 Сейчас в теме
Разбор считанного DataMatrix кода с пачки сигарет - какие символы за что отвечают. Декодирование МРЦ

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 16 07.06.20 21:08 Сейчас в теме
(1) Да, у нас конфигурация самописная, розницы под рукой не оказалось, пришлось самому изобретать.
В моем случае, функцию раскодирования сделал универсальной и строку кодирования передаю вторым параметром. Мало ли кому в голову придет еще "что-то" и "чем-то" кодировать в дальнейшем. Очень уж у нас все динамично =)
Функция мфРаскодироватьЧисло(ЗакодированнаяСтрока,СтрокаКодирования)
	Результат = 0;
	ДлинаСтрокиКодирования = СтрДлина(СтрокаКодирования);
	ДлинаЗакодированнойСтроки = СтрДлина(ЗакодированнаяСтрока);
	Для Сч = 1 По ДлинаЗакодированнойСтроки Цикл
		ТекМножитель = Pow(ДлинаСтрокиКодирования,ДлинаЗакодированнойСтроки-Сч);
		ТекСимвол = Сред(ЗакодированнаяСтрока,Сч,1);
		ПозицияСимволаВСтрокеКодирования = Найти(СтрокаКодирования,ТекСимвол);
		Если ПозицияСимволаВСтрокеКодирования = 0 Тогда
			Возврат Неопределено;
		КонецЕсли;
		ТекМножимое = ПозицияСимволаВСтрокеКодирования-1;
		Результат = Результат + ТекМножимое*ТекМножитель;
	КонецЦикла;
	Возврат Результат;
КонецФункции

Показать
3. mrsmrv 72 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 16 18.06.20 20:36 Сейчас в теме
(4) Не везде МРЦ прописана. По части закона не скажу, почему кто-то вставляет МРЦ, а кто-то нет. Для того и сделана проверка в Рознице, если цена не заоблачная и делится без остатка - это МРЦ, иначе МРЦ не определено.
    Если МРЦ <= 500000
        И МРЦ%100 = 0 Тогда
        Возврат МРЦ / 100;
    Иначе
        Возврат Неопределено;
    КонецЕсли;
6. Renewal 19.06.20 06:26 Сейчас в теме
(5) Это понятно. Тем не менее, в мобильном приложении "Честного знака" МРЦ определяется корректно.
9. Tasselhof 16 29.06.20 20:15 Сейчас в теме
(6) Проверил ваши коды - у меня МРЦ определяет правильно, где-то у вас ошибка в коде
10. Renewal 30.06.20 16:40 Сейчас в теме
(9) Оказалось, что ошибка не в коде, а что драйвер сканера передает марку заглавными буквами.
7. zurprog 29.06.20 13:26 Сейчас в теме
Ошибка в :
Алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456­789!""%&'*+-./_,:;=<>?"

два знака "

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