Страница 1 из 1

Честный ЗНАК 80-я система счисления МРЦ Табачная продукция

Добавлено: 20 янв 2020, 22:16
mx4000000
Полезная информация, прямо не относящаяся к данному форуму и если админ решит удалить, то так тому и быть!
Ниже приведенная информация носит исключительно справочный характер и предназначена исключительно для пользователей kkmserver :D
Мне лично не понятно зачем надо было " и ' использовать, но да ладно, им там виднее ......

пример на javascript

function f_NUMtoMRZ(n) //n=цена в копейках
{
var st="",b=80,tn=0,r=0;
var BS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!"+'"'+"%&'*+-./_,:;=<>?";
while (n!=0)
{
r=n % b;
n=Math.floor(n/b);
st=BS[r]+st;
}
return st;
}


function f_MRZtoNUM(n) //Из 80-й системы счисления в МРЦ
{
var e=1,k=0,st=0,b=80;
var BS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!"+'"'+"%&'*+-./_,:;=<>?";
var i=n.length-1;
while (i>-1)
{
k=BS.indexOf(n);
st=st+k*e;
e=e*b;
i--;
}
return st/100;
}

И еще для справки....
Код маркировки на сигаретах состоит из четырех групп кодов:
GTIN - 14 символов, тот же ШК дополненный нулями
USN - 7 символов уникальный серийный номер
MRZ - 4 символа это МРЦ в 80 системе дополненная A до 4-х символов
KOD - 4 символа код проверки

Re: Честный ЗНАК 80-я система счисления МРЦ Табачная продукция

Добавлено: 20 янв 2020, 22:42
zmiulan
они там в маркировке закодировали цену в 80-ричной системе??? "месье знает толк..." :shock:

Re: Честный ЗНАК 80-я система счисления МРЦ Табачная продукция

Добавлено: 20 янв 2020, 22:47
saratovout
mx4000000 писал(а):
20 янв 2020, 22:16
MRZ - 4 символа это МРЦ в 80 системе дополненная A до 4-х символов
zmiulan писал(а):
20 янв 2020, 22:42
они там в маркировке закодировали цену в 80-ричной системе??? "месье знает толк..." :shock:
Вы просто не догадываетесь о их далеко идущих планах по МРЦ.

Re: Честный ЗНАК 80-я система счисления МРЦ Табачная продукция

Добавлено: 21 янв 2020, 13:37
Audim
Ммм.... туплю... О чем речь?

Re: Честный ЗНАК 80-я система счисления МРЦ Табачная продукция

Добавлено: 24 янв 2020, 10:32
mx4000000
Audim писал(а):
21 янв 2020, 13:37
Ммм.... туплю... О чем речь?
Я тут дописал функцию к своему проекту, основанному на вашем расширении, по продаже сигарет (табачная продукция), путем сканирования маркировки на пачке. Для удобства ведения базы товаров ШК и цена берется прямо из маркировки с пачки в виде МРЦ, для дальнейшего использования в чеке. При осмысливании особенностей маркировки сигарет я столкнулся с трудностями в поиске описания ключа основания 80-ричной системы маркировки, и потому решил поделиться тут, может кому то это сэкономит время ;) .

И еще немного информации для справки))))
В принципе не смотря на всю сложность со считыванием маркировки с сигарет, в виде размера маркировки, спайки пленки в местах размещения маркировки, бликов от пленки, двойная пленка на блоках и считывании через две пленки по 10 маркировок, хочу отметить что даже весьма бюджетная модель 2д сканера HH400 за 3 т.р. вполне хорошо справляется со своей задачей, при условии активации режима цветного сканирования и при условии считывания на расстоянии 10-20 см под углом 50-30 гр. в диагональных направлениях квадрата маркировки, желательно в торец шва спайки пленки :lol:

Re: Честный ЗНАК 80-я система счисления МРЦ Табачная продукция

Добавлено: 13 июн 2020, 22:18
kotofeich
Спасибо добрый человек. Воспользовался вашим решением. Выложу тоже мои наброски в php. Скрипт простой - определяет что передали в форму в поле input text, и если это штрих код, то определяет его три вариации - что это штрих код ean с пачки, или matrix code с пачки или с блока.
Мое решение работает со сканером как включение в клавиатуру (не com) и переводит текст если включена русская раскладка клавиатуры.

Код: Выделить всё

<form action="testing.php" method="post">
    <input type="text" name="sh" id="sh"><input type="submit" value="Отправить">
</form>

<script>
document.getElementById("sh").focus();
</script>

