Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Тег 1162 (маркировка шин)

Тег 1162 (маркировка шин)
Я
   55reg
 
11.11.20 - 15:45
Драйвер 10.5, Атол 11Ф, прошивка 7942 (вроде можно сразу кидать марку в Base64 или HEX)

Передаю марку сразу в <GoodCodeData
ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока("44 4D 02 A3 35 A1 50 33 3B 5A 68 44 76 3D 72 64 2C 4B 6B 3E 70")); или
ЗаписьXML.ЗаписатьАтрибут("MarkingCode",XMLСтрока("RE0CozWhUDM7WmhEdj1yZCxLaz5w"));

ККТ не печатает - пишет ошибка что мол не заполнен GTIN - ок - заполняю, далее ошибка SerialNumber - заполнил. Все печатает но на чеке выводит КТ 0000 02900002689075 ;ZhDv=rd,Kk>p - в ОФД FSACozWhUDM7WmhEdj1yZCxLaz5w! вместо RE0CozWhUDM7WmhEdj1yZCxLaz5w! Явно это из за не верного StampType (как мне кажется). Первые 3 символа не верные почему то (FSA а должно быть RE0) - в каких бы я сочетаниях не не передавал параметры!

Уже как только не тасовал эти параметры!
ЗаписьXML.ЗаписатьАтрибут("StampType",XMLСтрока("17485")); // и указывал 444D и 44 4D, 1520 все равно в ОФД не верный Base64! (еще раз - у меня Шины)
ЗаписьXML.ЗаписатьАтрибут("GTIN",XMLСтрока("02900002689075"));
ЗаписьXML.ЗаписатьАтрибут("SerialNumber",XMLСтрока(";ZhDv=rd,Kk>p"));
//ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока("44 4D 02 A3 35 A1 50 33 3B 5A 68 44 76 3D 72 64 2C 4B 6B 3E 70"));
ЗаписьXML.ЗаписатьАтрибут("MarkingCode",XMLСтрока(СокрЛП("RE0CozWhUDM7WmhEdj1yZCxLaz5w")));

Попробовал из драйвера напечатать чек и о чудо все передалось как нужно! Марку указал в HEX - ОФД отобразилось в Base64! Что за траблы то такие!!! Уже голову сломал - что ей надо!! Буду благодарен за любую подсказку!
   55reg
 
1 - 11.11.20 - 15:46
Не верно в теме написал Тег 1162 конечно )) Да же голова опухла c этими марками
   55reg
 
2 - 11.11.20 - 16:51
В общем может кому то пригодится - поставил драйвер Атол 10.8.0.0 на прошивке 7942 и все корректно передалось. Еще проверю можно ли в HEX передать MarkingCode... Так как уже работает парсер входящая Марка в HEX.
ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
ЗаписьXML.ЗаписатьАтрибут("StampType",XMLСтрока("17485"));
ЗаписьXML.ЗаписатьАтрибут("GTIN",XMLСтрока("02900002689075"));
ЗаписьXML.ЗаписатьАтрибут("SerialNumber",XMLСтрока(";ZhDv=rd,Kk>p"));
ЗаписьXML.ЗаписатьАтрибут("MarkingCode",XMLСтрока("RE0CozWhUDM7WmhEdj1yZCxLaz5w")); 
ЗаписьXML.ЗаписатьКонецЭлемента();

Всем удачи!
   55reg
 
3 - 11.11.20 - 16:56
Да, в HEX то же работает )))
   FormatC
 
4 - 11.11.20 - 16:59
Вот добрый человек, поделился инфой. Спасибо тебе!
   Olga_Om
 
5 - 30.11.20 - 22:21
Добрый день, подскажите, а что кодирует в  hex и base64? Какие данные кода маркировки? Я уже какие только куски кода маркировки не кодировала, не получается   RЕ0 в base64  получить!

Либо в hex:
44 4d
Далее кодируем gtin в hex
Далее serial number в hex и всё это + и в marking kode ? Очень жду ответа. Спасибо.
   MWWRuza
 
