Сразу оговорюсь, что данный код не претендует на краткость или оптимальность. Он лишь призван показать состав кода 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;
ДесятичноеЧисло = ДесятичноеЧисло + ТекМножимое*ТекМножитель;
КонецЦикла;
Возврат ДесятичноеЧисло;
КонецФункции