TSDZakazScladVasilek/CommonModules/МенеджерОборудованияМаркировкаКлиентСервер/Ext/Module.bsl

1466 lines
113 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#Область ПрограммныйИнтерфейс
#Область ФункцииМаркировкиПродукции
// Сформировать реквизита кода товар для DataMatrixGS1 на основе GTIN & SerialNumber.
//
// Параметры:
// GTIN - Строка - Глобальный идентификатор торговой единицы.
// СерийныйНомер - Строка - Серийный номер.
//
// Возвращаемое значение:
// Строка - Значение реквизита кода товара в BASE64
//
Функция СформироватьКодТовараДляDataMatrixGS1(Знач GTIN, Знач СерийныйНомер) Экспорт
// Определяем структуру результата.
ДанныеКодаТовара = ЗаполнитьИменаРеквизитовКодаТовара(Истина);
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараВФорматеDataMatrixGS1");
ДанныеКодаТовара.СерийныйНомер = СерийныйНомер;
СформироватьEAN(ДанныеКодаТовара, GTIN);
// Последующие 11 символов считанной последовательности формируются по правилам интерпретации ASCII в hex
ЗначениеСтроки = СерийныйНомер;
Пока СтрДлина(ЗначениеСтроки) < 13 Цикл
ЗначениеСтроки = ЗначениеСтроки + Символ(32); // Дополняем знаками «20h» в конце (пробелами справа) до 13 байт
КонецЦикла;
СформироватьДвоичныеДанныеДляЧисла(ДанныеКодаТовара, GTIN, ЗначениеСтроки);
Возврат ДанныеКодаТовара;
КонецФункции
// Сформировать технический код для нечитаемого DataMatrix на основе GTIN & SerialNumber.
//
// Параметры:
// GTIN - Строка - Глобальный идентификатор торговой единицы.
// СерийныйНомер - Строка - Серийный номер.
// КриптоЧасть - Строка - Крипто часть КМ.
//
// Возвращаемое значение:
// Строка - Технический код в Base64.
//
Функция СформироватьТехническийКодДляНечитаемогоDataMatrixВBase64(GTIN, СерийныйНомер, КриптоЧасть = "0000") Экспорт
ТехническийКод = "01 %1 21 %2 <GS1>93 %3 <GS1>98crpt";
ТехническийКод = СтрШаблон(ТехническийКод, GTIN, СерийныйНомер, КриптоЧасть);
ТехническийКод = СтрЗаменить(ТехническийКод, "<GS1>", ОбщегоНазначенияБПОКлиентСервер.РазделительGS1());
ТехническийКод = СтрЗаменить(ТехническийКод, " ", "");
ДвоичныеДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(ТехническийКод);
ШтрихкодBase64 = Base64Строка(ДвоичныеДанныеСтроки);
Возврат ШтрихкодBase64;
КонецФункции
#КонецОбласти
#Область УстаревшиеПроцедурыИФункции
// Устарела: следует использовать МенеджерОборудованияМаркировка.РазобратьСтрокуШтрихкодаGS1 или
// МенеджерОборудованияМаркировкаКлиент.РазобратьСтрокуШтрихкодаGS1.
// Разобрать строку штрихкода в соответствии со стандартом GS1.
//
// Параметры:
// Штрихкод - Строка - значение штрихкода.
//
// Возвращаемое значение:
// Структура.
Функция РазобратьСтрокуШтрихкодаGS1(Знач Штрихкод) Экспорт
РезультатРазбора = Новый Структура;
РезультатРазбора.Вставить("Разобран" , Ложь);
РезультатРазбора.Вставить("ОписаниеОшибки");
РезультатРазбора.Вставить("ПредставлениеШтрихкода", "");
РезультатРазбора.Вставить("ДанныеШтрихкода", Новый Соответствие);
РезультатРазбора.Вставить("ПредставлениеШтрихкодаБезКриптоХвоста" , "");
РезультатРазбора.Вставить("ЕстьКриптоХвост", Ложь);
КодыGS1 = КодыGS1Служебный();
Если СтрНачинаетсяС(Штрихкод, "(") Тогда
РазобратьСтрокуШтрихкодаGS1СоСкобками(Штрихкод, РезультатРазбора, КодыGS1);
Иначе
Разделитель = ОбщегоНазначенияБПОКлиентСервер.РазделительGS1();
ЧастиШтрихкода = СтрРазделить(Штрихкод, Разделитель, Ложь);
Для Каждого ЧастьБезРазделителей Из ЧастиШтрихкода Цикл
РазобратьСтрокуШтрихкодаGS1Служебный(ЧастьБезРазделителей, РезультатРазбора, КодыGS1);
КонецЦикла;
КонецЕсли;
Возврат РезультатРазбора;
КонецФункции
// Устарела: следует использовать МенеджерОборудованияМаркировка.КодыGS1 или
// МенеджерОборудованияМаркировкаКлиент.КодыGS1.
// Коды GS1.
//
// Возвращаемое значение:
// Соответствие из Строка - Коды gs1
Функция КодыGS1() Экспорт
Возврат КодыGS1Служебный();
КонецФункции
// Устарела: следует использовать МенеджерОборудованияМаркировка.РазобратьШтриховойКодТовара или
// МенеджерОборудованияМаркировкаКлиент.РазобратьШтриховойКодТовара.
// Разобрать штриховой код товара.
//
// Параметры:
// Штрихкод - Строка - Штрихкод
// ШтрихкодВBase64 - Булево - Штрихкод в base64
//
// Возвращаемое значение:
// Структура - Разобрать штриховой код товара:
// * Разобран - Булево -
// * ОписаниеОшибки - СТрока
// * ПредставлениеШтрихкода - Строка -
// * ДанныеШтрихкода - Строка -
// * ТипИдентификатораТовара - ПеречислениеСсылка.ТипыИдентификаторовТовараККТ -
// * GTIN - Строка -
// * СерийныйНомер - Строка -
// * EAN - Строка -
// * РеквизитКодаТовараHEX - Строка -
// * РеквизитКодаТовара - Строка -
// * ИдентифицируетЭкземпляр - Булево -
// * ПотребительскаяУпаковкаТабачнойПродукции - Булево -
// * ШтрихкодBase64 - Булево -
// * НаименованиеРеквизита - Строка -
//
Функция РазобратьШтриховойКодТовара(Знач Штрихкод, Знач ШтрихкодВBase64 = Ложь) Экспорт;
Возврат РазобратьШтриховойКодТовараСлужебная(Штрихкод, ШтрихкодВBase64);
КонецФункции
// Устарела: следует использовать ОбщегоНазначенияБПОКлиентСервер.РазделительGS1.
// Функция возвращает разделитель GS1.
//
// Возвращаемое значение:
// Строка.
//
Функция РазделительGS1() Экспорт
Возврат ОбщегоНазначенияБПОКлиентСервер.РазделительGS1();
КонецФункции
// Устарела: следует использовать ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволGS1.
// Функция возвращает экранированный символ GS1.
//
// Возвращаемое значение:
// Строка.
//
Функция ЭкранированныйСимволGS1() Экспорт
Возврат ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволGS1();
КонецФункции
// Устарела: следует использовать РазобратьШтриховойКодТовара.
// Функция расшифровывает код маркировки продукции.
//
// Параметры:
// КодМаркировки - Строка - код маркировки.
//
// Возвращаемое значение:
// Структура.
//
Функция РазобратьКодМаркировки(Знач КодМаркировки) Экспорт
Идентификаторы = ИдентификаторыGS1();
// Определяем структуру результата.
ДанныеМаркировки = Новый Структура();
ДанныеМаркировки.Вставить("Разобран", Ложь);
ДанныеМаркировки.Вставить("ОписаниеОшибки");
ДанныеМаркировки.Вставить("ПредставлениеШтрихкода" , "");
ДанныеМаркировки.Вставить("ПотребительскаяУпаковка", Ложь);
ДанныеМаркировки.Вставить("ДанныеШтрихкода", Новый Соответствие);
ДанныеМаркировки.Вставить("ГлобальныйИдентификаторТорговойЕдиницы"); // GTIN
ДанныеМаркировки.Вставить("СерийныйНомер"); // Серийный номер с потребительской или групповой обработки.
ДанныеМаркировки.Вставить("ИдентификаторКлючаПроверки");
ДанныеМаркировки.Вставить("КодПроверки");
ДанныеМаркировки.Вставить("ДополнительныйИдентификаторПродукта");
ДанныеМаркировки.Вставить("КодМаркировки"); // Исходный код маркировки. Для отображении на экране.
ДанныеМаркировки.Вставить("КодМаркировкиККТ"); // Исходный код маркировки. Маскируемый для передачи на ККТ.
ДанныеМаркировки.Вставить("EAN"); // Штрихкод товара преобразованный из GTIN
ДанныеМаркировки.Вставить("ПредставлениеШтрихкодаБезКриптоХвоста" , "");
ДанныеМаркировки.Вставить("ЕстьКриптоХвост", Ложь);
ПозицияРазделителяGS1 = Найти(КодМаркировки, ОбщегоНазначенияБПОКлиентСервер.РазделительGS1());
ПозицияРазделителяЭкран = Найти(КодМаркировки, ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволGS1());
Если СтрНачинаетсяС(КодМаркировки, "(") Тогда
КодыGS1 = КодыGS1Служебный();
РазобратьСтрокуШтрихкодаGS1СоСкобками(КодМаркировки, ДанныеМаркировки, КодыGS1);
Если ДанныеМаркировки.Разобран Тогда
ЗначениеЭлемента = ДанныеМаркировки.ДанныеШтрихкода.Получить(Идентификаторы.GTIN);
Если ЗначениеЭлемента <> Неопределено Тогда
ДанныеМаркировки.ГлобальныйИдентификаторТорговойЕдиницы = ЗначениеЭлемента.Значение;
КонецЕсли;
ЗначениеЭлемента = ДанныеМаркировки.ДанныеШтрихкода.Получить(Идентификаторы.СерийныйНомер);
Если ЗначениеЭлемента <> Неопределено Тогда
ДанныеМаркировки.СерийныйНомер = ЗначениеЭлемента.Значение;
КонецЕсли;
ЗначениеЭлемента = ДанныеМаркировки.ДанныеШтрихкода.Получить(Идентификаторы.КлючПроверки);
Если ЗначениеЭлемента <> Неопределено Тогда
ДанныеМаркировки.ИдентификаторКлючаПроверки = ЗначениеЭлемента.Значение;
КонецЕсли;
ЗначениеЭлемента = ДанныеМаркировки.ДанныеШтрихкода.Получить(Идентификаторы.КодПроверки);
Если ЗначениеЭлемента <> Неопределено Тогда
ДанныеМаркировки.КодПроверки = ЗначениеЭлемента.Значение;
КонецЕсли;
КонецЕсли;
ИначеЕсли ПозицияРазделителяGS1 > 0 Или ПозицияРазделителяЭкран > 0 Тогда // В коде маркировки для групповых и транспортных упаковок присутствует символ разделитель GS1 (Dec 29).
КодыGS1 = КодыGS1Служебный();
Если ПозицияРазделителяЭкран > 0 Тогда
ЧастиШтрихкода = ОбщегоНазначенияБПОКлиентСервер.РазложитьСтрокуВМассивПодстрок(
КодМаркировки, ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволGS1(), Ложь);
ДанныеМаркировки.КодМаркировки = СтрЗаменить(КодМаркировки, ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволGS1(), "");
ДанныеМаркировки.КодМаркировкиККТ = ДанныеМаркировки.КодМаркировки;
Иначе
ЧастиШтрихкода = СтрРазделить(КодМаркировки, ОбщегоНазначенияБПОКлиентСервер.РазделительGS1(), Ложь);
ДанныеМаркировки.КодМаркировки = СтрЗаменить(КодМаркировки, ОбщегоНазначенияБПОКлиентСервер.РазделительGS1(), "");
ДанныеМаркировки.КодМаркировкиККТ = СтрЗаменить(КодМаркировки, ОбщегоНазначенияБПОКлиентСервер.РазделительGS1(), ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволGS1());
КонецЕсли;
Для Каждого ЧастьБезРазделителей Из ЧастиШтрихкода Цикл
РазобратьСтрокуШтрихкодаGS1Служебный(ЧастьБезРазделителей, ДанныеМаркировки, КодыGS1);
КонецЦикла;
Если ДанныеМаркировки.Разобран Тогда
ЗначениеЭлемента = ДанныеМаркировки.ДанныеШтрихкода.Получить(Идентификаторы.GTIN);
Если ЗначениеЭлемента <> Неопределено Тогда
ДанныеМаркировки.ГлобальныйИдентификаторТорговойЕдиницы = ЗначениеЭлемента.Значение;
КонецЕсли;
ЗначениеЭлемента = ДанныеМаркировки.ДанныеШтрихкода.Получить(Идентификаторы.СерийныйНомер);
Если ЗначениеЭлемента <> Неопределено Тогда
ДанныеМаркировки.СерийныйНомер = ЗначениеЭлемента.Значение;
КонецЕсли;
ЗначениеЭлемента = ДанныеМаркировки.ДанныеШтрихкода.Получить(Идентификаторы.КлючПроверки);
Если ЗначениеЭлемента <> Неопределено Тогда
ДанныеМаркировки.ИдентификаторКлючаПроверки = ЗначениеЭлемента.Значение;
КонецЕсли;
ЗначениеЭлемента = ДанныеМаркировки.ДанныеШтрихкода.Получить(Идентификаторы.КодПроверки);
Если ЗначениеЭлемента <> Неопределено Тогда
ДанныеМаркировки.КодПроверки = ЗначениеЭлемента.Значение;
КонецЕсли;
КонецЕсли;
Иначе
// Код маркировки потребительской упаковке представляет собой строку символов без разделителей.
ДанныеМаркировки.КодМаркировки = КодМаркировки;
ДлиннаКода = СтрДлина(КодМаркировки);
Если ДлиннаКода = 29 Тогда // Код маркировки табачной потребительской упаковки изложенные в постановлении правительстве №1433 от 27 ноября 2017.
ДанныеМаркировки.ПотребительскаяУпаковка = Истина;
ДанныеМаркировки.ГлобальныйИдентификаторТорговойЕдиницы = Лев(КодМаркировки, 14); // Код товара по товарной номенклатуре GS1.
ДанныеМаркировки.СерийныйНомер = Сред(КодМаркировки, 15, 7); // Код идентификации упаковки табачной продукции.
ДанныеМаркировки.КодПроверки = Прав(КодМаркировки, 8); // Код проверки.
ДанныеМаркировки.Разобран = Истина;
ИначеЕсли ДлиннаКода = 31 Тогда // Код маркировки табачной потребительской упаковки, новые требования.
ДанныеМаркировки.ПотребительскаяУпаковка = Истина;
ДанныеМаркировки.ГлобальныйИдентификаторТорговойЕдиницы = Лев(КодМаркировки, 14); // Код товара по товарной номенклатуре GS1.
ДанныеМаркировки.СерийныйНомер = Сред(КодМаркировки, 15, 7); // Код идентификации упаковки табачной продукции.
КодПроверки = Прав(КодМаркировки, 10);
ДанныеМаркировки.ИдентификаторКлючаПроверки = Лев(КодПроверки, 2); // Идентификатор ключа проверки.
ДанныеМаркировки.КодПроверки = Прав(КодПроверки, 8); // Код проверки.
ДанныеМаркировки.Разобран = Истина;
Иначе
ДанныеМаркировки.ОписаниеОшибки = НСтр("ru = 'Штрихкод не распознан.'")
КонецЕсли;
КонецЕсли;
Если ДанныеМаркировки.Разобран Тогда
// Пытаем получить торговый штрихкод EAN8 или EAN13 из GTIN.
GTIN = ДанныеМаркировки.ГлобальныйИдентификаторТорговойЕдиницы;
Пока Лев(GTIN, 1) = "0" И СтрДлина(GTIN) > 8 Цикл
GTIN = Сред(GTIN, 2);
КонецЦикла;
ДанныеМаркировки.EAN = GTIN;
КонецЕсли;
Возврат ДанныеМаркировки;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Возвращает результат разбора строки штрихкода GS1
//
// Возвращаемое значение:
// Структура:
// * Разобран - Булево - штрихкод разобран
// * ОписаниеОшибки - Строка - описание ошибки разбора
// * ПредставлениеШтрихкода - Строка - представление штрихкода
// * ДанныеШтрихкода - Соответствие - разобранные разделы штрихкода
//
Функция НовыйРезультатРазбораСтрокиШтрихкодаGS1() Экспорт
РезультатРазбора = Новый Структура;
РезультатРазбора.Вставить("Разобран" , Ложь);
РезультатРазбора.Вставить("ОписаниеОшибки", "");
РезультатРазбора.Вставить("ПредставлениеШтрихкода", "");
РезультатРазбора.Вставить("ДанныеШтрихкода", Новый Соответствие);
РезультатРазбора.Вставить("ПредставлениеШтрихкодаБезКриптоХвоста" , "");
РезультатРазбора.Вставить("ЕстьКриптоХвост", Ложь);
КонецФункции
// Коды GS1 служебный.
//
// Возвращаемое значение:
// Соответствие из Строка.
//
Функция КодыGS1Служебный() Экспорт;
Коды = Новый Соответствие;
ДобавитьКодGS1(Коды, "00" , "SSCC" , 18);
ДобавитьКодGS1(Коды, "01" , "GTIN" , 14);
ДобавитьКодGS1(Коды, "02" , "CONTENT" , 14);
ДобавитьКодGS1(Коды, "10" , "BATCH_LOT" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "11" , "PROD_DATE" , 6);
ДобавитьКодGS1(Коды, "12" , "DUE_DATE" , 6);
ДобавитьКодGS1(Коды, "13" , "PACK_DATE" , 6);
ДобавитьКодGS1(Коды, "15" , "BEST_BEFORE" , 6);
ДобавитьКодGS1(Коды, "16" , "SELL_BY" , 6);
ДобавитьКодGS1(Коды, "17" , "EXPIRE" , 6);
ДобавитьКодGS1(Коды, "20" , "VARIANT" , 2);
ДобавитьКодGS1(Коды, "21" , "SERIAL" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "22" , "CPV" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "240" , "ADDITIONAL_ID" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "241" , "CUSTOMER_PART_NO" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "242" , "MTO_VARIANT" , , 6);
ДобавитьКодGS1(Коды, "243" , "PCN" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "250" , "SECONDARY_SERIAL" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "251" , "REF_TO_SOURCE" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "253" , "GDTI" , 13, 17, ТипGS1Число(), ТипGS1Строка());
ДобавитьКодGS1(Коды, "254" , "GLN_EXTENSION_COMPONENT" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "255" , "GСТ" , 13, 12);
ДобавитьКодGS1(Коды, "30" , "VAR_COUNT" , , 8);
ДобавитьКодGS1(Коды, "310n", "NET_WEIGHT_kg" , 6);
ДобавитьКодGS1(Коды, "311n", "LENGTH_m" , 6);
ДобавитьКодGS1(Коды, "312n", "WIDTH_m" , 6);
ДобавитьКодGS1(Коды, "313n", "HEIGHT_m" , 6);
ДобавитьКодGS1(Коды, "314n", "AREA_m2" , 6);
ДобавитьКодGS1(Коды, "315n", "NET_VOLUME_l" , 6);
ДобавитьКодGS1(Коды, "316n", "NET_VOLUME_m3" , 6);
ДобавитьКодGS1(Коды, "320n", "NET_WEIGHT_lb" , 6);
ДобавитьКодGS1(Коды, "321n", "LENGTH_i" , 6);
ДобавитьКодGS1(Коды, "322n", "LENGTH_f" , 6);
ДобавитьКодGS1(Коды, "323n", "LENGTH_y" , 6);
ДобавитьКодGS1(Коды, "324n", "WIDTH_i" , 6);
ДобавитьКодGS1(Коды, "325n", "WIDTH_f" , 6);
ДобавитьКодGS1(Коды, "326n", "WIDTH_y" , 6);
ДобавитьКодGS1(Коды, "327n", "HEIGHT_i" , 6);
ДобавитьКодGS1(Коды, "328n", "HEIGHT_f" , 6);
ДобавитьКодGS1(Коды, "329n", "HEIGHT_y" , 6);
ДобавитьКодGS1(Коды, "330n", "GROSS_WEIGHT_kg" , 6);
ДобавитьКодGS1(Коды, "331n", "LENGTH_m_log" , 6);
ДобавитьКодGS1(Коды, "332n", "WIDTH_m_log" , 6);
ДобавитьКодGS1(Коды, "333n", "HEIGHT_m_log" , 6);
ДобавитьКодGS1(Коды, "334n", "AREA_m2_log" , 6);
ДобавитьКодGS1(Коды, "335n", "VOLUME_l_log" , 6);
ДобавитьКодGS1(Коды, "336n", "VOLUME_m3_log" , 6);
ДобавитьКодGS1(Коды, "337n", "KG_PER_m2" , 6);
ДобавитьКодGS1(Коды, "340n", "GROSS_WEIGHT_lb" , 6);
ДобавитьКодGS1(Коды, "341n", "LENGTH_i_log" , 6);
ДобавитьКодGS1(Коды, "342n", "LENGTH_f_log" , 6);
ДобавитьКодGS1(Коды, "343n", "LENGTH_y_log" , 6);
ДобавитьКодGS1(Коды, "344n", "WIDTH_i_log" , 6);
ДобавитьКодGS1(Коды, "345n", "WIDTH_f_log" , 6);
ДобавитьКодGS1(Коды, "346n", "WIDTH_y_log" , 6);
ДобавитьКодGS1(Коды, "347n", "HEIGHT_i_log" , 6);
ДобавитьКодGS1(Коды, "348n", "HEIGHT_f_log" , 6);
ДобавитьКодGS1(Коды, "349n", "HEIGHT_y_log" , 6);
ДобавитьКодGS1(Коды, "350n", "AREA_i2" , 6);
ДобавитьКодGS1(Коды, "351n", "AREA_f2" , 6);
ДобавитьКодGS1(Коды, "352n", "AREA_y2" , 6);
ДобавитьКодGS1(Коды, "353n", "AREA_i2_log" , 6);
ДобавитьКодGS1(Коды, "354n", "AREA_f2_log" , 6);
ДобавитьКодGS1(Коды, "355n", "AREA_y2_log" , 6);
ДобавитьКодGS1(Коды, "356n", "NET_WEIGHT_t" , 6);
ДобавитьКодGS1(Коды, "357n", "NET_VOLUME_oz" , 6);
ДобавитьКодGS1(Коды, "360n", "NET_VOLUME_q" , 6);
ДобавитьКодGS1(Коды, "361n", "NET_VOLUME_g" , 6);
ДобавитьКодGS1(Коды, "362n", "VOLUME_q" , 6);
ДобавитьКодGS1(Коды, "363n", "VOLUME_g" , 6);
ДобавитьКодGS1(Коды, "364n", "VOLUME_i3" , 6);
ДобавитьКодGS1(Коды, "365n", "VOLUME_f3" , 6);
ДобавитьКодGS1(Коды, "366n", "VOLUME_y3" , 6);
ДобавитьКодGS1(Коды, "367n", "VOLUME_i3_log" , 6);
ДобавитьКодGS1(Коды, "368n", "VOLUME_f3_log" , 6);
ДобавитьКодGS1(Коды, "369n", "VOLUME_y3_log" , 6);
ДобавитьКодGS1(Коды, "37" , "COUNT" , , 8);
ДобавитьКодGS1(Коды, "390n", "AMOUNT" , , 15);
ДобавитьКодGS1(Коды, "391n", "AMOUNT_ISO" , 3, 15);
ДобавитьКодGS1(Коды, "392n", "PRICE" , , 15);
ДобавитьКодGS1(Коды, "393n", "PRICE_ISO" , 3, 15);
ДобавитьКодGS1(Коды, "394n", "PRCNT_OFF" , 4, , , , Истина);
ДобавитьКодGS1(Коды, "400" , "ORDER_NUMBER" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "401" , "GINC" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "402" , "GSIN" , 17, , , , Истина);
ДобавитьКодGS1(Коды, "403" , "ROUTE" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "410" , "SHIP_TO_LOC" , 13);
ДобавитьКодGS1(Коды, "411" , "BILL_TO" , 13);
ДобавитьКодGS1(Коды, "412" , "PURCHASE_FROM" , 13);
ДобавитьКодGS1(Коды, "413" , "SHIP_FOR_LOC" , 13);
ДобавитьКодGS1(Коды, "414" , "LOC_No" , 13);
ДобавитьКодGS1(Коды, "415" , "PAY_TO" , 13);
ДобавитьКодGS1(Коды, "416" , "PROD_SERV_LOC" , 13);
ДобавитьКодGS1(Коды, "420" , "SHIP_TO_POST" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "421" , "SHIP_TO_POST_ISO" , 3, 9, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "422" , "ORIGIN" , 3, , , , Истина);
ДобавитьКодGS1(Коды, "423" , "CONTRY_INITIAL_PROCESS" , 3, 12);
ДобавитьКодGS1(Коды, "424" , "CONTRY_PROCESS" , 3, , , , Истина);
ДобавитьКодGS1(Коды, "425" , "CONTRY_DISASSEMBLY" , 3, 12);
ДобавитьКодGS1(Коды, "426" , "CONTRY_FULL_PROCESS" , 3, , , , Истина);
ДобавитьКодGS1(Коды, "427" , "ORIGIN_SUBDIVISION" , , 3, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "7001", "NSN" , 13, , , , Истина);
ДобавитьКодGS1(Коды, "7002", "MEAT_CUT" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "7003", "EXPIRY_TIME" , 10, , , , Истина);
ДобавитьКодGS1(Коды, "7004", "ACTIVE_POTENCY" , , 4);
ДобавитьКодGS1(Коды, "7005", "CATCH_AREA" , , 12, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "7006", "FIRST_FREEZE_DATE" , 6, , , , Истина);
ДобавитьКодGS1(Коды, "7007", "HARVEST_DATE" , 6, 6);
ДобавитьКодGS1(Коды, "7008", "AQUATIC_SPECIES" , , 3, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "7009", "FISHING_GEAR_TYPE" , , 10, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "7010", "PROD_METHOD" , , 2, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "7020", "REFURB_LOT" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "7021", "FUNC_STAT" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "7022", "REV_STAT" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "7023", "GIAI_ASSEMBLY" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "703s", "PROCESSOR_s" , 3, 27, ТипGS1Число(), ТипGS1Строка());
ДобавитьКодGS1(Коды, "710" , "NHRN_PZN" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "711" , "NHRN_CIP" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "712" , "NHRN_CN" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "713" , "NHRN_DRN" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "8001", "DIMENSIONS" , 14, , , , Истина);
ДобавитьКодGS1(Коды, "8002", "CMT_No" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "8003", "GRAI" , 14, 16, ТипGS1Число(), ТипGS1Строка());
ДобавитьКодGS1(Коды, "8004", "GIAI" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "8005", "PRICE_PER_UNIT" , 6, , , , Истина);
ДобавитьКодGS1(Коды, "8006", "ITIP_or_GCTIN" , 18, , , , Истина);
ДобавитьКодGS1(Коды, "8007", "IBAN" , , 34, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "8008", "PROD_TIME" , 8, 4, , , Истина);
ДобавитьКодGS1(Коды, "8010", "CPID" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "8011", "CPID_SERIAL" , , 12);
ДобавитьКодGS1(Коды, "8012", "VERSION" , , 20, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "8017", "GSRN_PROVIDER" , 18, , , , Истина);
ДобавитьКодGS1(Коды, "8018", "GSRN_RECIPIENT" , 18, , , , Истина);
ДобавитьКодGS1(Коды, "8019", "SRIN" , , 10);
ДобавитьКодGS1(Коды, "8020", "REF_No" , , 25, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "8110", "COUPON_CODE_ID" , , 70, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "8111", "POINTS" , 4, , , , Истина);
ДобавитьКодGS1(Коды, "8112", "PAPPERLESS_COUPON_CODE_ID" , , 70, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "8200", "PRODUCT_URL" , , 70, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "90" , "INTERNAL" , , 30, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "91" , "INTERNAL1" , , 90, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "92" , "INTERNAL2" , , 90, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "93" , "INTERNAL3" , , 90, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "94" , "INTERNAL4" , , 90, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "95" , "INTERNAL5" , , 90, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "96" , "INTERNAL6" , , 90, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "97" , "INTERNAL7" , , 90, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "98" , "INTERNAL8" , , 90, , ТипGS1Строка());
ДобавитьКодGS1(Коды, "99" , "INTERNAL9" , , 90, , ТипGS1Строка());
Возврат Коды
КонецФункции
// Разобрать штриховой код товара служебная.
//
// Параметры:
// Штрихкод - Строка - Штрихкод
// ШтрихкодВBase64 - Булево - Штрихкод в base64
//
// Возвращаемое значение:
// Структура - Разобрать штриховой код товара:
// * Разобран - Булево -
// * ОписаниеОшибки - СТрока
// * ПредставлениеШтрихкода - Строка -
// * ДанныеШтрихкода - Строка -
// * ТипИдентификатораТовара - ПеречислениеСсылка.ТипыИдентификаторовТовараККТ -
// * GTIN - Строка -
// * СерийныйНомер - Строка -
// * EAN - Строка -
// * РеквизитКодаТовараHEX - Строка -
// * РеквизитКодаТовара - Строка -
// * ИдентифицируетЭкземпляр - Булево -
// * ПотребительскаяУпаковкаТабачнойПродукции - Булево -
// * ШтрихкодBase64 - Булево -
// * НаименованиеРеквизита - Строка -
//
Функция РазобратьШтриховойКодТовараСлужебная(Знач Штрихкод, Знач ШтрихкодВBase64 = Ложь, КодыGS1 = Неопределено) Экспорт;
Идентификаторы = ИдентификаторыGS1();
// Определяем структуру результата.
ДанныеКодаТовара = ЗаполнитьИменаРеквизитовКодаТовара(Ложь);
Если ШтрихкодВBase64 Тогда
ДанныеКодаТовара.ШтрихкодBase64 = Штрихкод;
ДвоичныеДанные = Base64Значение(Штрихкод);
Если ДвоичныеДанные = Неопределено Тогда
ШтриховойКодТовара = ШтрихкодВBase64;
Иначе
ШтриховойКодТовара = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные);
КонецЕсли;
Иначе
ШтриховойКодТовара = Штрихкод;
ДанныеКодаТовара.ШтрихкодBase64 = МенеджерОборудованияКлиентСервер.ШтрихкодВBase64(ШтриховойКодТовара);
КонецЕсли;
// Алгоритм реализован по приказу Федеральной налоговой службы от 29.08.2019 № ММВ-7-20/434@ "О внесении изменений в приложение № 2
// к приказу Федеральной налоговой службы от 21.03.2017 № ММВ-7-20/229@" (Зарегистрирован 25.12.2019 № 56978).
ДлинаШтрихкода = СтрДлина(ШтриховойКодТовара);
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараНеРаспознан");
ДанныеКодаТовара.НаименованиеРеквизита = "NotIdentified";
Если ДлинаШтрихкода = 8 Тогда // ТипыИдентификаторовТовара.EAN8
// Последовательности данных равна 8 символам и последовательность символов состоит из цифр.
Если ТолькоЦифрыВСтроке(ШтриховойКодТовара) Тогда
// Проверяется контрольная сумма по правилам формирования кода EAN-8.
Если МенеджерОборудованияКлиентСервер.РассчитатьКонтрольныйСимволGTIN8(ШтриховойКодТовара) = Прав(ШтриховойКодТовара, 1) Тогда
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараВФорматеEAN8");
СформироватьEAN(ДанныеКодаТовара, ШтриховойКодТовара);
СформироватьДвоичныеДанныеДляЧисла(ДанныеКодаТовара, ШтриховойКодТовара);
ДанныеКодаТовара.Разобран = Истина;
ДанныеКодаТовара.НаименованиеРеквизита = "EAN8";
Возврат ДанныеКодаТовара;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ДлинаШтрихкода = 13 Тогда // ТипыИдентификаторовТовара.EAN13
// Последовательности данных равна 13 символам и последовательность символов состоит из цифр.
Если ТолькоЦифрыВСтроке(ШтриховойКодТовара) Тогда
// Проверяется контрольная сумма по правилам формирования кода EAN-13.
Если МенеджерОборудованияКлиентСервер.РассчитатьКонтрольныйСимволGTIN13(ШтриховойКодТовара) = Прав(ШтриховойКодТовара, 1) Тогда
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараВФорматеEAN13");
СформироватьEAN(ДанныеКодаТовара, ШтриховойКодТовара);
СформироватьДвоичныеДанныеДляЧисла(ДанныеКодаТовара, ШтриховойКодТовара);
ДанныеКодаТовара.Разобран = Истина;
ДанныеКодаТовара.НаименованиеРеквизита = "EAN13";
Возврат ДанныеКодаТовара;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ДлинаШтрихкода = 14 Тогда // ТипыИдентификаторовТовара.ITF14
// Последовательности данных равна 14 символам и последовательность символов состоит из цифр.
Если ТолькоЦифрыВСтроке(ШтриховойКодТовара) Тогда
// Проверяется контрольная сумма по правилам формирования кода ITF-14
Если МенеджерОборудованияКлиентСервер.РассчитатьКонтрольныйСимволGTIN14(ШтриховойКодТовара) = Прав(ШтриховойКодТовара, 1) Тогда
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараВФорматеITF14");
СформироватьEAN(ДанныеКодаТовара, ШтриховойКодТовара);
СформироватьДвоичныеДанныеДляЧисла(ДанныеКодаТовара, ШтриховойКодТовара);
ДанныеКодаТовара.Разобран = Истина;
ДанныеКодаТовара.НаименованиеРеквизита = "ITF14";
Возврат ДанныеКодаТовара;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ДлинаШтрихкода = 20 Тогда // Код товара средства идентификации мехового изделия.
// Последовательности данных равна 20 символам.
// Последовательность символов состоит из прописных латинских букв, цифр и символа-разделителя «-»,
// проверяется формат содержания считанной последовательности на шаблон СС-ЦЦЦЦЦЦ-СССССССССС.
Если Сред(ШтриховойКодТовара, 3, 1) = "-" И Сред(ШтриховойКодТовара, 10, 1) = "-" Тогда
СимвольныйКодГосударства = Сред(ШтриховойКодТовара, 1, 2);
ТипИдентификационногоЗнака = Сред(ШтриховойКодТовара, 4, 6);
СерияИдентификационногоЗнака = Сред(ШтриховойКодТовара, 11, 10);
Если ПроверкаСтроки(СимвольныйКодГосударства, ПараметрыПроверкиСтроки(Истина))
И ТолькоЦифрыВСтроке(ТипИдентификационногоЗнака)
И ПроверкаСтроки(СерияИдентификационногоЗнака, ПараметрыПроверкиСтроки(Истина,,Истина)) Тогда
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.ИзделияИзНатуральногоМеха");
СформироватьДвоичныеДанныеДляСтроки(ДанныеКодаТовара, ШтриховойКодТовара);
ДанныеКодаТовара.Разобран = Истина;
ДанныеКодаТовара.ИдентифицируетЭкземпляр = Истина;
ДанныеКодаТовара.НаименованиеРеквизита = "MI";
Возврат ДанныеКодаТовара;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ДлинаШтрихкода = 29 Или ДлинаШтрихкода = 25 Тогда // Код товара в формате Data Matrix маркировки табачной продукции.
ПараметрыПроверкиСтроки = ПараметрыПроверкиСтроки(Истина, Истина, Истина);
ПараметрыПроверкиСтроки.ДопустимыеСимволы = "«!”""%&'()*+-.,/_:;=<>?»";
Если ПроверкаСтроки(ШтриховойКодТовара, ПараметрыПроверкиСтроки) Тогда
GTIN = Лев(ШтриховойКодТовара, 14);
СерийныйНомер = Сред(ШтриховойКодТовара, 15, 7); // Код идентификации упаковки табачной продукции.
МРЦ = Сред(ШтриховойКодТовара, 22, 4); // ЦРЦ.
Если ТолькоЦифрыВСтроке(GTIN) И МенеджерОборудованияКлиентСервер.РассчитатьКонтрольныйСимволGTIN14(GTIN) = Прав(GTIN, 1) Тогда
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараВФорматеDataMatrixGS1");
ДанныеКодаТовара.СерийныйНомер = СерийныйНомер;
СформироватьEAN(ДанныеКодаТовара, GTIN);
// Последующие 11 символов считанной последовательности формируются по правилам интерпретации ASCII в hex
ЗначениеСтроки = СерийныйНомер + МРЦ;
Пока СтрДлина(ЗначениеСтроки) < 13 Цикл
ЗначениеСтроки = ЗначениеСтроки + Символ(32); // Дополняем знаками «20h» в конце (пробелами справа) до 13 байт
КонецЦикла;
СформироватьДвоичныеДанныеДляЧисла(ДанныеКодаТовара, GTIN, ЗначениеСтроки);
ДанныеКодаТовара.Разобран = Истина;
ДанныеКодаТовара.ИдентифицируетЭкземпляр = Истина;
ДанныеКодаТовара.ПотребительскаяУпаковкаТабачнойПродукции = Истина;
ДанныеКодаТовара.НаименованиеРеквизита = "KMK";
ДанныеКодаТовара.ПредставлениеШтрихкода = ШтриховойКодТовара;
ДанныеКодаТовара.ПредставлениеШтрихкодаБезКриптоХвоста = GTIN + СерийныйНомер + МРЦ;
Возврат ДанныеКодаТовара;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ДлинаШтрихкода = 41
Или ДлинаШтрихкода = 52 Тогда // Код товара в формате Data Matrix маркировки блок табачной продукции.
Если КодВФорматеDataMatrix40БезGS(ШтриховойКодТовара, ДанныеКодаТовара) Тогда
Возврат ДанныеКодаТовара;
КонецЕсли;
КонецЕсли;
Если КодыGS1 = Неопределено Тогда
КодыGS1 = КодыGS1Служебный();
КонецЕсли;
Если СтрНачинаетсяС(ШтриховойКодТовара, "(") Тогда
// Штрихкод по стандарту GS1 в HRI виде.
РазобратьСтрокуШтрихкодаGS1СоСкобками(ШтриховойКодТовара, ДанныеКодаТовара, КодыGS1);
КонецЕсли;
Если НЕ ДанныеКодаТовара.Разобран Тогда
// Штрихкод по стандарту GS1 присутствует символ разделитель GS1 (Dec 29).
ПозицияРазделителяGS1 = Найти(ШтриховойКодТовара, ОбщегоНазначенияБПОКлиентСервер.РазделительGS1());
ПозицияРазделителяЭкран = Найти(ШтриховойКодТовара, ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволGS1());
Если ПозицияРазделителяGS1 > 0 Или ПозицияРазделителяЭкран > 0 Тогда
Если ПозицияРазделителяЭкран > 0 Тогда
ЧастиШтрихкода = ОбщегоНазначенияБПОКлиентСервер.РазложитьСтрокуВМассивПодстрок(
ШтриховойКодТовара, ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволGS1(), Ложь);
Иначе
ЧастиШтрихкода = СтрРазделить(ШтриховойКодТовара, ОбщегоНазначенияБПОКлиентСервер.РазделительGS1(), Ложь);
КонецЕсли;
Для Каждого ЧастьБезРазделителей Из ЧастиШтрихкода Цикл
РазобратьСтрокуШтрихкодаGS1Служебный(ЧастьБезРазделителей, ДанныеКодаТовара, КодыGS1);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если НЕ ДанныеКодаТовара.Разобран Тогда
// Штрихкод по стандарту GS1 без разделителя GS1 (Dec 29).
РазобратьСтрокуШтрихкодаGS1Служебный(ШтриховойКодТовара, ДанныеКодаТовара, КодыGS1);
КонецЕсли;
// выделить криптохвост
Если ДанныеКодаТовара.ЕстьКриптоХвост Тогда
ШтрихкодБезКриптоХвоста = ШтриховойКодТовара;
КриптоХвост = "";
ПозицияРазделителяGS1 = СтрНайти(ШтриховойКодТовара, ОбщегоНазначенияБПОКлиентСервер.РазделительGS1());
ПозицияРазделителяЭкран = СтрНайти(ШтриховойКодТовара, ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволGS1());
Если ПозицияРазделителяЭкран > 0 Тогда
РазделительКода = ОбщегоНазначенияБПОКлиентСервер.ЭкранированныйСимволGS1();
ИначеЕсли ПозицияРазделителяGS1 > 0 Тогда
РазделительКода = ОбщегоНазначенияБПОКлиентСервер.РазделительGS1();
Иначе
РазделительКода = "";
КонецЕсли;
КодЧасти = "91";
ЭлементКода = ДанныеКодаТовара.ДанныеШтрихкода[КодЧасти];
Если ЭлементКода <> Неопределено Тогда
ШтрихкодБезКриптоХвоста =СтрЗаменить(ШтрихкодБезКриптоХвоста,
КодЧасти + ЭлементКода.Значение + РазделительКода, "");
ШтрихкодБезКриптоХвоста =СтрЗаменить(ШтрихкодБезКриптоХвоста,
"("+КодЧасти + ")" + ЭлементКода.Значение + РазделительКода, "");
КриптоХвост = КриптоХвост + КодЧасти + ЭлементКода.Значение + РазделительКода;
КонецЕсли;
КодЧасти = "92";
ЭлементКода = ДанныеКодаТовара.ДанныеШтрихкода[КодЧасти];
Если ЭлементКода <> Неопределено Тогда
ШтрихкодБезКриптоХвоста =СтрЗаменить(ШтрихкодБезКриптоХвоста,
КодЧасти + ЭлементКода.Значение + РазделительКода, "");
ШтрихкодБезКриптоХвоста =СтрЗаменить(ШтрихкодБезКриптоХвоста,
"("+КодЧасти + ")" + ЭлементКода.Значение + РазделительКода, "");
КриптоХвост = КриптоХвост + КодЧасти + ЭлементКода.Значение + РазделительКода;
КонецЕсли;
КодЧасти = "93";
ЭлементКода = ДанныеКодаТовара.ДанныеШтрихкода[КодЧасти];
Если ЭлементКода <> Неопределено Тогда
ШтрихкодБезКриптоХвоста =СтрЗаменить(ШтрихкодБезКриптоХвоста,
КодЧасти + ЭлементКода.Значение + РазделительКода, "");
ШтрихкодБезКриптоХвоста =СтрЗаменить(ШтрихкодБезКриптоХвоста,
"("+КодЧасти + ")" + ЭлементКода.Значение + РазделительКода, "");
КриптоХвост = КриптоХвост + КодЧасти + ЭлементКода.Значение + РазделительКода;
КонецЕсли;
ДанныеКодаТовара.ШтрихкодБезКриптоХвоста = ШтрихкодБезКриптоХвоста;
ДанныеКодаТовара.ШтрихкодBase64БезКриптоХвоста = ОбщегоНазначенияБПОКлиентСервер.ШтрихкодВBase64(ШтрихкодБезКриптоХвоста);
ДанныеКодаТовара.КриптоХвостBase64 = ОбщегоНазначенияБПОКлиентСервер.ШтрихкодВBase64(КриптоХвост);
КонецЕсли;
// Штрихкод по стандарту GS1
Если ДанныеКодаТовара.Разобран Тогда
ЗначениеЭлемента = ДанныеКодаТовара.ДанныеШтрихкода.Получить(Идентификаторы.GTIN);
GTIN = ?(ЗначениеЭлемента <> Неопределено, ЗначениеЭлемента.Значение, Неопределено);
Если GTIN <> Неопределено И ТолькоЦифрыВСтроке(GTIN) И МенеджерОборудованияКлиентСервер.РассчитатьКонтрольныйСимволGTIN14(GTIN) = Прав(GTIN, 1) Тогда
ЗначениеЭлемента = ДанныеКодаТовара.ДанныеШтрихкода.Получить(Идентификаторы.СерийныйНомер);
Если ЗначениеЭлемента <> Неопределено Тогда
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараВФорматеDataMatrixGS1");
ДанныеКодаТовара.СерийныйНомер = ЗначениеЭлемента.Значение;
СерийныйНомер = ДанныеКодаТовара.СерийныйНомер;
ЗначениеЭлементаЦена = ДанныеКодаТовара.ДанныеШтрихкода.Получить(Идентификаторы.ЦенаЕдиницыТовара);
Если ЗначениеЭлементаЦена <> Неопределено Тогда
СерийныйНомер = СерийныйНомер + ЗначениеЭлементаЦена.Значение;
КонецЕсли;
СформироватьEAN(ДанныеКодаТовара, GTIN);
СформироватьДвоичныеДанныеДляЧисла(ДанныеКодаТовара, GTIN, СерийныйНомер);
ДанныеКодаТовара.Разобран = Истина;
ДанныеКодаТовара.ИдентифицируетЭкземпляр = Истина;
ДанныеКодаТовара.НаименованиеРеквизита = "GS1.M";
// Фиксированное значение для AI 98, указывающее на технический КМ.
ЗначениеЭлемента = ДанныеКодаТовара.ДанныеШтрихкода.Получить("98");
Если ЗначениеЭлемента <> Неопределено Тогда
ДанныеКодаТовара.ТехническийКод = ЗначениеЭлемента.Значение = "crpt";
КонецЕсли;
Возврат ДанныеКодаТовара;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Штрихкод Datamatrix содержит идентификаторы применения (AI).
Если Лев(ШтриховойКодТовара, 2) = Идентификаторы.GTIN Тогда // Если штрихкод начинается с группы '01' - GTIN .
GTIN = Сред(ШтриховойКодТовара, 3, 14); // Получаем GTIN
// Проверяем GTIN на корректность, и далее идет группа '21' - SERIAL.
Если ТолькоЦифрыВСтроке(GTIN) И МенеджерОборудованияКлиентСервер.РассчитатьКонтрольныйСимволGTIN14(GTIN) = Прав(GTIN, 1)
И Сред(ШтриховойКодТовара, 17, 2) = Идентификаторы.СерийныйНомер Тогда
ДанныеСтроки = Сред(ШтриховойКодТовара, 19);
Если СтрДлина(ДанныеСтроки) > 13 Тогда //
// Предполагаем что серийный номер состоит из 13 символов
СерийныйНомер = Сред(ДанныеСтроки, 1, 13);
СледующаяГруппа2 = Сред(ДанныеСтроки, 14, 2);
СледующаяГруппа3 = Сред(ДанныеСтроки, 14, 3);
СледующаяГруппа4 = Сред(ДанныеСтроки, 14, 4);
Если СледующаяГруппа2 = Идентификаторы.КлючПроверки Или СледующаяГруппа2 = Идентификаторы.КодПроверки
Или СледующаяГруппа2 = "17" Или СледующаяГруппа4 = "7003"
Или СледующаяГруппа3 = Идентификаторы.КодТНВЭД Тогда
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараВФорматеDataMatrixGS1");
ДанныеКодаТовара.СерийныйНомер = СерийныйНомер;
СформироватьEAN(ДанныеКодаТовара, GTIN);
СформироватьДвоичныеДанныеДляЧисла(ДанныеКодаТовара, GTIN, ДанныеКодаТовара.СерийныйНомер);
ДанныеКодаТовара.Разобран = Истина;
ДанныеКодаТовара.ИдентифицируетЭкземпляр = Истина;
ДанныеКодаТовара.НаименованиеРеквизита = "GS1.0";
Возврат ДанныеКодаТовара;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Штрихкод не содержит наличие идентификаторов применения (AI) по стандарту GS1
Если ДлинаШтрихкода = 68 Тогда // Код товара в кодировке ЕГАИС 2.0 в формате PDF417.
// Последовательность символов состоит из прописных латинских букв и цифр и не содержит наличие идентификаторов применения
ПараметрыПроверкиСтроки = ПараметрыПроверкиСтроки(Истина, Ложь, Истина);
Если ПроверкаСтроки(ШтриховойКодТовара, ПараметрыПроверкиСтроки) Тогда
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараВФорматеЕГАИС2");
// Данные начиная с 9 символа по 31 символ включительно, сформированные по правилам интерпретации ASCII в hex.
ДанныеРеквизитаКодаТовара = Сред(ШтриховойКодТовара, 9, 23);
СформироватьДвоичныеДанныеДляСтроки(ДанныеКодаТовара, ДанныеРеквизитаКодаТовара);
ДанныеКодаТовара.Разобран = Истина;
ДанныеКодаТовара.ИдентифицируетЭкземпляр = Истина;
ДанныеКодаТовара.НаименованиеРеквизита = "EGAIS20";
Возврат ДанныеКодаТовара;
КонецЕсли;
ИначеЕсли ДлинаШтрихкода = 150 Тогда // Код товара в кодировке ЕГАИС 3.0 в формате Data Matrix.
// Последовательность символов состоит из прописных латинских букв и цифр и не содержит наличие идентификаторов применения.
ПараметрыПроверкиСтроки = ПараметрыПроверкиСтроки(Истина, Ложь, Истина);
Если ПроверкаСтроки(ШтриховойКодТовара, ПараметрыПроверкиСтроки) Тогда
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараВФорматеЕГАИС3");
// Данные начиная с 1 символа по 14 символ включительно, сформированной по правилам интерпретации ASCII в hex.
ДанныеРеквизитаКодаТовара = Лев(ШтриховойКодТовара, 14);
СформироватьДвоичныеДанныеДляСтроки(ДанныеКодаТовара, ДанныеРеквизитаКодаТовара);
ДанныеКодаТовара.Разобран = Истина;
ДанныеКодаТовара.ИдентифицируетЭкземпляр = Истина;
ДанныеКодаТовара.НаименованиеРеквизита = "EGAIS30";
Возврат ДанныеКодаТовара;
КонецЕсли;
КонецЕсли;
СформироватьДвоичныеДанныеДляСтроки(ДанныеКодаТовара, Лев(ШтриховойКодТовара, 30));
Возврат ДанныеКодаТовара;
КонецФункции
Процедура РазобратьСтрокуШтрихкодаGS1СоСкобками(Штрихкод, РезультатРазбора, КодыGS1) Экспорт
РезультатРазбора.ПредставлениеШтрихкода = Штрихкод;
РезультатРазбора.ПредставлениеШтрихкодаБезКриптоХвоста = Штрихкод;
ДлинаШтрихкода = СтрДлина(Штрихкод);
МинимальнаяДлинаИдентификатораПрименения = 2;
МаксимальнаяДлинаИдентификатораПрименения = 4;
НомерСимвола = 1;
Пока НомерСимвола <= ДлинаШтрихкода Цикл
Если Сред(Штрихкод, НомерСимвола, 1) <> "(" Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Номер символа %1. Отсутствует ""("".'"), НомерСимвола);
Возврат;
КонецЕсли;
НомерСимвола = НомерСимвола + 1;
Позиция = СтрНайти(Штрихкод, ")",, НомерСимвола);
Если Позиция = 0 Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Номер символа %1. Отсутствует "")"".'"), НомерСимвола);
Возврат;
КонецЕсли;
ИдентификаторПрименения = Сред(Штрихкод, НомерСимвола, Позиция - НомерСимвола);
ДлинаИдентификатора = СтрДлина(ИдентификаторПрименения);
Если ДлинаИдентификатора < МинимальнаяДлинаИдентификатораПрименения Или ДлинаИдентификатора > МаксимальнаяДлинаИдентификатораПрименения Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Номер символа %1. Неизвестный идентификатор применения(AI) %2.'"), НомерСимвола, ИдентификаторПрименения);
Возврат;
КонецЕсли;
ПоложениеДесятичнойТочкиСтрокой = "";
ОписаниеКода = КодыGS1[ИдентификаторПрименения];
Если ОписаниеКода = Неопределено Тогда
Если ДлинаИдентификатора = МаксимальнаяДлинаИдентификатораПрименения Тогда
ОписаниеКода = КодыGS1[Лев(ИдентификаторПрименения, МаксимальнаяДлинаИдентификатораПрименения - 1)];
ПоложениеДесятичнойТочкиСтрокой = Прав(ИдентификаторПрименения, 1);
КонецЕсли;
КонецЕсли;
Если ОписаниеКода = Неопределено Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Номер символа %1. Неизвестный идентификатор применения(AI) %2.'"), НомерСимвола, ИдентификаторПрименения);
Возврат;
КонецЕсли;
НомерСимвола = Позиция + 1;
Значение = "";
Если ОписаниеКода.ФиксированнаяДлина > 0 Тогда
Значение = Сред(ШтрихКод, НомерСимвола, ОписаниеКода.ФиксированнаяДлина);
Если СтрДлина(Значение) <> ОписаниеКода.ФиксированнаяДлина Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Номер символа %5. Длина значения (%3) для идентификатора применения(AI) ""%1 %2"" меньше требуемой (%4)'"),
ИдентификаторПрименения, ОписаниеКода.Имя, СтрДлина(Значение), ОписаниеКода.ФиксированнаяДлина, НомерСимвола);
Возврат;
КонецЕсли;
Если ОписаниеКода.ТипФиксированногоЗначения = ТипGS1Число() Тогда
Если Не ТолькоЦифрыВСтроке(Значение) Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Номер символа %4. Значение (%3) для идентификатора применения(AI) ""%1 %2"" должно содержать только цифры'"),
ИдентификаторПрименения, ОписаниеКода.Имя, СтрДлина(Значение), НомерСимвола);
Возврат;
КонецЕсли;
КонецЕсли;
НомерСимвола = НомерСимвола + ОписаниеКода.ФиксированнаяДлина;
КонецЕсли;
Если ОписаниеКода.ПеременнаяДлина > 0 И Позиция < ДлинаШтрихкода Тогда
ПозицияСледующегоИдентификатора = СтрНайти(Штрихкод, "(",, НомерСимвола);
ПравильныйИдентификатор = Ложь;
Пока ПозицияСледующегоИдентификатора > 0 И Не ПравильныйИдентификатор Цикл
ПозицияЗакрывающегоИдентификатора = СтрНайти(Штрихкод, ")", , ПозицияСледующегоИдентификатора);
ПредполагаемыйИдентификатор = Сред(Штрихкод, ПозицияСледующегоИдентификатора + 1,ПозицияЗакрывающегоИдентификатора - ПозицияСледующегоИдентификатора - 1);
ПравильныйИдентификатор = СтрДлина(ПредполагаемыйИдентификатор) > 1 И СтрДлина(ПредполагаемыйИдентификатор) < 5 И ТолькоЦифрыВСтроке(ПредполагаемыйИдентификатор);
Если ПозицияСледующегоИдентификатора >= ДлинаШтрихкода Тогда
ПозицияСледующегоИдентификатора = 0
ИначеЕсли Не ПравильныйИдентификатор Тогда
ПозицияСледующегоИдентификатора = СтрНайти(Штрихкод, "(",, ПозицияСледующегоИдентификатора + 1);
КонецЕсли;
КонецЦикла;
Если ПозицияСледующегоИдентификатора > 0 Тогда
ЗначениеПеременное = Сред(Штрихкод, НомерСимвола, ПозицияСледующегоИдентификатора - НомерСимвола);
Иначе
ЗначениеПеременное = Сред(Штрихкод, НомерСимвола);
КонецЕсли;
Если СтрДлина(ЗначениеПеременное) > ОписаниеКода.ПеременнаяДлина Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Номер символа %5. Длина значения (%3) переменной части для идентификатора применения(AI) ""%1 %2"" больше требуемой (%4)'"),
ИдентификаторПрименения, ОписаниеКода.Имя, СтрДлина(ЗначениеПеременное), ОписаниеКода.ПеременнаяДлина, НомерСимвола);
Возврат;
КонецЕсли;
Если ОписаниеКода.ТипПеременногоЗначения = ТипGS1Число() Тогда
Если Не ТолькоЦифрыВСтроке(ЗначениеПеременное) Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Номер символа %4. Значение (%3) для идентификатора применения(AI) ""%1 %2"" должно содержать только цифры'"),
ИдентификаторПрименения, ОписаниеКода.Имя, СтрДлина(ЗначениеПеременное), НомерСимвола);
Возврат;
КонецЕсли;
КонецЕсли;
НомерСимвола = НомерСимвола + СтрДлина(ЗначениеПеременное);
Значение = Значение + ЗначениеПеременное;
КонецЕсли;
ПоложениеДесятичнойТочки = 0;
Если Не ПустаяСтрока(ПоложениеДесятичнойТочкиСтрокой) Тогда
ПоложениеДесятичнойТочки = Число(ПоложениеДесятичнойТочкиСтрокой);
Если ПоложениеДесятичнойТочки > 0 Тогда
Для Индекс = 0 По ПоложениеДесятичнойТочки - СтрДлина(Значение) Цикл
Значение = "0" + Значение;
КонецЦикла;
Значение = Лев(Значение, СтрДлина(Значение) - ПоложениеДесятичнойТочки) + "." + Прав(Значение, ПоложениеДесятичнойТочки);
КонецЕсли;
КонецЕсли;
ОписаниеДанных = Новый Структура;
ОписаниеДанных.Вставить("ПоложениеДесятичнойТочки", ПоложениеДесятичнойТочки);
ОписаниеДанных.Вставить("Значение", Значение);
РезультатРазбора.ДанныеШтрихкода.Вставить(ОписаниеКода.Код, ОписаниеДанных);
// убрать криптохвост из представления
Если ОписаниеКода.Код = "91" Или ОписаниеКода.Код = "92" Или ОписаниеКода.Код = "93" Тогда
РезультатРазбора.ПредставлениеШтрихкодаБезКриптоХвоста =
СтрЗаменить(РезультатРазбора.ПредставлениеШтрихкодаБезКриптоХвоста,
"("+ОписаниеКода.Код+")"+Значение,"");
РезультатРазбора.ЕстьКриптоХвост = Истина;
КонецЕсли;
КонецЦикла;
РезультатРазбора.Разобран = Истина;
КонецПроцедуры
Процедура РазобратьСтрокуШтрихкодаGS1Служебный(Штрихкод, РезультатРазбора, КодыGS1) Экспорт
ДлинаШтрихкода = СтрДлина(Штрихкод);
ПредставлениеШтрихкода = "";
ПредставлениеШтрихкодаБезКриптоХвоста = "";
ЕстьКриптоХвост = Ложь;
НомерСимвола = 1;
Пока НомерСимвола <= ДлинаШтрихкода Цикл
ИдентификаторПрименения = Сред(Штрихкод, НомерСимвола, 2);
ОписаниеКода = КодыGS1[ИдентификаторПрименения];
Если ОписаниеКода = Неопределено Тогда
ИдентификаторПрименения = Сред(Штрихкод, НомерСимвола, 3);
ОписаниеКода = КодыGS1[ИдентификаторПрименения];
Если ОписаниеКода = Неопределено Тогда
ИдентификаторПрименения = Сред(Штрихкод, НомерСимвола, 4);
ОписаниеКода = КодыGS1[ИдентификаторПрименения];
Если ОписаниеКода = Неопределено Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Неизвестный идентификатор применения(AI) %1.'"), ИдентификаторПрименения);
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
НомерСимвола = НомерСимвола + СтрДлина(ИдентификаторПрименения);
ПоложениеДесятичнойТочкиСтрокой = "";
Если ОписаниеКода.ЕстьПоложениеДесятичнойТочки Тогда
ПоложениеДесятичнойТочкиСтрокой = Сред(Штрихкод, НомерСимвола, 1);
НомерСимвола = НомерСимвола + 1;
КонецЕсли;
Значение = "";
Если ОписаниеКода.ФиксированнаяДлина > 0 Тогда
Значение = Сред(ШтрихКод, НомерСимвола, ОписаниеКода.ФиксированнаяДлина);
Если СтрДлина(Значение) <> ОписаниеКода.ФиксированнаяДлина Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Длина значения (%3) для идентификатора применения(AI) ""%1 %2"" меньше требуемой (%4)'"),
ИдентификаторПрименения, ОписаниеКода.Имя, СтрДлина(Значение), ОписаниеКода.ФиксированнаяДлина);
Возврат;
КонецЕсли;
Если ОписаниеКода.ТипФиксированногоЗначения = ТипGS1Число() Тогда
Если Не ТолькоЦифрыВСтроке(Значение) Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Значение (%3) для идентификатора применения(AI) ""%1 %2"" должно содержать только цифры'"),
ИдентификаторПрименения, ОписаниеКода.Имя, СтрДлина(Значение));
Возврат;
КонецЕсли;
КонецЕсли;
НомерСимвола = НомерСимвола + ОписаниеКода.ФиксированнаяДлина;
КонецЕсли;
Если ОписаниеКода.ПеременнаяДлина > 0 Тогда
ЗначениеПеременное = Сред(Штрихкод, НомерСимвола);
Если СтрДлина(ЗначениеПеременное) > ОписаниеКода.ПеременнаяДлина Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Длина значения (%3) переменной части для идентификатора применения(AI) ""%1 %2"" больше требуемой (%4)'"),
ИдентификаторПрименения, ОписаниеКода.Имя, СтрДлина(ЗначениеПеременное), ОписаниеКода.ПеременнаяДлина);
Возврат;
КонецЕсли;
Если ОписаниеКода.ТипПеременногоЗначения = ТипGS1Число() Тогда
Если Не ТолькоЦифрыВСтроке(ЗначениеПеременное) Тогда
РезультатРазбора.ОписаниеОшибки = СтрШаблон(
НСтр("ru = 'Значение (%3) для идентификатора применения(AI) ""%1 %2"" должно содержать только цифры'"),
ИдентификаторПрименения, ОписаниеКода.Имя, СтрДлина(ЗначениеПеременное));
Возврат;
КонецЕсли;
КонецЕсли;
НомерСимвола = НомерСимвола + СтрДлина(ЗначениеПеременное);
Значение = Значение + ЗначениеПеременное;
КонецЕсли;
ПредставлениеШтрихкода = ПредставлениеШтрихкода + "(" + ИдентификаторПрименения + ПоложениеДесятичнойТочкиСтрокой + ")" + Значение;
Если ИдентификаторПрименения = "91" Или ИдентификаторПрименения = "92" Или ИдентификаторПрименения = "93" Тогда
ЕстьКриптоХвост = Истина;
Иначе
ПредставлениеШтрихкодаБезКриптоХвоста = ПредставлениеШтрихкодаБезКриптоХвоста + "(" + ИдентификаторПрименения + ПоложениеДесятичнойТочкиСтрокой + ")" + Значение;
КонецЕсли;
ПоложениеДесятичнойТочки = 0;
Если Не ПустаяСтрока(ПоложениеДесятичнойТочкиСтрокой) Тогда
ПоложениеДесятичнойТочки = Число(ПоложениеДесятичнойТочкиСтрокой);
Если ПоложениеДесятичнойТочки > 0 Тогда
Для Индекс = 0 По ПоложениеДесятичнойТочки - СтрДлина(Значение) Цикл
Значение = "0" + Значение;
КонецЦикла;
Значение = Лев(Значение, СтрДлина(Значение) - ПоложениеДесятичнойТочки) + "." + Прав(Значение, ПоложениеДесятичнойТочки);
КонецЕсли;
КонецЕсли;
ОписаниеДанных = Новый Структура;
ОписаниеДанных.Вставить("ПоложениеДесятичнойТочки", ПоложениеДесятичнойТочки);
ОписаниеДанных.Вставить("Значение", Значение);
РезультатРазбора.ДанныеШтрихкода.Вставить(ОписаниеКода.Код, ОписаниеДанных);
КонецЦикла;
РезультатРазбора.ПредставлениеШтрихкода = РезультатРазбора.ПредставлениеШтрихкода + ПредставлениеШтрихкода;
РезультатРазбора.ПредставлениеШтрихкодаБезКриптоХвоста = РезультатРазбора.ПредставлениеШтрихкодаБезКриптоХвоста + ПредставлениеШтрихкодаБезКриптоХвоста;
РезультатРазбора.ЕстьКриптоХвост = ЕстьКриптоХвост;
РезультатРазбора.Разобран = Истина;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ЗаполнитьИменаРеквизитовКодаТовара(КодРазобран = Ложь)
// Определяем структуру результата.
ДанныеКодаТовара = Новый Структура();
ДанныеКодаТовара.Вставить("Разобран", КодРазобран);
ДанныеКодаТовара.Вставить("ОписаниеОшибки");
ДанныеКодаТовара.Вставить("ПредставлениеШтрихкода" , "");
ДанныеКодаТовара.Вставить("ДанныеШтрихкода", Новый Соответствие);
ДанныеКодаТовара.Вставить("ТипИдентификатораТовара"); // Тип идентификатора товара, Перечисление.ТипыИдентификаторовТовараККТ.
ДанныеКодаТовара.Вставить("GTIN"); // GTIN
ДанныеКодаТовара.Вставить("СерийныйНомер"); // Серийный номер с потребительской или групповой обработки.
ДанныеКодаТовара.Вставить("EAN"); // Штрихкод товара преобразованный из GTIN
ДанныеКодаТовара.Вставить("РеквизитКодаТовараHEX"); // Значение реквизита "код товара" , тег 1162 в бинарном виде.
ДанныеКодаТовара.Вставить("РеквизитКодаТовара"); // Значение реквизита "код товара", тег 1162 в BASE64.
ДанныеКодаТовара.Вставить("ИдентифицируетЭкземпляр", Ложь); // Идентификатора товара идентифицирует экземпляр товара.
ДанныеКодаТовара.Вставить("ПотребительскаяУпаковкаТабачнойПродукции", Ложь); // Код идентифицирует единичную упаковку табачной продукции.
ДанныеКодаТовара.Вставить("ШтрихкодBase64"); // Штрихкод в BASE64 для тега 1163
ДанныеКодаТовара.Вставить("НаименованиеРеквизита"); // Наименование реквизита для тега 1163
ДанныеКодаТовара.Вставить("ТехническийКод", Ложь); // Признак технический кода GS1.M
ДанныеКодаТовара.Вставить("ЕстьКриптоХвост", Ложь); // в штрихкоде присутствует криптохвост
ДанныеКодаТовара.Вставить("ПредставлениеШтрихкодаБезКриптоХвоста" , "");
ДанныеКодаТовара.Вставить("ШтрихкодБезКриптоХвоста", ""); // код маркировки без криптохвоста
ДанныеКодаТовара.Вставить("ШтрихкодBase64БезКриптоХвоста", ""); // код маркировки без криптохвоста в формате Base64
ДанныеКодаТовара.Вставить("КриптоХвостBase64", ""); // криптохвост в формате Base64
Возврат ДанныеКодаТовара;
КонецФункции
Функция ТипGS1Число();
Возврат "N";
КонецФункции
Функция ТипGS1Строка();
Возврат "X";
КонецФункции
// Используемые идентификаторы применения по стандарту GS1.
//
Функция ИдентификаторыGS1()
Результат = Новый Структура();
Результат.Вставить("GTIN", "01");
Результат.Вставить("СерийныйНомер", "21");
Результат.Вставить("КлючПроверки" , "91");
Результат.Вставить("КодПроверки" , "92");
Результат.Вставить("КодТНВЭД" , "240");
Результат.Вставить("ЦенаЕдиницыТовара", "8005");
Возврат Результат;
КонецФункции
// АПК: 142-выкл, АПК: 134-выкл обратная совместимость
Процедура ДобавитьКодGS1(Коды, Код, Имя, ФиксированнаяДлина = 0, ПеременнаяДлина = 0, ТипФиксированногоЗначения = Неопределено, ТипПеременногоЗначения = Неопределено, ЕстьРазделитель = Неопределено);
ПараметрыОписанияКода = ПараметрыОписанияКода(ФиксированнаяДлина, ПеременнаяДлина, ЕстьРазделитель);
Если ЗначениеЗаполнено(ТипФиксированногоЗначения) Тогда
ПараметрыОписанияКода.ТипФиксированногоЗначения = ТипФиксированногоЗначения;
КонецЕсли;
Если ЗначениеЗаполнено(ТипПеременногоЗначения) Тогда
ПараметрыОписанияКода.ТипПеременногоЗначения = ТипПеременногоЗначения;
КонецЕсли;
ПоследнийСимволКода = Прав(Код, 1);
Если СтрНайти("0123456789", ПоследнийСимволКода) = 0 Тогда
КодБезПоследнегоСимвола = Лев(Код, СтрДлина(Код) - 1);
Если ПоследнийСимволКода = "n" Тогда
Описание = ОписаниеКода(КодБезПоследнегоСимвола, Имя, ПараметрыОписанияКода);
Описание.ЕстьПоложениеДесятичнойТочки = Истина;
Коды.Вставить(КодБезПоследнегоСимвола, Описание);
Иначе
Для Индекс = 0 По 9 Цикл
НовыйКод = КодБезПоследнегоСимвола + Строка(Индекс);
Коды.Вставить(НовыйКод, ОписаниеКода(НовыйКод, Имя, ПараметрыОписанияКода));
КонецЦикла;
КонецЕсли;
Иначе
Коды.Вставить(Код, ОписаниеКода(Код, Имя, ПараметрыОписанияКода));
КонецЕсли;
КонецПроцедуры
// АПК: 142-вкл, АПК: 134-вкл
Функция ПараметрыОписанияКода(ФиксированнаяДлина = 0, ПеременнаяДлина = 0, ЕстьРазделитель = Неопределено)
ПараметрыОписания = Новый Структура();
ПараметрыОписания.Вставить("ФиксированнаяДлина", ФиксированнаяДлина);
ПараметрыОписания.Вставить("ТипФиксированногоЗначения", ТипGS1Число());
ПараметрыОписания.Вставить("ПеременнаяДлина", ПеременнаяДлина);
ПараметрыОписания.Вставить("ТипПеременногоЗначения", ТипGS1Число());
Если ПеременнаяДлина > 0 Тогда
ПараметрыОписания.Вставить("ЕстьРазделитель", Ложь);
Иначе
ПараметрыОписания.Вставить("ЕстьРазделитель", ЗначениеЗаполнено(ЕстьРазделитель));
КонецЕсли;
Возврат ПараметрыОписания;
КонецФункции
Функция ОписаниеКода(Код, Имя, Параметры);
ОписаниеКода = Новый Структура;
ОписаниеКода.Вставить("Код", Код);
ОписаниеКода.Вставить("Имя", Имя);
ОписаниеКода.Вставить("ФиксированнаяДлина", Параметры.ФиксированнаяДлина);
Если Параметры.ФиксированнаяДлина > 0 Тогда
ОписаниеКода.Вставить("ТипФиксированногоЗначения", Параметры.ТипФиксированногоЗначения);
КонецЕсли;
ОписаниеКода.Вставить("ПеременнаяДлина", Параметры.ПеременнаяДлина);
Если Параметры.ПеременнаяДлина > 0 Тогда
ОписаниеКода.Вставить("ТипПеременногоЗначения", Параметры.ТипПеременногоЗначения);
КонецЕсли;
ОписаниеКода.Вставить("ЕстьРазделитель", ?(Параметры.ПеременнаяДлина > 0, Истина, Параметры.ЕстьРазделитель));
ОписаниеКода.Вставить("ЕстьПоложениеДесятичнойТочки", Ложь);
Возврат ОписаниеКода;
КонецФункции
// Проверяет, содержит ли строка только цифры.
//
// Параметры:
// СтрокаПроверки - Строка - проверяемая строка.
//
// Возвращаемое значение:
// Булево - Истина - Строка содержит только цифры или пустая, Ложь - строка содержит иные символы.
//
Функция ТолькоЦифрыВСтроке(Знач СтрокаПроверки)
Если СтрДлина(СтрокаПроверки) = 0 Тогда
Возврат Истина;
КонецЕсли;
Для Индекс = 1 По СтрДлина(СтрокаПроверки) Цикл
КодСимвола = КодСимвола(Сред(СтрокаПроверки, Индекс, 1));
Если (КодСимвола < 48) Или (КодСимвола > 57) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
// Формирует структуру параметров проверки строки.
//
// Параметры:
// ДопустимыЛатПрописные - Булево
// ДопустимыЛатСтрочные - Булево
// ДопустимыЦифры - Булево
//
// Возвращаемое значение:
// Структура:
// * ДопустимыЛатПрописные - Булево
// * ДопустимыЛатСтрочные - Булево
// * ДопустимыЦифры - Булево
// * ДопустимыеСимволы - Строка
//
Функция ПараметрыПроверкиСтроки(ДопустимыЛатПрописные = Ложь, ДопустимыЛатСтрочные = Ложь, ДопустимыЦифры = Ложь)
ПараметрыПроверкиСтроки = Новый Структура();
ПараметрыПроверкиСтроки.Вставить("ДопустимыЛатПрописные", ДопустимыЛатПрописные);
ПараметрыПроверкиСтроки.Вставить("ДопустимыЛатСтрочные", ДопустимыЛатСтрочные);
ПараметрыПроверкиСтроки.Вставить("ДопустимыЦифры", ДопустимыЦифры);
ПараметрыПроверкиСтроки.Вставить("ДопустимыеСимволы","");
Возврат ПараметрыПроверкиСтроки;
КонецФункции
// Проверяет, содержит ли строка символы по условию.
//
// Параметры:
// СтрокаПроверки - Строка - проверяемая строка.
// ПараметрыПроверки - Структура:
// * ДопустимыЛатПрописные - Булево
// * ДопустимыЛатСтрочные - Булево
// * ДопустимыЦифры - Булево
// * ДопустимыеСимволы - Строка
//
// Возвращаемое значение:
// Булево - Истина - Строка содержит только латинские (или допустимые) символы, иначе строка содержит иные символы.
//
Функция ПроверкаСтроки(Знач СтрокаПроверки, ПараметрыПроверки)
КодыДопустимыхСимволов = Новый Массив;
Для Индекс = 1 По СтрДлина(ПараметрыПроверки.ДопустимыеСимволы) Цикл
КодыДопустимыхСимволов.Добавить(КодСимвола(Сред(ПараметрыПроверки.ДопустимыеСимволы, Индекс, 1)));
КонецЦикла;
Для Индекс = 1 По СтрДлина(СтрокаПроверки) Цикл
КодСимвола = КодСимвола(Сред(СтрокаПроверки, Индекс, 1));
ЭтоЛатПрописная = ?(ПараметрыПроверки.ДопустимыЛатПрописные,(КодСимвола > 64) И (КодСимвола < 91), Ложь);
ЭтоЛатСтрочная = ?(ПараметрыПроверки.ДопустимыЛатСтрочные,(КодСимвола > 96) И (КодСимвола < 123), Ложь);
ЭтоЦифра = ?(ПараметрыПроверки.ДопустимыЦифры, (КодСимвола > 47) И (КодСимвола < 58), Ложь);
Если НЕ (ЭтоЛатПрописная Или ЭтоЛатСтрочная Или ЭтоЦифра Или КодыДопустимыхСимволов.Найти(КодСимвола) <> Неопределено) Тогда
Возврат Ложь;
КонецЕсли;
КонецЦикла;
Возврат Истина;
КонецФункции
// Префикс кодирования реквизита.
//
// Параметры:
// ТипыИдентификаторовТовараККТ - ПеречислениеСсылка.ТипыИдентификаторовТовараККТ - Типы идентификаторов товара ККТ
//
// Возвращаемое значение:
// Число - Префикс кодирования реквизита
//
Функция ПрефиксКодированияРеквизита(Знач ТипыИдентификаторовТовараККТ) ;
Если ТипыИдентификаторовТовараККТ = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараВФормате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 - Код товара, который не распознан.
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура СформироватьДвоичныеДанныеДляЧисла(ДанныеМаркировки, Знач ЗначениеЧисла = Неопределено, Знач ЗначениеСтроки = Неопределено)
Префикс = ПрефиксКодированияРеквизита(ДанныеМаркировки.ТипИдентификатораТовара);
Буфер = Новый БуферДвоичныхДанных(8);
Буфер.ЗаписатьЦелое64(0, Число(ЗначениеЧисла), ПорядокБайтов.BigEndian);
Буфер.ЗаписатьЦелое16(0, Префикс, ПорядокБайтов.BigEndian);
Если Не ПустаяСтрока(ЗначениеСтроки) Тогда
Буфер = Буфер.Соединить(ПолучитьБуферДвоичныхДанныхИзСтроки(ЗначениеСтроки));
КонецЕсли;
ДанныеМаркировки.РеквизитКодаТовараHEX = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Буфер);
ДанныеМаркировки.РеквизитКодаТовара = Base64Строка(ДанныеМаркировки.РеквизитКодаТовараHEX);
КонецПроцедуры
Процедура СформироватьДвоичныеДанныеДляСтроки(ДанныеМаркировки, Знач ЗначениеСтроки = Неопределено)
Префикс = ПрефиксКодированияРеквизита(ДанныеМаркировки.ТипИдентификатораТовара);
ДлинаСтроки = СтрДлина(ЗначениеСтроки);
Позиция = 0;
РазмерБуфера = 2 + ДлинаСтроки;
Буфер = Новый БуферДвоичныхДанных(РазмерБуфера);
Буфер.ЗаписатьЦелое16(Позиция, Префикс, ПорядокБайтов.BigEndian);
Позиция = Позиция + 2;
ИндексСимвола = 1;
Пока ИндексСимвола <= ДлинаСтроки Цикл
ЗначКодСимвола = КодСимвола(ЗначениеСтроки, ИндексСимвола);
Если ЗначКодСимвола < 256 Тогда
Буфер.Установить(Позиция-1 + ИндексСимвола, Число(ЗначКодСимвола));
КонецЕсли;
ИндексСимвола = ИндексСимвола + 1;
КонецЦикла;
ДанныеМаркировки.РеквизитКодаТовараHEX = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(Буфер);
ДанныеМаркировки.РеквизитКодаТовара = Base64Строка(ДанныеМаркировки.РеквизитКодаТовараHEX);
КонецПроцедуры
Процедура СформироватьEAN(ДанныеМаркировки, Знач GTIN)
ДанныеМаркировки.GTIN = GTIN;
Пока СтрДлина(ДанныеМаркировки.GTIN) < 14 Цикл
ДанныеМаркировки.GTIN = "0" + ДанныеМаркировки.GTIN
КонецЦикла;
// Пытаем получить торговый штрихкод EAN8 или EAN13 из GTIN.
ВремGTIN = GTIN;
Если СтрДлина(ВремGTIN) > 13 Тогда
Пока Лев(ВремGTIN, 1) = "0" И СтрДлина(ВремGTIN) > 13 Цикл
ВремGTIN = Сред(ВремGTIN, 2);
КонецЦикла;
КонецЕсли;
Если СтрДлина(ВремGTIN) = 13 И Лев(ВремGTIN, 5) = "00000" Тогда
ВремGTIN = Сред(ВремGTIN, 6);
КонецЕсли;
Если СтрДлина(ВремGTIN) > 8 И СтрДлина(ВремGTIN) < 13 Тогда
Пока Лев(ВремGTIN, 1) = "0" И СтрДлина(ВремGTIN) > 8 Цикл
ВремGTIN = Сред(ВремGTIN, 2);
КонецЦикла;
КонецЕсли;
ДанныеМаркировки.EAN = ВремGTIN;
КонецПроцедуры
Функция КодВФорматеDataMatrix40БезGS(ШтриховойКодТовара, ДанныеКодаТовара)
ДлинаШтрихкода = СтрДлина(ШтриховойКодТовара);
Если ДлинаШтрихкода <> 41
И ДлинаШтрихкода <> 52 Тогда
Возврат Ложь;
КонецЕсли;
ПараметрыПроверкиСтроки = ПараметрыПроверкиСтроки(Истина, Истина, Истина);
ПараметрыПроверкиСтроки.ДопустимыеСимволы = "«!”""%&'()*+-.,/_:;=<>?»";
Если Не ПроверкаСтроки(ШтриховойКодТовара, ПараметрыПроверкиСтроки) Тогда
Возврат Ложь;
КонецЕсли;
Если Лев(ШтриховойКодТовара, 2) <> "01" Тогда
Возврат Ложь;
КонецЕсли;
GTIN = Сред(ШтриховойКодТовара, 3, 14);
Если Сред(ШтриховойКодТовара, 17, 2) <> "21" Тогда
Возврат Ложь;
КонецЕсли;
СерийныйНомер = Сред(ШтриховойКодТовара, 19, 7); // Код идентификации упаковки табачной продукции.
Если Сред(ШтриховойКодТовара, 26, 4) <> "8005" Тогда
Возврат Ложь;
КонецЕсли;
МРЦ = Сред(ШтриховойКодТовара, 30, 6); // ЦРЦ.
Если ДлинаШтрихкода = 52 И Сред(ШтриховойКодТовара, 42, 3) = "240" Тогда
КодТНВЭД = Сред(ШтриховойКодТовара, 45, 8); // КодТНВЭД.
Иначе
КодТНВЭД = "";
КонецЕсли;
Если ТолькоЦифрыВСтроке(GTIN) И МенеджерОборудованияКлиентСервер.РассчитатьКонтрольныйСимволGTIN14(GTIN) = Прав(GTIN, 1) Тогда
ДанныеКодаТовара.ТипИдентификатораТовара = ПредопределенноеЗначение("Перечисление.ТипыИдентификаторовТовараККТ.КодТовараВФорматеDataMatrixGS1");
ДанныеКодаТовара.СерийныйНомер = СерийныйНомер;
СформироватьEAN(ДанныеКодаТовара, GTIN);
// Последующие 11 символов считанной последовательности формируются по правилам интерпретации ASCII в hex
ЗначениеСтроки = СерийныйНомер + МРЦ;
Пока СтрДлина(ЗначениеСтроки) < 13 Цикл
ЗначениеСтроки = ЗначениеСтроки + Символ(32); // Дополняем знаками «20h» в конце (пробелами справа) до 13 байт
КонецЦикла;
СформироватьДвоичныеДанныеДляЧисла(ДанныеКодаТовара, GTIN, ЗначениеСтроки);
ДанныеКодаТовара.Разобран = Истина;
ДанныеКодаТовара.ИдентифицируетЭкземпляр = Истина;
ДанныеКодаТовара.ПотребительскаяУпаковкаТабачнойПродукции = Истина;
ДанныеКодаТовара.НаименованиеРеквизита = "KMK";
ДанныеКодаТовара.ПредставлениеШтрихкода = ШтриховойКодТовара;
ДанныеКодаТовара.ПредставлениеШтрихкодаБезКриптоХвоста = "01"+GTIN + "21"+СерийныйНомер + "8005" + МРЦ;
Если Не ПустаяСтрока(КодТНВЭД) Тогда
ДанныеКодаТовара.ПредставлениеШтрихкодаБезКриптоХвоста = ДанныеКодаТовара.ПредставлениеШтрихкодаБезКриптоХвоста + "240" + КодТНВЭД;
КонецЕсли;
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
#КонецОбласти