6 - 30.11.20 - 23:29
+(5) Я вот тоже не понимаю - а зачем "ЗаписьXML.ЗаписатьАтрибут("MarkingCode",XMLСтрока("RE0CozWhUDM7WmhEdj1yZCxLaz5w"));" - ???
Уже-же передан тип марки, GTIN, СерияНомер... Разве этого не достаточно для формирования тега 1162? Зачем еще код марки передавать?
Может наоборот, достаточно код марки правильно передать, и первые три параметра не нужны, драйвер/микропрограмма(прошивка) сами разберут ее и сформируют тег 1162 - поясните плиз...
   Olga_Om
 
7 - 01.12.20 - 04:17
(6) код марки - это полностью считанные код сканером? Или что туда передавать нужно, другими словами из чего формируется markingkode, не подскажете?
   zelyak
 
8 - 01.12.20 - 04:44
GTIN + Код
   Mafiozaa
 
9 - 01.12.20 - 04:54
(7) Передавать нужно GTIN который равен 14 символам и SerialNumber который равен 13 символам, тоесть перед отправкой нужно считанный код маркировки разбить на две части, которые равны 27 символам, остальное просто опустить
   Mafiozaa
 
10 - 01.12.20 - 04:55
Неправильно выразился не 27 символам а 14+13 (в две переменных, строковых)
   Olga_Om
 
11 - 01.12.20 - 06:25
(9) что входит в понятие „код„? 44 4d?
   Olga_Om
 
12 - 01.12.20 - 07:16
Получаю код в формате hex 44 4D 04 31 61 85 E4 49 50 6D 4F 65 64 46 49 33 6A 66 22 65 5F (настоящая шина, не используйте, пожалуйста)
передаю в markingkode, чек выходит, буквы М нет, в ОДФ неверный формат тега 1162
Код товара
E3 8E 03 D3 8D F5 EB 5F 39 13 8E 3D E7 4E 83 E0 5E B9 EB 8E 3A E3 DD F7 E8 0E BA DB 6E B9 E4

Уже не знаю куда рыть дальше....
   Olga_Om
 
13 - 01.12.20 - 07:17
при кодировки из hex в base64 не получаю RE0.... никак!
   Olga_Om
 
14 - 01.12.20 - 07:36
(9) Разбиваю, получаю.
Далее что? Как из этого получить base64 с началом REO???
как кодируется каждая часть? вторую часть кода в base64 я понимаю, это серийный номер, но что первые 6 символов - не понятно совершенно!
   DmVl76
 
15 - 01.12.20 - 08:02
(14) В типовых
Процедура СформироватьДвоичныеДанныеДляЧисла(ДанныеМаркировки, Знач ЗначениеЧисла = Неопределено, Знач ЗначениеСтроки = Неопределено)
    
    Префикс = ПрефиксКодированияРеквизита(ДанныеМаркировки.ТипИдентификатораТовара);
    
    Тело = Новый ПотокВПамяти();
    ЗаписьДанных = Новый ЗаписьДанных(Тело);
    ЗаписьДанных.ЗаписатьЦелое64(Число(ЗначениеЧисла), ПорядокБайтов.BigEndian);
    Если Не ПустаяСтрока(ЗначениеСтроки) Тогда
        ЗаписьДанных.ЗаписатьСимволы(ЗначениеСтроки); 
    КонецЕсли;
    ЗаписьДанных.Закрыть();
    Тело.Перейти(0, ПозицияВПотоке.Начало);
    ЗаписьДанных = Новый ЗаписьДанных(Тело);
    ЗаписьДанных.ЗаписатьЦелое16(Префикс, ПорядокБайтов.BigEndian);
    ЗаписьДанных.Закрыть();
    ДанныеМаркировки.РеквизитКодаТовараHEX = Тело.ЗакрытьИПолучитьДвоичныеДанные();
    ДанныеМаркировки.РеквизитКодаТовара = Base64Строка(ДанныеМаркировки.РеквизитКодаТовараHEX);
    
