Имя: Пароль:
1C
1С v8
Как хранится код маркировки в 1С:Рознице 2.3
,
0 petya_
petrov_63
 
23.03.23
10:37
Кто-нибудь может сказать в каком виде хранится  код маркировки воды в справочнике ШтрихкодыУпаковокТоваров в поле ЗначениеШтрихкода в том числе 32ой знак, который согласно формата должен быть символом с кодом 29. В чем проблема - у меня проверка кодов маркировки средствами честного знака не работает какого-то лешего. Я хочу реализовать просто тупую запись кода маркировки в поле значениеШтрихКода, но при записи в обычном виде конфа встает на раскоряку так как 32 символ в коде непечатаемый и не серилиализуется. Поэтому и хотелось бы знать каким эта проблема решена в Рознице 2.3.
1 timurhv
 
23.03.23
11:27
1C не хранит разделитель и все что после кроме эмиссии марок.
ЧЗ тоже он не нужен, можно использовать только при проверке марок ЕАЭС.
2 petya_
petrov_63
 
23.03.23
12:03
(1) Т.е. хранится только код товара и серийный номер? Или вообще только серийный номер?
Спасибо за ответ.
3 timurhv
 
23.03.23
12:09
Вы бы описали что дальше с маркой хотите делать? В каком документе, при пробитии чека или онлайн продаже нужен полный код для фискальника.
4 petya_
petrov_63
 
23.03.23
12:11
(3) Дальше - списать при продаже, т.е. передать согласно формату фискальных данных код маркировки для отметки о выбытии марки в ЧЗ.
5 petya_
petrov_63
 
23.03.23
13:59
(3) Т.е. для пробития чека все равно нужен полный код маркировки получается? Тогда глупый вопрос, если 1С не хранит полный код, тьо как решается проблема наличия полного кода маркировки для пробития чека?
6 timurhv
 
23.03.23
14:07
Справочник.ШтрихкодыУпаковокТоваров - там не должен храниться, во всяком случае при эмиссии и вводе в оборот записывается упрощенный состав.
Для пробития - полная марка (зависит от версии ОФД, раньше ГТИН + серии было достаточно, в новых версиях только полный).
Думаю, в типовых документах полный код хранится в переменной кэша у документа, т.к. хранить полный код марки в БД запрещено (кроме случаев когда он нужен для печати, онлайн-продаже при сборке и тд, потом удалять\очищать).
7 petya_
petrov_63
 