<?php
if (!empty($_POST['sh'])) print_r(getcode($_POST['sh']));
        
function getcode($sh)
{
    $qr=array();
    $sh=translatematrix($sh);
    
    //определяем по длине что к нам попало - штрихкод, датаматрикс пачка или датаматрикс блок
    if (strlen($sh)<15)
    {
        //это простой штрихкод
        $qr['vid']="1";
        
        $barcode=str_replace(" ","",$barcode);    
        $barcode = preg_replace("~\D+~","",$barcode);
        $qr['sh']=$sh;
        $qr['csh']=$sh;
    }
    if (strlen($sh)==29)
    {
        //это датаматрикс пачки
        $qr['vid']="2";
        $qr['sh']=substr($sh,0,14);
        
        $len = mb_strlen($qr['sh']);
        for ($k = 0; $k < $len; $k++) 
        {
        $char= mb_substr($qr['sh'], $k, 1);
        if ($char>'0') {$qr['csh']=substr($qr['sh'],$k);break;} 
        }  
        
        $qr['serial']=substr($sh,14,7);
        $qr['mrc']=strtomrc(substr($sh,21,4));
        $qr['code']=substr($sh,25,4);
        
    }    
    if (strlen($sh)==55)
    {
        //это датаматрикс блока
        $qr['vid']="3";
        $qr['sh']=substr($sh,2,14);        
        
        $len = mb_strlen($qr['sh']);
        for ($k = 0; $k < $len; $k++) 
        {
        $char= mb_substr($qr['sh'], $k, 1);
        if ($char>'0') {$qr['csh']=substr($qr['sh'],$k);break;} 
        }  
        $qr['serial']=substr($sh,14);
    }    
    
    return $qr;
}

function strtomrc($n) //Из 80-й системы счисления в МРЦ
{
$e=1;$k=0;$st=0;$b=80;
$BS="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"%&'*+-./_,:;=<>?";
$i=strlen($n)-1;

while ($i>-1)
{
$k=strpos($BS,$n[$i]);
$st=$st+$k*$e;
$e=$e*$b;
$i--;
}
return $st/100;
}

function translatematrix($str)
{
    $word="";
    $len = mb_strlen($str);
    $chars = array();
    $alltranslate=false;
    for ($k = 0; $k < $len; $k++) 
    {
        $char= mb_substr($str, $k, 1);
        $nchar=$char;
        if (ord($char)>128 || $alltranslate==true) {$nchar=setenglish($char);$alltranslate=true;}
        //echo $char." ".ord($char)." ".$nchar."<br>";
        $word.=$nchar;
    }    
    return $word;
}

function setenglish($str)
{
    $tr = array(
        "ф"=>"a","Ф"=>"A","ы"=>"s","Ы"=>"S",
        "в"=>"d","В"=>"D","а"=>"f","А"=>"F","п"=>"g",
        "П"=>"G","р"=>"h","Р"=>"H","о"=>"J","О"=>"J",
        "л"=>"k","Л"=>"K","д"=>"l","Д"=>"L","ж"=>";",
        "Ж"=>":","э"=>"'","Э"=>"\"",
        "я"=>"z","Я"=>"Z","ч"=>"x","Ч"=>"X",
        "с"=>"c","С"=>"C","м"=>"v","М"=>"V",
        "и"=>"b","И"=>"B","т"=>"n","Т"=>"N",
        "ь"=>"m","Ь"=>"M","б"=>",","Б"=>"<",
        "ю"=>".","Ю"=>">","."=>"/",","=>"?",
        "й"=>"q","Й"=>"Q","ц"=>"w","Ц"=>"W",
        "у"=>"e","У"=>"E","к"=>"r","К"=>"R",
        "е"=>"t","Е"=>"T","н"=>"y","Н"=>"Y",
        "г"=>"u","Г"=>"U","ш"=>"i","Ш"=>"I",
        "щ"=>"o","Щ"=>"O","з"=>"p","З"=>"P",
        "х"=>"[","Х"=>"{","ъ"=>"]","Ъ"=>"}",
       );
    return strtr($str,$tr);
}
    
?>

На выходе получаем массив -
[vid] - 1 это ean, 2 это matrix пачки, 3 это matrix блока
[sh] - штрих-код (gtin)
[csh] чистый штрих-код (gtin), с убранными первыми нулями (для хранения в бд)
[serial] - серийный номер для отправки через кассу в ОФД в купе с gtin из второго поля массива
[mrc] - мрц в рублях
[codе] - проверочный код. ХЗ зачем нужен