КонецПроцедуры

Для обуви,шин,одежды префикс=17845, ЗначениеЧисла-GTIN в числовом формате, значение строки - серийный номер
Нам нужно ДанныеМаркировки.РеквизитКодаТовара

Если без структуры то как-то так

Функция СформироватьДвоичныеДанныеДляЧисла(Префикс,Знач ЗначениеЧисла = Неопределено, Знач ЗначениеСтроки = Неопределено)
    
    Тело = Новый ПотокВПамяти();
    ЗаписьДанных = Новый ЗаписьДанных(Тело);
    ЗаписьДанных.ЗаписатьЦелое64(Число(ЗначениеЧисла), ПорядокБайтов.BigEndian);
    Если Не ПустаяСтрока(ЗначениеСтроки) Тогда
        ЗаписьДанных.ЗаписатьСимволы(ЗначениеСтроки); 
    КонецЕсли;
    ЗаписьДанных.Закрыть();
    Тело.Перейти(0, ПозицияВПотоке.Начало);
    ЗаписьДанных = Новый ЗаписьДанных(Тело);
    ЗаписьДанных.ЗаписатьЦелое16(Префикс, ПорядокБайтов.BigEndian);
    ЗаписьДанных.Закрыть();
    РеквизитКодаТовараHEX = Тело.ЗакрытьИПолучитьДвоичныеДанные();
    
    Возврат Base64Строка(РеквизитКодаТовараHEX);
    
КонецФункции

ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(СформироватьДвоичныеДанныеДляЧисла(17845,466000025632,"Yui8rTd%haswe")));
   Olga_Om
 
16 - 01.12.20 - 08:40
(15)  Возврат Base64Строка(РеквизитКодаТовараHEX); возвращает пустоту....
   DmVl76
 
17 - 01.12.20 - 09:12
(15) А какие параметры передаете? Я вот точно то что в примере передал Сообщить(СформироватьДвоичныеДанныеДляЧисла(17845,466000025632,"Yui8rTd%hasweц")) возвратилось "RbUAbH/EGCBZdWk4clRkJWhhc3dl"
   DmVl76
 
18 - 01.12.20 - 09:18
Префикс не 17845, а 17485
   DmVl76
 
19 - 01.12.20 - 09:29
(16) Вы не строкой случайно 44 4D 04 31 61 85 E4 49 50 6D 4F 65 64 46 49 33 6A 66 22 65 5F передаете? Это должны быть двоичные данные
   Olga_Om
 
20 - 01.12.20 - 09:43
Всем ОГРОМНЕЙШЕЕ СПАСИБО! Получилось у меня, ребята! Передавала GTIN  с лидирующим нулем, отсюда и проблема была.
   MWWRuza
 
21 - 01.12.20 - 11:48
И все-таки, по вопросу в (6) - передача КТ в виде трех отдельных полей, разбирая ШК марки программой, и одним кодом без разбора на поля, рассчитывая на дальнейшее кодирование драйвером и софтом кассы, это разве не взаимоисключающие методы кодирования 1162 - ? Поясните пожалуйста...
   Olga_Om
 
22 - 09.12.20 - 08:12
Всем опять здравствуйте! Возникла очередная проблема. Данные передаю в ОФД в HЕХ, там они тоже отображаются в HEX, но при передачи в четный знак, в ответ приходит вот что: failed to decode product code RE2FYWGF48dqRVpNdWRFKWw5SE0n : decoded gtin is over 14 digits: 146653294486471"}},"data":{"productCodes":["RE2FYWGF48dqRVpNdWRFKWw5SE0n"
Почему уходит RE2 а не REO 
Откуда в gtin он находит 14 цифр, когда передаю я 13? а если отбросить лидирующие нули, то и того меньше....
Притом в HEX из примера так же возвращает ошибку.
Как из HEX мне код в base64 всё же преобразовать, если base64строка  в 8.2 не отрабатывает....
   Olga_Om
 
