1466 lines
113 KiB
Plaintext
1466 lines
113 KiB
Plaintext
#Область ПрограммныйИнтерфейс
|
||
|
||
#Область ФункцииМаркировкиПродукции
|
||
|
||
// Сформировать реквизита кода товар для 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" + КодТНВЭД;
|
||
КонецЕсли;
|
||
Возврат Истина;
|
||
|
||
КонецЕсли;
|
||
Возврат Ложь;
|
||
|
||
КонецФункции
|
||
|
||
#КонецОбласти |