23.03.23
14:54
А упрощенный состав это что?
(6)Я так понимаю, что это предположения. А что посмотреть в базе консолькой нельзя? (
Спасибо.
8 petya_
petrov_63
 
24.03.23
15:19
Так вопрос с хранением снят. Хранится GTIN и серийный номер. Теперь вопрос - а что должно уходить в ОФД? В каком виде? Как генерится полный код из GTIN-а и серийного номера?
9 isa2net
 
24.03.23
15:36
Для сериализации можете переводить в формат base64 https://infostart.ru/public/1574381/
10 petya_
petrov_63
 
24.03.23
15:42
(9) спасибо. В типовой проблема сериализации при хранении непечатного и несерилиализуемого 29 символа решена тем, что этот символ из кода маркировки просто не хранится. Но тогда вопрос: что передается в качестве кода маркировки для ОФД.
11 isa2net
 
24.03.23
16:27
(10)

// Сформировать реквизита кода товар для DataMatrixGS1 на основе GTIN & SerialNumber.
//
// Параметры:
//   GTIN - Строка - Глобальный идентификатор торговой единицы.
//   СерийныйНомер - Строка - Серийный номер.
//
// Возвращаемое значение:
//  Строка - Значение реквизита кода товара в BASE64
//
12 petya_
petrov_63
 
24.03.23
16:33
Описание есть, а название процедурки потеряли ..
13 petya_
petrov_63
 
24.03.23
16:34
МенеджерОборудованияМаркировкаКлиентСервер.СформироватьКодТовараДляDataMatrixGS1
14 petya_
petrov_63
 
24.03.23
16:36
Т.е. это значение и есть код маркировки для ОФД?
15 isa2net
 
24.03.23
16:37
(13)

МенеджерОборудованияКлиентСервер  Функция СформироватьКодТовараДляDataMatrixGS1(GTIN, СерийныйНомер) Экспорт
16 petya_
petrov_63
 
24.03.23
16:44
(15) вот блин, я надеялся, что тип будет строка, а тут тип возвращаемый процедурой сложнее ...
А всего то надо было бы понимать как генерятся данные для кассы и там соответственно нашел бы нужный кусок кода (
17 isa2net
 
24.03.23
16:58
(16) Там же у вас тэг 1162 "РеквизитКодаТовара" строка базе64

Функция ЗаполнитьИменаРеквизитовКодаТовара(КодРазобран = Ложь)
    
    // Определяем структуру результата.
    ДанныеКодаТовара = Новый Структура();
    ДанныеКодаТовара.Вставить("Разобран", КодРазобран);
    ДанныеКодаТовара.Вставить("ОписаниеОшибки");
    ДанныеКодаТовара.Вставить("ПредставлениеШтрихкода" , "");
    ДанныеКодаТовара.Вставить("ДанныеШтрихкода", Новый Соответствие);
    ДанныеКодаТовара.Вставить("ТипИдентификатораТовара"); // Тип идентификатора товара, Перечисление.ТипыИдентификаторовТовараККТ.
    ДанныеКодаТовара.Вставить("GTIN");          // GTIN
    ДанныеКодаТовара.Вставить("СерийныйНомер"); // Серийный номер с потребительской или групповой обработки.
    ДанныеКодаТовара.Вставить("EAN");           // Штрихкод товара преобразованный из GTIN
    ДанныеКодаТовара.Вставить("РеквизитКодаТовараHEX"); // Значение реквизита "код товара" , тег 1162 в бинарном виде.
    ДанныеКодаТовара.Вставить("РеквизитКодаТовара"); // Значение реквизита "код товара", тег 1162  в BASE64.
    ДанныеКодаТовара.Вставить("ИдентифицируетЭкземпляр", Ложь);  // Идентификатора товара идентифицирует экземпляр товара.
    
    Возврат ДанныеКодаТовара;
    
КонецФункции
18 petya_
petrov_63
 
24.03.23
17:03
(17)
Какой из этих видов передается?
РеквизитКодаТовараHEX
РеквизитКодаТовара

Base64 или HEX?

Большое спасибо за помощь.
19 isa2net
 
24.03.23
17:16
(18)  В сам драйвер уходит файл хмл, в нем строка базе64
ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ДанныеКодаТоварнойНоменклатуры.РеквизитКодаТовара))
20 isa2net
 
24.03.23
17:17
(19) Сорри, не файл, данные в хмл формате
21 petya_
petrov_63
 
24.03.23
17:17
(18) Для розницы получается тогда так:

ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.СформироватьКодТовараДляDataMatrixGS1(GTIN, СерийныйНомер);
КодМаркировкиОФД = ДанныеКодаТовара.РеквизитКодаТовара;

Большое спасибо.
22 isa2net
 
24.03.23
17:22
(21) Я отсюда ссмотрел:

Процедура ЗаписатьДанныеКодаТоварнойНоменклатуры(ЗаписьXML, Позиция, ПараметрыФискализации)
    
    ДанныеКодаТоварнойНоменклатуры = Позиция.ДанныеКодаТоварнойНоменклатуры;
    
    // Код товара заполняемся для "товара".  
    Если Позиция.ПризнакПредметаРасчета <> Перечисления.ПризнакиПредметаРасчета.Товар
        И Позиция.ПризнакПредметаРасчета <> Перечисления.ПризнакиПредметаРасчета.ПодакцизныйТовар Тогда
        Возврат;
    КонецЕсли;
    
    // Требования к разработке драйверов подключаемого оборудования, версия 3.2 и выше.
    Если ПараметрыФискализации.РевизияИнтерфейса > 3001 Тогда
        
        Если НЕ ПустаяСтрока(Позиция.КодВидаНоменклатурнойКлассификации) Тогда
            ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.КодВидаНоменклатурнойКлассификации);
            РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
        Иначе
            РеквизитКодаТовара = ДанныеКодаТоварнойНоменклатуры.РеквизитКодаТовара;
            // Если реквизит кода товара (1162) не передается в готовом виде сформируем его из штрихкода
            Если ПустаяСтрока(РеквизитКодаТовара) Тогда
                ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.Штрихкод);
                РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
            КонецЕсли;
        КонецЕсли;
        
        // Если первые 2 байта значения кода товара имеют значения "44h4Dh", и не был заполнен "КодВидаНоменклатурнойКлассификации"
        // И есть условие формирование 1162 только для маркировки.
        Если НЕ Лев(РеквизитКодаТовара, 2) = "RE" И ПустаяСтрока(Позиция.КодВидаНоменклатурнойКлассификации)
            И МенеджерОборудованияВызовСервераПереопределяемый.КодТовараЗаполняетсяТолькоДляDataMatrixGS1() Тогда
            Возврат;
        КонецЕсли;
        
        // Если первые 2 байта значения кода товара имеют значения "00h00h" в автономном режиме реквизит не включается.
        Если ПараметрыФискализации.АвтономныйРежим И Лев(РеквизитКодаТовара, 2) = "AA" Тогда
            Возврат;
        КонецЕсли;
        // Реквизит кода товара (1162) для стандарта 3.2 и выше в ККТ передается в готовом виде.
        Если НЕ ПустаяСтрока(РеквизитКодаТовара) Тогда
            ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
            ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(РеквизитКодаТовара));
            ЗаписьXML.ЗаписатьКонецЭлемента();
        КонецЕсли;
    Иначе
        // Требования к разработке драйверов подключаемого оборудования, версяи 3.1 и ниже.
        Если ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.ТипМаркировки) Тогда // Необходимо всегда указывать тип маркировки.
            Возврат;
        КонецЕсли;
        Если ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.КонтрольныйИдентификационныйЗнак)
            И ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.ГлобальныйИдентификаторТорговойЕдиницы)
            И ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.СерийныйНомер) Тогда
                Возврат;
        КонецЕсли;
        ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
        Если Не ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.ТипМаркировки) Тогда // Тип маркировки.
            ТипМаркировки = МенеджерОборудованияКлиентСервер.КодТипаМаркировкиККТ(ДанныеКодаТоварнойНоменклатуры.ТипМаркировки);
            ЗаписьXML.ЗаписатьАтрибут("StampType", XMLСтрока(ТипМаркировки));
        КонецЕсли;
        Если Не ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.КонтрольныйИдентификационныйЗнак) Тогда // Контрольный идентификационный знак (КиЗ).
            ЗаписьXML.ЗаписатьАтрибут("Stamp" , XMLСтрока(ДанныеКодаТоварнойНоменклатуры.КонтрольныйИдентификационныйЗнак));
        КонецЕсли;
        Если Не ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.ГлобальныйИдентификаторТорговойЕдиницы) Тогда // Глобальный идентификатор торговой единицы (GTIN).
            ЗаписьXML.ЗаписатьАтрибут("GTIN" , XMLСтрока(ДанныеКодаТоварнойНоменклатуры.ГлобальныйИдентификаторТорговойЕдиницы));
        КонецЕсли;
        Если Не ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.СерийныйНомер) Тогда // Серийный номер.
            ЗаписьXML.ЗаписатьАтрибут("SerialNumber" , XMLСтрока(ДанныеКодаТоварнойНоменклатуры.СерийныйНомер));
        КонецЕсли;
        Если Не ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.РеквизитКодаТовара) Тогда // Ревизит кода товара.
            ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ДанныеКодаТоварнойНоменклатуры.РеквизитКодаТовара));
        КонецЕсли;
        ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЕсли;
    
КонецПроцедуры
/
23 petya_
petrov_63
 
24.03.23
17:29
(22) Не понял, странно, что не используется реквизит, который уже есть в справочнике например ХешСуммаЗначенияШтрихкода, а просчитывается при формировании чека. Еще раз большое спасибо.
24 MWWRuza
 
гуру
24.03.23
17:36
(0) В чем проблема - у меня проверка кодов маркировки средствами честного знака не работает какого-то лешего.
А должна? О какой проверке речь идет? Средствами ККТ - ? Если так то проверка выполняется только в рамках ФФД-1.2.
В более ранних - проверки и не было, данные марки так отправлялись, в закодированном специальным образом теге 1162.
То, что выще описано, как раз для его формирования.

И все-таки, о чем речь идет? Какоая версия ФФД у кассы - ? 1.2, или 1.05/1.1 - ?
25 Тихий омут
 
27.03.23
03:36
Не читая всё - полный код маркировки, как сказано в (6), в базе хранить нельзя. В случае работы с ФФД 1.2 вы должны считать его с марки перед пробитием чека и передать в ККТ для проверки в рамках сессии проверки марок.