23 - 09.12.20 - 08:17
хм... нет я передаю 14, а он преобразует в 15.
   Olga_Om
 
24 - 09.12.20 - 08:21
и base64строка кодирует, но как-то не так, в общем, я не понимаю где искать ошибку....
   Olga_Om
 
25 - 09.12.20 - 09:03
И REO уже получаю, а в ответе ЧЗ приходит RE2 что за ерунда, вообще не понимаю!
   NikeArz
 
26 - 09.12.20 - 10:41
(25) Функция ПолучитьРеквизитКодаТовара_82(ВрКодТовара) //Для 8.2

    
    мбКодТовара = ВрКодТовара;

     //Получаем из строки байтов двоичные данные
    Попытка
        ТипhexBinary    = ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema";, "hexBinary");
        ДвоичныеДанные  = ФабрикаXDTO.Создать(ТипhexBinary,мбКодТовара);
    Исключение
        Возврат "";
    КонецПопытки;    
    
    //Кодируем их в BASE64
    Попытка
        СтрКод = Base64Строка(ДвоичныеДанные.Значение);
    Исключение
        Возврат "";
    КонецПопытки;        
    
    Возврат СтрКод;
    
КонецФункции

Процедура ПолучитьРеквизитКодаТовараHEX_82(ДанныеМаркировки, мМРЦ = "") //Для 8.2

    //В штрихкоде марки нас интересуют первые 14 символов  - GTIN и вторые 7  - серия

    ГТИН   = ДанныеМаркировки.ГлобальныйИдентификаторТорговойЕдиницы;
    Если НЕ ЗначениеНеЗаполнено(мМРЦ) Тогда
        Серия  = ДополнитьСерийныйНомерТабачнойПродукции(ДанныеМаркировки.СерийныйНомер, мМРЦ);
    Иначе    
        Серия  = ДанныеМаркировки.СерийныйНомер;
    КонецЕсли;    
    Префикс = ПрефиксКодированияРеквизита(ДанныеМаркировки.ТипИдентификатораТовара);
    
    //GTIN преобразуем в число, получаем строку байтов (HEX на самом деле), добиваем до 6 байтов
    Попытка
        ПрефиксБайтами = "";
        Пока Префикс > 0 Цикл
              ПрефиксБайтами = Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", Префикс%16 + 1, 1) + ПрефиксБайтами;
              Префикс = Цел(Префикс/16) ;
           КонецЦикла;
    Исключение
        //Возврат "";
        Возврат;
    Конецпопытки;    
    
    Попытка
        ГТИНЧислом  = Число(ГТИН);
        ГТИНБайтами = "";
        Пока ГТИНЧислом > 0 Цикл
              ГТИНБайтами = Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", ГТИНЧислом%16 + 1, 1) + ГТИНБайтами;
              ГТИНЧислом = Цел(ГТИНЧислом/16) ;
           КонецЦикла;
    Исключение
        //Возврат "";
        Возврат;
    Конецпопытки;    
    
    Пока СтрДлина(ГТИНБайтами)<12 Цикл
        ГТИНБайтами = "0"+ГТИНБайтами;
    КонецЦикла;    
        
    //Серию преобразуем в байты посимвольно старым методом - через временный файл
    
    ИмяФ = ПолучитьИмяВременногоФайла("txt");
    Т = Новый ТекстовыйДокумент();
    Т.УстановитьТекст(Серия);
    Т.Записать(ИмяФ,КодировкаТекста.ANSI);
    ДД = Новый ДвоичныеДанные(ИмяФ);
    СерияБайтами = Строка(ДД);
    СерияБайтами = СтрЗаменить(СерияБайтами," ","");
    УдалитьФайлы(ИмяФ);
    
    мКодТовара    = ПрефиксБайтами+ГТИНБайтами+СерияБайтами;
    ВрКодТовара    = мКодТовара;    

    МассивБайт  = "";
    
    Пока СтрДлина(мКодТовара)>0 Цикл
        
        МассивБайт = МассивБайт+" "+Лев(мКодТовара,2);
        мКодТовара = Сред(мКодТовара,3);
                
    КонецЦикла;    
    
    ДанныеМаркировки.РеквизитКодаТовараHEX = СокрЛП(МассивБайт);
    ДанныеМаркировки.РеквизитКодаТовара = ПолучитьРеквизитКодаТовара_82(ВрКодТовара);
    
КонецПроцедуры

Это работает в 8.2
   Olga_Om
 
27 - 09.12.20 - 11:53
(26)  ДополнитьСерийныйНомерТабачнойПродукции - неизвестно что за функция, у нас база самописная, там этого нет. И ПрефиксКодированияРеквизита так же...

Обнаружила, что часть кодов кодируется верно, а часть нет.
   NikeArz
 
28 - 09.12.20 - 12:20
(27) Да самописная.
Функция ДополнитьСерийныйНомерТабачнойПродукции(мСерийныйНомер, мМРЦ) Экспорт
    
    Результат = мСерийныйНомер + мМРЦ;
    Пока СтрДлина(Результат) < 13 Цикл
        Результат = Результат + Символ(32);// Дополняем знаками «20h» в конце (пробелами справа) до 13 байт 

    КонецЦикла;

    Возврат Результат;
    
КонецФункции
   NikeArz
 
29 - 09.12.20 - 12:23
(27)
     Функция ПрефиксКодированияРеквизита(Знач ТипыИдентификаторовТовараККТ) Экспорт;
    
    Если ТипыИдентификаторовТовараККТ = Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеEAN8 Тогда
        Результат = 17672;// 45h 08h - Код товара в формате EAN-8, UPC-E.

    ИначеЕсли ТипыИдентификаторовТовараККТ = Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеEAN13 Тогда
        Результат = 17677;// 45h 0Dh - Код товара в формате EAN-13, UPC-A.

    ИначеЕсли ТипыИдентификаторовТовараККТ = Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеITF14 Тогда
        Результат = 18702;// 49h 0Eh - Код товара в формате EAN-13, UPC-A.

    ИначеЕсли ТипыИдентификаторовТовараККТ = Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеDataMatrixGS1 Тогда
        Результат = 17485;// 44h 4Dh - Код товара в формате GS1 Data Matrix или Data Matrix маркировки.

    ИначеЕсли ТипыИдентификаторовТовараККТ = Перечисления.ТипыИдентификаторовТовараККТ.ИзделияИзНатуральногоМеха Тогда
        Результат = 21062;// 52h 46h - Код товара средства идентификации мехового изделия.

    ИначеЕсли ТипыИдентификаторовТовараККТ = Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеЕГАИС2 Тогда
        Результат = 50452;// C5h 14h - Код товара в кодировке ЕГАИС 2.0 в формате PDF417.

    ИначеЕсли ТипыИдентификаторовТовараККТ = Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеЕГАИС3 Тогда
        Результат = 50462;// C5h 1Eh - Код товара в кодировке ЕГАИС 3.0 в формате Data Matrix.

    Иначе 
        Результат = 0;// 00h 00h - Код товара, который не распознан.

    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции
   Olga_Om
 
30 - 09.12.20 - 12:44
(29) Спасибо большое! Попробую, отпишусь
 
 
   Olga_Om
 
31 - 09.12.20 - 13:24
не совсем понятно, как дополнять hex нулевыми байтами, нули проставляются спереди? проставляем их когда уже перевели полное число в hex или только gtin?
   hugo
 
32 - 11.12.20 - 11:15
(2) Добрый день.
ЗаписьXML.ЗаписатьАтрибут("StampType",XMLСтрока("17485")); Опечатка? Вроде должно передаваться "1520"?
   vis_tmp
 
33 - 19.02.21 - 13:02
(28) Вместо цикла:
Результат = Лев(Результат + "             ", 13);


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.