xmlTSDGalery/CommonModules/МенеджерОборудованияМаркировка/Ext/Module.bsl
kykaevv 88098aa86f Initial commit: конфигурация ТСД с обменом УНФ.
Включает перемещение по ячейкам, стикеровку МП, синхронизацию справочников и обработку кодов маркировки.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 12:50:57 +03:00

1107 lines
86 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.

#Область ПрограммныйИнтерфейс
// Возвращает код планируемого статус маркируемого товара
//
// Параметры:
// ПланируемыйСтатусМаркируемогоТовара - ПеречислениеСсылка.ПланируемыйСтатусМаркируемогоТовара - Планируемый статус маркируемого товара.
//
// Возвращаемое значение:
// Число - Код планируемого статус маркируемого товара по ОФД
//
Функция КодПланируемыйСтатусМаркируемогоТовара(ПланируемыйСтатусМаркируемогоТовара) Экспорт
Соответствие = Новый Соответствие();
Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.ШтучныйТоварРеализован") , 1);
Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.МерныйТоварВСтадииРеализации"), 2);
Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.ШтучныйТоварВозвращен") , 3);
Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.ЧастьТовараВозвращена") , 4);
Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ПланируемыйСтатусМаркируемогоТовара.СтатусТовараНеИзменился") , 255);
Возврат Соответствие.Получить(ПланируемыйСтатусМаркируемогоТовара);
КонецФункции
// Возвращает код ответа ОИСМ о статусе товара
//
// Параметры:
// ОтветОИСМОСтатусеТовара - ПеречислениеСсылка.ОтветОИСМОСтатусеТовара - Ответ от ИСМО.
//
// Возвращаемое значение:
// Число - Ответ ОИСМ о статусе товара по ОФД
//
Функция КодОтветаОИСМОСтатусеТовара(ОтветОИСМОСтатусеТовара) Экспорт
Соответствие = Новый Соответствие();
Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ОтветОИСМОСтатусеТовара.ПланируемыйСтатусТовараКорректен") , 1);
Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ОтветОИСМОСтатусеТовара.ПланируемыйСтатусТовараНекорректен"), 2);
Соответствие.Вставить(ПредопределенноеЗначение("Перечисление.ОтветОИСМОСтатусеТовара.ОборотТовараПриостановлен") , 3);
Возврат Соответствие.Получить(ОтветОИСМОСтатусеТовара);
КонецФункции
// Возвращает ответ ОИСМ о статусе товара по коду.
//
// Параметры:
// ОтветОИСМОСтатусеТовара - Число - Ответ от ИСМО.
//
// Возвращаемое значение:
// ПеречислениеСсылка.ОтветОИСМОСтатусеТовара - Ответ ОИСМ.
//
Функция ОтветОИСМОСтатусеТовараПоКоду(ОтветОИСМОСтатусеТовара) Экспорт
Соответствие = Новый Соответствие();
Соответствие.Вставить(1, ПредопределенноеЗначение("Перечисление.ОтветОИСМОСтатусеТовара.ПланируемыйСтатусТовараКорректен"));
Соответствие.Вставить(2, ПредопределенноеЗначение("Перечисление.ОтветОИСМОСтатусеТовара.ПланируемыйСтатусТовараНекорректен"));
Соответствие.Вставить(3, ПредопределенноеЗначение("Перечисление.ОтветОИСМОСтатусеТовара.ОборотТовараПриостановлен"));
Возврат Соответствие.Получить(ОтветОИСМОСтатусеТовара);
КонецФункции
// Возвращает код типа маркировки ККТ по коду.
//
// Параметры:
// ТипМаркировкиККТ - ПеречислениеСсылка.ТипыМаркировкиККТ - Тип маркировки ККТ.
//
// Возвращаемое значение:
// Строка, Произвольный - Код типа маркировки ККТ
Функция КодТипаМаркировкиККТ(ТипМаркировкиККТ) Экспорт
ТипыМаркировкиККТ = Новый Соответствие();
ТипыМаркировкиККТ.Вставить(ПредопределенноеЗначение("Перечисление.ТипыМаркировкиККТ.ИзделияИзМеха") , "02");
ТипыМаркировкиККТ.Вставить(ПредопределенноеЗначение("Перечисление.ТипыМаркировкиККТ.ЛекарственныеПрепараты"), "03");
ТипыМаркировкиККТ.Вставить(ПредопределенноеЗначение("Перечисление.ТипыМаркировкиККТ.ТабачнаяПродукция") , "05");
ТипыМаркировкиККТ.Вставить(ПредопределенноеЗначение("Перечисление.ТипыМаркировкиККТ.ОбувныеТовары") , "1520");
Возврат ТипыМаркировкиККТ.Получить(ТипМаркировкиККТ);
КонецФункции
// Возвращает код типа маркировки ККТ.
//
// Параметры:
// КодТипМаркировкиККТ - Число - Код тип маркировки ККТ
//
// Возвращаемое значение:
// Произвольный, ПеречислениеСсылка.ТипыМаркировкиККТ - Тип маркировки ККТПо коду
Функция ТипМаркировкиККТПоКоду(КодТипМаркировкиККТ) Экспорт
ТипыМаркировкиККТ = Новый Соответствие();
ТипыМаркировкиККТ.Вставить("02" , ПредопределенноеЗначение("Перечисление.ТипыМаркировкиККТ.ИзделияИзМеха"));
ТипыМаркировкиККТ.Вставить("03" , ПредопределенноеЗначение("Перечисление.ТипыМаркировкиККТ.ЛекарственныеПрепараты"));
ТипыМаркировкиККТ.Вставить("05" , ПредопределенноеЗначение("Перечисление.ТипыМаркировкиККТ.ТабачнаяПродукция"));
ТипыМаркировкиККТ.Вставить("1520", ПредопределенноеЗначение("Перечисление.ТипыМаркировкиККТ.ОбувныеТовары"));
Возврат ТипыМаркировкиККТ.Получить(КодТипМаркировкиККТ);
КонецФункции
// Возвращает статус результата запроса КМ по коду.
//
// Параметры:
// КодСтатуса - Число - Код статуса.
//
// Возвращаемое значение:
// Произвольный, ПеречислениеСсылка.СтатусРезультатаЗапросаКМ - Статус результата запроса КМПо коду
Функция СтатусРезультатаЗапросаКМПоКоду(КодСтатуса) Экспорт
РезультатЗапроса = Новый Соответствие();
РезультатЗапроса.Вставить(0, ПредопределенноеЗначение("Перечисление.СтатусРезультатаЗапросаКМ.Получен"));
РезультатЗапроса.Вставить(1, ПредопределенноеЗначение("Перечисление.СтатусРезультатаЗапросаКМ.Ожидается"));
РезультатЗапроса.Вставить(2, ПредопределенноеЗначение("Перечисление.СтатусРезультатаЗапросаКМ.НеМожетБытьПолучен"));
Возврат РезультатЗапроса.Получить(Число(КодСтатуса));
КонецФункции
// Возвращает, для каких типов идентификаторов будет заполняться код товара.
//
// Возвращаемое значение:
// Массив из ПеречислениеСсылка.ТипыИдентификаторовТовараККТ
//
Функция КодТовараЗаполняетсяДляТиповИдентификаторов() Экспорт;
ТипыИдентификаторов = Новый Массив();
ТипыИдентификаторов.Добавить(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеЕГАИС2);
ТипыИдентификаторов.Добавить(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеЕГАИС3);
ТипыИдентификаторов.Добавить(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеDataMatrixGS1);
ТипыИдентификаторов.Добавить(Перечисления.ТипыИдентификаторовТовараККТ.ИзделияИзНатуральногоМеха);
ТипыИдентификаторовОбработка = ТипыИдентификаторов;
ВыполненаСтандартнаяОбработка = Истина;
МенеджерОборудованияВызовСервераПереопределяемый.КодТовараЗаполняетсяДляТиповИдентификаторов(ТипыИдентификаторовОбработка, ВыполненаСтандартнаяОбработка);
Если ВыполненаСтандартнаяОбработка Тогда
Результат = ТипыИдентификаторов
Иначе
Результат = ТипыИдентификаторовОбработка
КонецЕсли;
Возврат Результат;
КонецФункции
// Идентифицирует ли код товара (значение тега 1162) экземпляр товара.
//
// Параметры:
// РеквизитКодаТовара - Строка - Значение реквизита кода товара в BASE64.
// ШтриховойКодТовара - Строка - Штриховой код товара.
//
// Возвращаемое значение:
// Булево - Истина - Если код товара идентифицирует экземпляр товара.
//
Функция КодТовараИдентифицируетЭкземпляр(Знач РеквизитКодаТовара = Неопределено, Знач ШтриховойКодТовара = Неопределено) Экспорт
Результат = Ложь;
// Если реквизит кода товара (1162) не передается в готовом виде
Если ПустаяСтрока(РеквизитКодаТовара) Тогда
МодульМенеджерОборудованияМаркировкаКлиентСервер = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировкаКлиентСервер");
ДанныеКодаТовара = МодульМенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(ШтриховойКодТовара);
РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
КонецЕсли;
Если НЕ ПустаяСтрока(РеквизитКодаТовара) Тогда
ТипыИдентификаторов = КодТовараЗаполняетсяДляТиповИдентификаторов();
НачалоРеквизитКодаТовара = Лев(РеквизитКодаТовара, 3);
Если НачалоРеквизитКодаТовара = "RE0" Тогда // GS1 Data Matrix или Data Matrix - Если первые 2 байта значения кода товара имеют значения "44h4Dh".
Результат = ТипыИдентификаторов.Найти(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеDataMatrixGS1) <> Неопределено;
ИначеЕсли НачалоРеквизитКодаТовара = "UkZ" Тогда // Меховые изделия - Если первые 2 байта значения кода товара имеют значения "52h46h".
Результат = ТипыИдентификаторов.Найти(Перечисления.ТипыИдентификаторовТовараККТ.ИзделияИзНатуральногоМеха) <> Неопределено;
ИначеЕсли НачалоРеквизитКодаТовара = "xRR" Тогда // ЕГАИС 2.0 - Если первые 2 байта значения кода товара имеют значения "C5h14h".
Результат = ТипыИдентификаторов.Найти(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеЕГАИС2) <> Неопределено;
ИначеЕсли НачалоРеквизитКодаТовара = "xR4" Тогда // ЕГАИС 3.0 - Если первые 2 байта значения кода товара имеют значения "C5h1Eh".
Результат = ТипыИдентификаторов.Найти(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеЕГАИС3) <> Неопределено;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
#Область ФормированиеДанныхККТ
// Сформировать XML для запроса КМ.
//
// Параметры:
// ПараметрыОперации - Структура - Параметры операции.
//
// Возвращаемое значение:
// Строка
//
Функция СформироватьXMLДляЗапросаКМ(ПараметрыОперации, РевизияИнтерфейса = 0) Экспорт
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("RequestKM");
ИдентификаторЗапроса = ПараметрыОперации.ИдентификаторЗапроса;
Если ПустаяСтрока(ИдентификаторЗапроса) Тогда
ИдентификаторЗапроса = Новый УникальныйИдентификатор;
КонецЕсли;
ЗаписьXML.ЗаписатьАтрибут("GUID", XMLСтрока(ИдентификаторЗапроса));
ЗаписьXML.ЗаписатьАтрибут("WaitForResult", ?(ПараметрыОперации.ОжидатьПолучениеОтветаОИСМ, "True", "False"));
ЗаписьXML.ЗаписатьАтрибут("NotSendToServer", ?(НЕ ПараметрыОперации.ОтправлятьНаСерверОИСМ, "True", "False"));
ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ПараметрыОперации.КонтрольнаяМарка));
ПланируемыйСтатусТовара = КодПланируемыйСтатусМаркируемогоТовара(ПараметрыОперации.ПланируемыйСтатусТовара);
ЗаписьXML.ЗаписатьАтрибут("PlannedStatus", XMLСтрока(ПланируемыйСтатусТовара));
ДробноеКоличествоУказано = Ложь;
ДробноеКоличество = ПараметрыОперации.ДробноеКоличество;
Если Не ПустаяСтрока(ДробноеКоличество.Числитель) И Не ПустаяСтрока(ДробноеКоличество.Знаменатель) Тогда
Если Число(ДробноеКоличество.Числитель) > 0 И Число(ДробноеКоличество.Знаменатель) > 0 Тогда
ДробноеКоличествоУказано = Истина;
КонецЕсли;
КонецЕсли;
Если РевизияИнтерфейса >= 4001 Тогда
// Приказ ФНС России от 12.04.2023 N ЕД-7-20/239@
Если ПараметрыОперации.Количество <> 1 Тогда
ЗаписьXML.ЗаписатьАтрибут("Quantity", XMLСтрока(ПараметрыОперации.Количество)); // тег 1023
КонецЕсли;
Если ПланируемыйСтатусТовара = 2 Или ПланируемыйСтатусТовара = 4 Тогда
Если ДробноеКоличествоУказано Тогда
МераКоличестваПредметаРасчета = 0 ;
ЗаписьXML.ЗаписатьАтрибут("MeasureOfQuantity", XMLСтрока(МераКоличестваПредметаРасчета));
ЗаписьXML.ЗаписатьНачалоЭлемента("FractionalQuantity");
ЗаписьXML.ЗаписатьАтрибут("Numerator", XMLСтрока(ДробноеКоличество.Числитель));
ЗаписьXML.ЗаписатьАтрибут("Denominator", XMLСтрока(ДробноеКоличество.Знаменатель));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли
КонецЕсли;
Если Не ПустаяСтрока(ПараметрыОперации.КодЕдиницыИзмерения) Тогда
МераКоличестваПредметаРасчета = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.МераКоличестваПредметаРасчетаПоКодуЕдиницыИзмерения(ПараметрыОперации.КодЕдиницыИзмерения)
Иначе
МераКоличестваПредметаРасчета = ПараметрыОперации.МераКоличестваПредметаРасчета;
КонецЕсли;
Если Не ПустаяСтрока(МераКоличестваПредметаРасчета) И НЕ (МераКоличестваПредметаРасчета = 0) Тогда // тег 2108
МераКоличестваПредметаРасчета = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.КодМерыКоличестваПредметаРасчетаККТ(МераКоличестваПредметаРасчета);
ЗаписьXML.ЗаписатьАтрибут("MeasureOfQuantity", XMLСтрока(МераКоличестваПредметаРасчета));
КонецЕсли;
Иначе
// Реквизиты "количество предмета расчета" (тег 1023) и "мера количества предмета расчета" (тег 2108) включаются в состав запроса о коде маркировки
// в случае, если реквизит "планируемый статус товара" (тег 2003) принимает значения "2" или "4".
Если ПланируемыйСтатусТовара = 2 Или ПланируемыйСтатусТовара = 4 Тогда
ЗаписьXML.ЗаписатьАтрибут("Quantity", XMLСтрока(ПараметрыОперации.Количество)); // тег 1023
Если ДробноеКоличествоУказано Тогда
МераКоличестваПредметаРасчета = 0 ;
ЗаписьXML.ЗаписатьАтрибут("MeasureOfQuantity", XMLСтрока(МераКоличестваПредметаРасчета));
ЗаписьXML.ЗаписатьНачалоЭлемента("FractionalQuantity");
ЗаписьXML.ЗаписатьАтрибут("Numerator", XMLСтрока(ДробноеКоличество.Числитель));
ЗаписьXML.ЗаписатьАтрибут("Denominator", XMLСтрока(ДробноеКоличество.Знаменатель));
ЗаписьXML.ЗаписатьКонецЭлемента();
Иначе
Если Не ПустаяСтрока(ПараметрыОперации.КодЕдиницыИзмерения) Тогда
МераКоличестваПредметаРасчета = ОборудованиеЧекопечатающиеУстройстваРФКлиентСервер.МераКоличестваПредметаРасчетаПоКодуЕдиницыИзмерения(ПараметрыОперации.КодЕдиницыИзмерения)
Иначе
МераКоличестваПредметаРасчета = ПараметрыОперации.МераКоличестваПредметаРасчета;
КонецЕсли;
Если Не ПустаяСтрока(МераКоличестваПредметаРасчета) Тогда // тег 2108
МераКоличестваПредметаРасчета = ОборудованиеЧекопечатающиеУстройстваРФКлиентСервер.КодМерыКоличестваПредметаРасчетаККТ(МераКоличестваПредметаРасчета);
ЗаписьXML.ЗаписатьАтрибут("MeasureOfQuantity", XMLСтрока(МераКоличестваПредметаРасчета));
КонецЕсли;
КонецЕсли
КонецЕсли;
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
Возврат ЗаписьXML.Закрыть();
КонецФункции
// Получить результаты запроса КМ из XML пакета.
//
// Параметры:
// ДанныеXML - Строка - XML.
//
// Возвращаемое значение:
// Структура - Получить результаты запроса КМИз XMLПакета:
// * КодМаркировкиПроверен - Булево -
// * РезультатПроверки - Булево -
Функция ПолучитьРезультатыЗапросаКМИзXMLПакетаанныеXML) Экспорт
Параметры = Новый Структура();
Параметры.Вставить("КодМаркировкиПроверен", Ложь);
Параметры.Вставить("РезультатПроверки", Ложь);
Если Не ПустаяСтрока(ДанныеXML) Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ДанныеXML);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.Имя = "RequestKMResult" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Параметры.КодМаркировкиПроверен = ВРег(ЧтениеXML.ЗначениеАтрибута("Checking")) = "TRUE";
Параметры.РезультатПроверки = ВРег(ЧтениеXML.ЗначениеАтрибута("CheckingResult")) = "TRUE";
КонецЕсли;
КонецЕсли;
Возврат Параметры;
КонецФункции
// Получить результаты запроса ОИСМ КМ из XML пакета.
//
// Параметры:
// ДанныеXML - Строка - XML.
// Параметры - Неопределено - Параметры
//
// Возвращаемое значение:
// Неопределено, Структура - Получить результаты ОИСМКМИз XMLПакета:
// * ИдентификаторЗапроса - УникальныйИдентификатор.
// * СтатусРезультата - ПеречислениеСсылка.СтатусРезультатаЗапросаКМ.
// * РезультатПроверкиОИСМ - Булево -
// * КодРезультатаПроверкиОИСМ - Число -
// * РезультатПроверкиОИСМПредставление - Строка -
// * РезультатПроверкиСведенийОТоваре - Булево
// * РезультатПроверкиСведенийОТовареПФ - Булево
// * КодОбработкиЗапроса - Число
// * СтатусОбработкиЗапроса - ПеречислениеСсылка.СтатусОбработкиЗапросаКМ.
// * СтатусТовара - Неопределено -
Функция ПолучитьРезультатыОИСМКМИзXMLПакетаанныеXML, Параметры = Неопределено) Экспорт
Если Параметры = Неопределено Тогда
Параметры = Новый Структура();
КонецЕсли;
Параметры.Вставить("ИдентификаторЗапроса");
Параметры.Вставить("СтатусРезультата");
Параметры.Вставить("РезультатПроверкиОИСМ", Ложь);
Параметры.Вставить("КодРезультатаПроверкиОИСМ", 0);
Параметры.Вставить("РезультатПроверкиОИСМПредставление", "00000000");
Параметры.Вставить("РезультатПроверкиСведенийОТоваре");
Параметры.Вставить("РезультатПроверкиСведенийОТовареПФ");
Параметры.Вставить("КодОбработкиЗапроса");
Параметры.Вставить("СтатусОбработкиЗапроса");
Параметры.Вставить("СтатусТовара", Неопределено);
Если Не ПустаяСтрока(ДанныеXML) Тогда
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ДанныеXML);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.Имя = "ProcessingKMResult" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Параметры.РезультатПроверкиОИСМ = ВРег(ЧтениеXML.ЗначениеАтрибута("Result")) = "TRUE";
Параметры.КодРезультатаПроверкиОИСМ = ЧтениеXML.ЗначениеАтрибута("ResultCode");
Если ЧтениеXML.ЗначениеАтрибута("ResultCode") <> Неопределено Тогда
Параметры.КодРезультатаПроверкиОИСМ = Число(ЧтениеXML.ЗначениеАтрибута("ResultCode"));
Параметры.РезультатПроверкиОИСМПредставление = МенеджерОборудованияКлиентСервер.ПреобразоватьЧислоВБинарнуюСтроку(Параметры.КодРезультатаПроверкиОИСМ, 8);
КонецЕсли;
Если ЧтениеXML.ЗначениеАтрибута("StatusInfo") <> Неопределено Тогда
СтатусТовара = Число(ЧтениеXML.ЗначениеАтрибута("StatusInfo"));
Параметры.СтатусТовара = ОтветОИСМОСтатусеТовараПоКоду(СтатусТовара);
КонецЕсли;
Параметры.ИдентификаторЗапроса = ЧтениеXML.ЗначениеАтрибута("GUID");
КодОбработкиЗапроса = ЧтениеXML.ЗначениеАтрибута("HandleCode");
Если Не ПустаяСтрока(КодОбработкиЗапроса) Тогда
Параметры.КодОбработкиЗапроса = Число(КодОбработкиЗапроса);
Параметры.СтатусОбработкиЗапроса = СтатусОбработкиЗапросаКМПоКоду(Параметры.КодОбработкиЗапроса);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Параметры.РезультатПроверкиСведенийОТоваре = РезультатПроверкиСведенийОТоваре(Параметры.РезультатПроверкиОИСМПредставление);
Параметры.РезультатПроверкиСведенийОТовареПФ = РезультатПроверкиСведенийОТовареПФ(Параметры.РезультатПроверкиОИСМПредставление);
Возврат Параметры;
КонецФункции
#КонецОбласти
#Область ЛогированиеОперацийПроверкиКМ
// Возвращает структуру для формирования записи в журнале логирования операций проверки кода маркировки
//
// Возвращаемое значение:
// Структура:
// * Наименование - Строка - наименование товара
// * КонтрольнаяМарка - Строка - контрольная марка в виде Base64
// * ЗапросРазрешенияПродажиКМ - Булево - выполнялся запрос разрешения продажи
// * АдресСервераЗапросаРазрешения - Строка - адрес сервера где выполняется запрос разрешения
// * ТекстЗапросаРазрешения - Строка - текст запроса для получения разрешения
// * КодОтветаРазрешения - Строка - код ответа который получен от удаленного сервера, если код не задан, а значение флага
// ЗапросРазрешенияПродажиКМ установлено в Истина, тогда код будет содержать текст Таймаут
// * РезультатЗапросаРазрешения - Строка - JSON - строка, ответ от удаленного сервера ГИС МТ
// * ИдентификаторЗапросаРазрешения - Строка - идентификатор запроса полученного разрешения
// * ВремяЗапросаРазрешения - Строка, Дата, Неопределено - таймштамп полученный с удаленного сервера
// * ПродажаРазрешена - Булево - флаг указывающий, что продажа разрешена, на форме записи будет отображение, что продажа разрешена.
// * ПричинаЗапрета - Строка - Причина запрета продажи, для отображения на форме записи
// * ДополнительныеСведения - Массив из см. ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ДополнительноеСведениеЗапросаКМ
//
Функция ПараметрыЗаписиОперацииПроверкиКМ() Экспорт
Результат = Новый Структура();
Результат.Вставить("Наименование", "");
Результат.Вставить("КонтрольнаяМарка", "");
Результат.Вставить("ЗапросРазрешенияПродажиКМ", Истина);
Результат.Вставить("АдресСервераЗапросаРазрешения", "");
Результат.Вставить("ТекстЗапросаРазрешения", "");
Результат.Вставить("КодОтветаРазрешения", "");
Результат.Вставить("РезультатЗапросаРазрешения", "");
Результат.Вставить("ИдентификаторЗапросаРазрешения", "");
Результат.Вставить("ВремяЗапросаРазрешения", Неопределено);
Результат.Вставить("ПродажаРазрешена", Ложь);
Результат.Вставить("ПричинаЗапрета", "");
Результат.Вставить("ДополнительныеСведения", Новый Массив);
Возврат Результат;
КонецФункции
// Процедура добавляет в журнал операций проверки контрольной марки, операцию по проверке КМ на сервере ГИС МТ
//
// Параметры:
// ПараметрыЗаписиОперации - см. ПараметрыЗаписиОперацииПроверкиКМ
//
Процедура ДобавитьЗаписьВЖурналОперацийПроверкиКМ(ПараметрыЗаписиОперации) Экспорт
МассивЗаписей = Новый Массив();
ПараметрыЗаписи = РегистрыСведений.ОперацииПроверкиКМ.ПараметрыЗаписиРезультатаПроверкиКМ();
ПараметрыЗаписи.Ключ.ИдентификаторСессии = Новый УникальныйИдентификатор();
ПараметрыЗаписи.Ключ.ИдентификаторЗапроса = Новый УникальныйИдентификатор();
ЗапросКМ = ОборудованиеЧекопечатающиеУстройстваКлиентСервер.ПараметрыЗапросКМ();
ЗаполнитьЗначенияСвойств(ЗапросКМ, ПараметрыЗаписиОперации);
ПараметрыЗаписи.ЗапросКМ = ЗапросКМ;
ПараметрыЗаписи.ФлагиПроверкиОИСМ = "";
ПараметрыЗаписи.ЛокальныйОтветXML = "";
ПараметрыЗаписи.УдаленныйОтветXML = "";
ПараметрыЗаписи.ПокупкаПодтверждена = Истина;
МассивЗаписей.Добавить(ПараметрыЗаписи);
РегистрыСведений.ОперацииПроверкиКМ.ДобавитьРезультатыПроверкиКодаМаркировкиВРегистр(МассивЗаписей);
КонецПроцедуры
// Возвращает параметры записи результата проверки ЕГАИС в журнал проверки кода маркировки
//
// Возвращаемое значение:
// Структура:
// * ИдентификаторФискальнойОперации - Строка - guid идентификатор фискальной операции
// * Выполнено - Булево - результат операции выполнен
// * ШтрихкодыПродукции - Соответствие из КлючИЗначение:
// ** Ключ - Строка - марка в base64
// ** Значение - Структура :
// *** Наименование - Строка - наименование продукции
// * ИдентификаторЗапроса - Строка - Идентификатор запроса ЕГАИС
// * ВходящееСообщение - ОпределяемыйТип.СообщениеЕГАИСвБПО - тип сообщения ЕГАИС
// * ИсходящееСообщение - ОпределяемыйТип.СообщениеЕГАИСвБПО - тип сообщения ЕГАИС
// * СообщениеПередано - Булево - флаг того что сообщение передано успешно
// * ТекстОшибки - Строка
// * ПодписьЧека - Строка
//
Функция ПараметрыЗаписиРезультатаПроверкиЕГАИС() Экспорт
Возврат РегистрыСведений.ОперацииПроверкиКМ.ПараметрыЗаписиРезультатаПроверкиЕГАИС();
КонецФункции
// Выполняет запись в журнал операций проверки КМ
//
// Параметры:
// ПараметрыЗаписи - см. ПараметрыЗаписиРезультатаПроверкиЕГАИС
//
Процедура ДобавитьРезультатыОтправкиЕГАИС(ПараметрыЗаписи) Экспорт
РегистрыСведений.ОперацииПроверкиКМ.ДобавитьРезультатыОтправкиЕГАИС(ПараметрыЗаписи);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
#Область ФормированиеДанныхККТ
// Выполняет запись о маркировке в XML для отправки на фискальный регистратор
Процедура ЗаписатьДанныеКодаТоварнойНоменклатуры(ЗаписьXML, Позиция, ПараметрыФискализации) Экспорт
ДанныеКодаТоварнойНоменклатуры = Позиция.ДанныеКодаТоварнойНоменклатуры;
ДанныеКодаТовара = Неопределено;
// Код товара заполняемся для "товара" для ФФД 1.1
Если ПараметрыФискализации.РевизияИнтерфейса < 3004
И Позиция.ПризнакПредметаРасчета <> Перечисления.ПризнакиПредметаРасчета.Товар
И Позиция.ПризнакПредметаРасчета <> Перечисления.ПризнакиПредметаРасчета.ПодакцизныйТовар Тогда
Возврат;
КонецЕсли;
// Требования к разработке драйверов подключаемого оборудования, версия 3.2 и выше.
Если ПараметрыФискализации.РевизияИнтерфейса > 3001 Тогда
МодульМенеджерОборудованияМаркировкаКлиентСервер = ОбщегоНазначенияБПО.ОбщийМодуль("МенеджерОборудованияМаркировкаКлиентСервер");
Если НЕ ПустаяСтрока(Позиция.КодВидаНоменклатурнойКлассификации) Тогда
ДанныеКодаТовара = МодульМенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.КодВидаНоменклатурнойКлассификации);
РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
ИначеЕсли НЕ ПустаяСтрока(Позиция.ШтрихкодBase64) Тогда
ДанныеКодаТовара = МодульМенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.ШтрихкодBase64, Истина);
РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
Иначе
ДанныеКодаТовара = МодульМенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.Штрихкод);
РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
КонецЕсли;
ТипыИдентификаторов = КодТовараЗаполняетсяДляТиповИдентификаторов();
Если ПараметрыФискализации.РевизияИнтерфейса > 3003 Тогда // 3.4 и выше
// ФФД 1.2
Если (НЕ ПустаяСтрока(РеквизитКодаТовара) И НЕ ПустаяСтрока(ДанныеКодаТовара.ШтрихкодBase64)) Тогда // Запись тега 1163
Если ПустаяСтрока(Позиция.КонтрольнаяМарка) И ТипыИдентификаторов.Найти(ДанныеКодаТовара.ТипИдентификатораТовара)<> Неопределено Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
Если ДанныеКодаТовара.ТипИдентификатораТовара = Перечисления.ТипыИдентификаторовТовараККТ.ИзделияИзНатуральногоМеха Тогда
ЗаписьXML.ЗаписатьАтрибут(ДанныеКодаТовара.НаименованиеРеквизита, XMLСтрока(МенеджерОборудованияКлиентСервер.Base64ВШтрихкод(ДанныеКодаТовара.ШтрихкодBase64)));
// Заполнение отраслевых реквизитов в соответствии с требованиями ЦРПТ по ТипИдентификатораТовара
ЗаполнитьОтраслевойРеквизитИзделияИзНатуральногоМеха(Позиция);
ИначеЕсли ДанныеКодаТовара.ТипИдентификатораТовара = Перечисления.ТипыИдентификаторовТовараККТ.КодТовараНеРаспознан Тогда
ЗаписьXML.ЗаписатьАтрибут(ДанныеКодаТовара.НаименованиеРеквизита, XMLСтрока(ДанныеКодаТовара.ШтрихкодBase64));
Иначе
ШтрихкодBase64 = ШтрихкодДляТега1163Base64(ДанныеКодаТовара);
ЗаписьXML.ЗаписатьАтрибут(ДанныеКодаТовара.НаименованиеРеквизита, XMLСтрока(ШтрихкодBase64));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЕсли;
Если ДанныеКодаТовара.ТипИдентификатораТовара = Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеDataMatrixGS1 И ДанныеКодаТовара.ТехническийКод Тогда
ЗаполнитьОтраслевойРеквизитМолочнаяПродукцияСНечитаемымиКМ(Позиция);
КонецЕсли;
Иначе
// ФФД 1.1
ТипыТоваров = ОборудованиеЧекопечатающиеУстройства.ОтраслевойРеквизитЗаполняетсяДляТиповТоваров();
ФормироватьРеквизитКодаТовара = Ложь;
НачалоРеквизитКодаТовара = Лев(РеквизитКодаТовара, 3);
Если НЕ ПустаяСтрока(Позиция.КодВидаНоменклатурнойКлассификации) Тогда // СИЗ
ФормироватьРеквизитКодаТовара = Истина
ИначеЕсли НачалоРеквизитКодаТовара = "RQg" Тогда // EAN8 - Если первые 2 байта значения кода товара имеют значения "45h08h".
ФормироватьРеквизитКодаТовара = ТипыИдентификаторов.Найти(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеEAN8) <> Неопределено;
ФормироватьРеквизитКодаТовара = ФормироватьРеквизитКодаТовара И Позиция.ОбъемноСортовойУчет И ТипыТоваров.ОбъемноСортовойУчет;
ИначеЕсли НачалоРеквизитКодаТовара = "RQ0" Тогда // EAN13 - Если первые 2 байта значения кода товара имеют значения "45h0Dh".
ФормироватьРеквизитКодаТовара = ТипыИдентификаторов.Найти(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеEAN8) <> Неопределено;
// Формируем 1162 только товаров объемно-сортовой учета, если заполняем отраслевой реквизит.
ФормироватьРеквизитКодаТовара = ФормироватьРеквизитКодаТовара И Позиция.ОбъемноСортовойУчет И ТипыТоваров.ОбъемноСортовойУчет;
ИначеЕсли НачалоРеквизитКодаТовара = "SQ4" Тогда // ITF-14 - Если первые 2 байта значения кода товара имеют значения "49h0Eh".
ФормироватьРеквизитКодаТовара = ТипыИдентификаторов.Найти(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеITF14) <> Неопределено;
ИначеЕсли НачалоРеквизитКодаТовара = "RE0" Тогда // GS1 Data Matrix или Data Matrix - Если первые 2 байта значения кода товара имеют значения "44h4Dh".
ФормироватьРеквизитКодаТовара = ТипыИдентификаторов.Найти(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеDataMatrixGS1) <> Неопределено;
ИначеЕсли НачалоРеквизитКодаТовара = "UkZ" Тогда // Меховые изделия - Если первые 2 байта значения кода товара имеют значения "52h46h".
ФормироватьРеквизитКодаТовара = ТипыИдентификаторов.Найти(Перечисления.ТипыИдентификаторовТовараККТ.ИзделияИзНатуральногоМеха) <> Неопределено;
// Формируем 1162 для изделия из натурального меха, если заполняем отраслевой реквизит.
ФормироватьРеквизитКодаТовара = ФормироватьРеквизитКодаТовара И ТипыТоваров.ИзделияИзНатуральногоМеха;
ИначеЕсли НачалоРеквизитКодаТовара = "xRR" Тогда // ЕГАИС 2.0 - Если первые 2 байта значения кода товара имеют значения "C5h14h".
ФормироватьРеквизитКодаТовара = ТипыИдентификаторов.Найти(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеЕГАИС2) <> Неопределено;
ИначеЕсли НачалоРеквизитКодаТовара = "xR4" Тогда // ЕГАИС 3.0 - Если первые 2 байта значения кода товара имеют значения "C5h1Eh".
ФормироватьРеквизитКодаТовара = ТипыИдентификаторов.Найти(Перечисления.ТипыИдентификаторовТовараККТ.КодТовараВФорматеЕГАИС3) <> Неопределено;
КонецЕсли;
Если Не ФормироватьРеквизитКодаТовара Тогда
Возврат;
КонецЕсли;
// Если первые 2 байта значения кода товара имеют значения "00h00h" в автономном режиме реквизит не включается.
Если ПараметрыФискализации.АвтономныйРежим И Лев(РеквизитКодаТовара, 2) = "AA" Тогда
Возврат;
КонецЕсли;
// Реквизит кода товара (1162) для стандарта 3.2 и выше в ККТ передается в готовом виде.
Если НЕ ПустаяСтрока(РеквизитКодаТовара) Тогда
ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(РеквизитКодаТовара));
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецЕсли
Иначе
// Требования к разработке драйверов подключаемого оборудования, версия 3.1 и ниже.
Если ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.ТипМаркировки) Тогда // Необходимо всегда указывать тип маркировки.
Возврат;
КонецЕсли;
Если ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.КонтрольныйИдентификационныйЗнак)
И ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.ГлобальныйИдентификаторТорговойЕдиницы)
И ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.СерийныйНомер)Тогда
Возврат;
КонецЕсли;
ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
Если Не ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.ТипМаркировки) Тогда // Тип маркировки.
ТипМаркировки = КодТипаМаркировкиККТ(ДанныеКодаТоварнойНоменклатуры.ТипМаркировки);
ЗаписьXML.ЗаписатьАтрибут("StampType", XMLСтрока(ТипМаркировки));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.КонтрольныйИдентификационныйЗнак) Тогда // Контрольный идентификационный знак (КиЗ).
ЗаписьXML.ЗаписатьАтрибут("Stamp" , XMLСтрока(ДанныеКодаТоварнойНоменклатуры.КонтрольныйИдентификационныйЗнак));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.ГлобальныйИдентификаторТорговойЕдиницы) Тогда // Глобальный идентификатор торговой единицы (GTIN).
ЗаписьXML.ЗаписатьАтрибут("GTIN" , XMLСтрока(ДанныеКодаТоварнойНоменклатуры.ГлобальныйИдентификаторТорговойЕдиницы));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.СерийныйНомер) Тогда // Серийный номер.
ЗаписьXML.ЗаписатьАтрибут("SerialNumber" , XMLСтрока(ДанныеКодаТоварнойНоменклатуры.СерийныйНомер));
КонецЕсли;
Если Не ПустаяСтрока(ДанныеКодаТоварнойНоменклатуры.РеквизитКодаТовара) Тогда // Реквизит кода товара.
ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(ДанныеКодаТоварнойНоменклатуры.РеквизитКодаТовара));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ЛогированиеПроверкиКМ
// Подготавливает отображение информации в форме списка операций проверки КМ
Процедура ПриПолученииДанныхСпискаОперацийПроверкиКМ(ИмяЭлемента, Настройки, Строки) Экспорт
ТаблицаПроверкиСведенийОТовареПФ = МенеджерОборудованияМаркировка.ТаблицаПроверкиСведенийОТовареПФ();
ТаблицаКодовОтветаГИСМТ = ТаблицаКодовОтветаГИСМТ();
МассивШтрихкодов = Новый Массив();
Для Каждого Строка Из Строки Цикл
Данные = Строка.Значение.Данные;
Если Не ПустаяСтрока(Данные.ФлагиПроверкиОИСМ) Тогда
Данные.РезультатПроверкиОИСМ = ТаблицаПроверкиСведенийОТовареПФ[Данные.ФлагиПроверкиОИСМ];
КонецЕсли;
Результат = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Данные.КодМаркировки, Истина);
Если Результат.Разобран Тогда
Данные.ТипКода = Результат.ТипИдентификатораТовара;
Иначе
Данные.ТипКода = Результат.ТипИдентификатораТовара;
КонецЕсли;
Если МассивШтрихкодов.Найти(Данные.Штрихкод) = Неопределено Тогда
МассивШтрихкодов.Добавить(Данные.Штрихкод);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Возвращает таблицу кодов ответа ГИСМТ
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - Число
// * Значение - Строка
//
Функция ТаблицаКодовОтветаГИСМТ() Экспорт
ТаблицаРезультатов = Новый Соответствие();
ТаблицаРезультатов.Вставить(Неопределено, ""); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить(0, НСтр("ru = 'Таймаут'")); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить(401, НСтр("ru = 'Ошибка авторизации'")); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить(203, НСтр("ru = 'Аварийная ситуация'")); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить(429, НСтр("ru = 'Не доступна'")); //@NON-NLS-1 @NON-NLS-2
Возврат ТаблицаРезультатов;
КонецФункции
// Возвращает таблицу проверки сведений о товарах
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - Строка
// * Значение - Строка
//
Функция ТаблицаПроверкиСведенийОТоваре() Экспорт
ТаблицаРезультатов = Новый Соответствие();
ТаблицаРезультатов.Вставить("00000000", НСтр("ru='Проверка КП КМ не выполнена, статус товара не проверен'"));
ТаблицаРезультатов.Вставить("00000001", НСтр("ru='Проверка КП КМ выполнена в ФН с отрицательным результатом, статус товара не проверен'"));
ТаблицаРезультатов.Вставить("00000011", НСтр("ru='Проверка КП КМ выполнена с положительным результатом, статус товара не проверен'"));
ТаблицаРезультатов.Вставить("00010000", НСтр("ru='Проверка КП КМ не выполнена, статус товара не проверен (ККТ функционирует в автономном режиме)'"));
ТаблицаРезультатов.Вставить("00010001", НСтр("ru='Проверка КП КМ выполнена в ФН с отрицательным результатом, статус товара не проверен (ККТ функционирует в автономном режиме)'"));
ТаблицаРезультатов.Вставить("00010011", НСтр("ru='Проверка КП КМ выполнена в ФН с положительным результатом, статус товара не проверен (ККТ функционирует в автономном режиме)'"));
ТаблицаРезультатов.Вставить("00000101", НСтр("ru='Проверка КП КМ выполнена с отрицательным результатом, статус товара некорректен'"));
ТаблицаРезультатов.Вставить("00000111", НСтр("ru='Проверка КП КМ выполнена с положительным результатом, статус товара некорректен'"));
ТаблицаРезультатов.Вставить("00001111", НСтр("ru='Проверка КП КМ выполнена с положительным результатом, статус товара корректен'"));
Возврат ТаблицаРезультатов;
КонецФункции
// Возвращает период хранения операций проверки КМ в регистре сведений
//
// Возвращаемое значение:
// ПеречислениеСсылка.ПериодХраненияИсторииОпераций
Функция ПериодХраненияИсторииОперацийПроверкиКМ() Экспорт
УстановитьПривилегированныйРежим(Истина);
ПериодХранения = Константы.СрокХраненияОперацийПроверкиКМ.Получить();
Возврат ПериодХранения;
КонецФункции
// Установить значение констант сроков хранения операций в регистрах сведений
//
Процедура УстановитьСрокХраненияОперацийПроверкиКМ() Экспорт
УстановитьПривилегированныйРежим(Истина);
Если НЕ ЗначениеЗаполнено(Константы.СрокХраненияОперацийПроверкиКМ.Получить()) Тогда
Константы.СрокХраненияОперацийПроверкиКМ.Установить(Перечисления.ПериодХраненияИсторииОпераций.ВсеВремя);
КонецЕсли;
КонецПроцедуры
Функция ХранитьУспешныеОперацииРазрешения() Экспорт
УстановитьПривилегированныйРежим(Истина);
Возврат Константы.ХранитьУспешныеОперацииРазрешения.Получить();
КонецФункции
// Регламентное задание, выполнят очистку истории операций проверки КМ
//
// Параметры:
// ДатаОчистки - Дата
Процедура ОчисткаИсторииОперацийПроверкиКМ(ДатаОчистки) Экспорт
РегистрыСведений.ОперацииПроверкиКМ.ОчиститьРегистрЗаПрошлыеМесяцы(ДатаОчистки);
РегистрыСведений.ОперацииПроверкиКМ.ОчиститьРегистрЗаТекущийМесяц(ДатаОчистки);
КонецПроцедуры
// Добавляет в регистр записи по переданным параметрам
//
// Параметры:
// РезультатыПроверки - Массив из см. РегистрыСведений.ОперацииПроверкиКМ.ПараметрыЗаписиРезультатаПроверкиКМ
//
Процедура ДобавитьРезультатыПроверкиКодаМаркировкиВРегистр(РезультатыПроверки) Экспорт
РегистрыСведений.ОперацииПроверкиКМ.ДобавитьРезультатыПроверкиКодаМаркировкиВРегистр(РезультатыПроверки);
КонецПроцедуры
// Возвращает структуру для обновления записи по идентификаторам сессии и запроса
//
// Возвращаемое значение:
// Структура:
// * Ключ - Структура -содержит ключ записи, идентификаторы сессии и запроса:
// ** ИдентификаторСессии - Строка
// ** ИдентификаторЗапроса - Строка
// * Результат - Булево, Неопределено - общий результат операции
// * ЗапросКМ - Структура, Неопределено - структура запроса КМ
// * ФлагиПроверкиОИСМ - Строка, Неопределено - флаги ответа от сервера ОИСМ
// * ЛокальныйОтветXML - Строка - Строка XML ответ от драйвера
// * УдаленныйОтветXML - Строка - Строка XML ответ от драйвера с сервера ОИСМ
// * ПокупкаПодтверждена - Булево, Неопределено - флаг подтверждения покупки
//
Функция ПараметрыЗаписиРезультатаПроверкиКМ() Экспорт
Возврат РегистрыСведений.ОперацииПроверкиКМ.ПараметрыЗаписиРезультатаПроверкиКМ();
КонецФункции
// Выполняет обновление записи по переданным параметрам
//
// Параметры:
// ПараметрыЗаписи - см. ПараметрыЗаписиРезультатаПроверкиКМ
//
Процедура ОбновитьРезультатыПроверкиКодаМаркировкиВРегистре(ПараметрыЗаписи) Экспорт
РегистрыСведений.ОперацииПроверкиКМ.ОбновитьРезультатыПроверкиКодаМаркировкиВРегистре(ПараметрыЗаписи);
КонецПроцедуры
// Привязывает идентификатор фискальной операции к указанной сессии проверки кода маркировки
//
// Параметры:
// ИдентификаторСессии - Строка - идентификатор сессии проверки кода маркировки
// ИдентификаторФискальнойОперации - Строка - идентификатор фискальной записи
Процедура ОбновитьИдентификаторФискальнойОперацииРезультатаПроверкиКодаМаркировки(ИдентификаторСессии, ИдентификаторФискальнойОперации) Экспорт
РегистрыСведений.ОперацииПроверкиКМ.ОбновитьИдентификаторФискальнойОперацииРезультатаПроверкиКодаМаркировки(ИдентификаторСессии, ИдентификаторФискальнойОперации);
КонецПроцедуры
#КонецОбласти
#Область РегламентныеЗадания
// Вызывается из процедуры РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий
// для установки доступности регламентного задания, определяет зависимость от функциональных опций.
//
// Параметры:
// Настройки - ТаблицаЗначений
// ФункциональнаяОпция - ОбъектМетаданныхФункциональнаяОпция
Процедура ПриОпределенииНастроекРегламентныхЗаданий(Настройки, ФункциональнаяОпция = Неопределено) Экспорт
КонецПроцедуры
#КонецОбласти
#Область РегламентныеЗаданияТехнологияСервиса
// См. ОчередьЗаданийПереопределяемый.ПриПолученииСпискаШаблонов
Процедура ПриПолученииСпискаШаблонов(ШаблоныЗаданий) Экспорт
КонецПроцедуры
// См. ОчередьЗаданийПереопределяемый.ПриОпределенииПсевдонимовОбработчиков
Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт
КонецПроцедуры
#КонецОбласти
// Данные запроса проверки кода для разрешительной системы
//
Процедура ЗаполнитьДанныеЗапросПроверкиКода(Позиция) Экспорт
ЗапросПроверкиКода = Позиция.ЗапросПроверкиКода;
ОтраслевойРеквизит = Позиция.ОтраслевойРеквизит;
Если Не ПустаяСтрока(ЗапросПроверкиКода.ИдентификаторЗапроса) И Не ПустаяСтрока(ЗапросПроверкиКода.ВременнаяМетка) Тогда
ОтраслевойРеквизит.ИдентификаторФОИВ = "030"; // 1262 - "030"
ОтраслевойРеквизит.ДатаДокументаОснования = Дата("20231121"); // 1263 - "21.11.2023"
ОтраслевойРеквизит.НомерДокументаОснования = "1944"; // 1264 - "1944"
ЗначениеРеквизита = "UUID=%1&Time=%2";
ЗначениеРеквизита = СтрШаблон(ЗначениеРеквизита, ЗапросПроверкиКода.ИдентификаторЗапроса, ЗапросПроверкиКода.ВременнаяМетка);
Если Не ПустаяСтрока(ЗапросПроверкиКода.ИдентификаторЭкземпляра) Тогда
ЗначениеРеквизита = ЗначениеРеквизита + "&Inst=" + ЗапросПроверкиКода.ИдентификаторЭкземпляра;
КонецЕсли;
Если Не ПустаяСтрока(ЗапросПроверкиКода.ВерсияБазы) Тогда
ЗначениеРеквизита = ЗначениеРеквизита + "&Ver=" + ЗапросПроверкиКода.ВерсияБазы;
КонецЕсли;
Если ПустаяСтрока(ОтраслевойРеквизит.ЗначениеРеквизита) Тогда // 1265
ОтраслевойРеквизит.ЗначениеРеквизита = ЗначениеРеквизита;
Иначе
ОтраслевойРеквизит.ЗначениеРеквизита = ОтраслевойРеквизит.ЗначениеРеквизита + "&" + ЗначениеРеквизита;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьОтраслевойРеквизитОбъемноСортовойУчет(Позиция) Экспорт
ТипыТоваров = ОборудованиеЧекопечатающиеУстройства.ОтраслевойРеквизитЗаполняетсяДляТиповТоваров();
ОтраслевойРеквизит = Позиция.ОтраслевойРеквизит;
// Передача сведений об объемно сортовой товара при оптовой продаже через ККТ.
Если Позиция.ОбъемноСортовойУчет И ТипыТоваров.ОбъемноСортовойУчет Тогда
ОтраслевойРеквизит.ИдентификаторФОИВ = "030"; // 1262
ОтраслевойРеквизит.ДатаДокументаОснования = Дата("20220326"); // 1263 - 26.03.2022
ОтраслевойРеквизит.НомерДокументаОснования = "477"; // 1264
ЗначениеРеквизита = "crpt=mrk";
Если Не ПустаяСтрока(Позиция.КоличествоВесовогоТовара) Тогда
ЗначениеРеквизита = ЗначениеРеквизита + "&q=" + Позиция.КоличествоВесовогоТовара;
КонецЕсли;
ОтраслевойРеквизит.ЗначениеРеквизита = ЗначениеРеквизита; // 1265
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьОтраслевойРеквизитОбщественноеПитание(Позиция) Экспорт
ТипыТоваров = ОборудованиеЧекопечатающиеУстройства.ОтраслевойРеквизитЗаполняетсяДляТиповТоваров();
ОтраслевойРеквизит = Позиция.ОтраслевойРеквизит;
Если ТипыТоваров.ОбщественноеПитание Тогда
// Передача сведений при указании услуг в общественном питание.
ОтраслевойРеквизит.ИдентификаторФОИВ = "030"; // 1262
ОтраслевойРеквизит.ДатаДокументаОснования = Дата("20220326"); // 1263 - 26.03.2022
ОтраслевойРеквизит.НомерДокументаОснования = "477"; // 1264
ОтраслевойРеквизит.ЗначениеРеквизита = "mode=horeca"; // 1265
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьОтраслевойРеквизитИзделияИзНатуральногоМеха(Позиция) Экспорт
ТипыТоваров = ОборудованиеЧекопечатающиеУстройства.ОтраслевойРеквизитЗаполняетсяДляТиповТоваров();
ОтраслевойРеквизит = Позиция.ОтраслевойРеквизит;
Если ТипыТоваров.ИзделияИзНатуральногоМеха Тогда
// Передача сведений о выбытии меховых изделий через ККТ.
ОтраслевойРеквизит.ИдентификаторФОИВ = "030"; // 1262
ОтраслевойРеквизит.ДатаДокументаОснования = Дата("20160811"); // 1263
ОтраслевойРеквизит.НомерДокументаОснования = "787"; // 1264
ОтраслевойРеквизит.ЗначениеРеквизита = "crpt=mrk"; // 1265
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьОтраслевойРеквизитМолочнаяПродукцияСНечитаемымиКМ(Позиция) Экспорт
ТипыТоваров = ОборудованиеЧекопечатающиеУстройства.ОтраслевойРеквизитЗаполняетсяДляТиповТоваров();
ОтраслевойРеквизит = Позиция.ОтраслевойРеквизит;
Если ТипыТоваров.МолочнаяПродукцияСНечитаемымиКМ Тогда
ДатаПроизводства = ?(Позиция.ДатаПроизводства <> Неопределено, Формат(Позиция.ДатаПроизводства, "ДФ=""ггММдд"""), "");
ОтраслевойРеквизит.ИдентификаторФОИВ = "030"; // 1262
ОтраслевойРеквизит.ДатаДокументаОснования = Дата("20201215"); // 1263
ОтраслевойРеквизит.НомерДокументаОснования = "2099"; // 1264
ОтраслевойРеквизит.ЗначениеРеквизита = "pd=" + ДатаПроизводства + "&km=tech"; // 1265 - ГГММДД дата производства товара
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьОтраслевойРеквизитВетеринарныеПрепараты(Позиция) Экспорт
ТипыТоваров = ОборудованиеЧекопечатающиеУстройства.ОтраслевойРеквизитЗаполняетсяДляТиповТоваров();
ОтраслевойРеквизит = Позиция.ОтраслевойРеквизит;
Если ТипыТоваров.ВетеринарныеПрепараты Тогда
// Заполнение отраслевого реквизита для ветеринарныых препаратов при передаче рецепта.
ОтраслевойРеквизит.ИдентификаторФОИВ = "030"; // 1262
ОтраслевойРеквизит.ДатаДокументаОснования = Дата("20240527"); // 1263 - 27.05.2024
ОтраслевойРеквизит.НомерДокументаОснования = "675"; // 1264
ЗначениеРеквизита = ?(Позиция.ВетеринарноеТребование, "tm=VPT", "tm=VPR");
Если Не ПустаяСтрока(Позиция.РецептНомер) Тогда
ЗначениеРеквизита = ЗначениеРеквизита + "&dn=" + Позиция.РецептНомер;
КонецЕсли;
РецептДата = ?(Позиция.РецептДата <> Неопределено, Формат(Позиция.РецептДата, "ДФ=""ггММдд"""), "");
Если Не ПустаяСтрока(РецептДата) Тогда
ЗначениеРеквизита = ЗначениеРеквизита + "&dd=" + РецептДата;
КонецЕсли;
ОтраслевойРеквизит.ЗначениеРеквизита = ЗначениеРеквизита // 1265
КонецЕсли;
КонецПроцедуры
Функция ШтрихкодДляТега1163Base64(ДанныеКодаТовара) Экспорт
Если ДанныеКодаТовара.НаименованиеРеквизита = "GS1.0"
Или ДанныеКодаТовара.НаименованиеРеквизита = "GS1.M" Тогда
Штрихкод = "";
ДанныеШтрихкода = ДанныеКодаТовара.ДанныеШтрихкода;
ЗначениеПоля = ДанныеШтрихкода.Получить("01");
Если ЗначениеПоля<>Неопределено Тогда
Штрихкод = Штрихкод + "01" + ЗначениеПоля.Значение;
КонецЕсли;
ЗначениеПоля = ДанныеШтрихкода.Получить("21");
Если ЗначениеПоля<>Неопределено Тогда
Штрихкод = Штрихкод + "21" + ЗначениеПоля.Значение;
КонецЕсли;
Результат = МенеджерОборудованияКлиентСервер.ШтрихкодВBase64(Штрихкод);
Иначе
Результат = ДанныеКодаТовара.ШтрихкодBase64;
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Получить обработки запроса КМ по коду.
//
Функция СтатусОбработкиЗапросаКМПоКоду(КодОбработкиЗапроса)
СтатусОбработки = Новый Соответствие();
СтатусОбработки.Вставить(0, ПредопределенноеЗначение("Перечисление.СтатусОбработкиЗапросаКМ.КорректныйФормат"));
СтатусОбработки.Вставить(1, ПредопределенноеЗначение("Перечисление.СтатусОбработкиЗапросаКМ.НекорректныйФормат"));
СтатусОбработки.Вставить(2, ПредопределенноеЗначение("Перечисление.СтатусОбработкиЗапросаКМ.НекорректныйФорматКМ"));
Возврат СтатусОбработки.Получить(Число(КодОбработкиЗапроса));
КонецФункции
// Получить результат проверки сведений о товаре.
//
// Параметры:
// РезультатПроверки - Строка
//
// Возвращаемое значение:
// Строка
//
Функция РезультатПроверкиСведенийОТоваре(РезультатПроверки) Экспорт
РезультатыПроверки = ТаблицаПроверкиСведенийОТоваре();
Возврат РезультатыПроверки.Получить(РезультатПроверки);
КонецФункции
// Получить результат проверки сведений о товаре.
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - Строка
// * Значение - Строка
//
Функция ТаблицаПроверкиСведенийОТовареПФ() Экспорт
ТаблицаРезультатов = Новый Соответствие();
ТаблицаРезультатов.Вставить("00000000", "[М]"); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить("00000001", "[М-]"); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить("00000011", "[М]"); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить("00010000", "[М]"); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить("00010001", "[М-]"); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить("00010011", "[М]"); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить("00000101", "[М-]"); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить("00000111", "[М-]"); //@NON-NLS-1 @NON-NLS-2
ТаблицаРезультатов.Вставить("00001111", "[М+]"); //@NON-NLS-1 @NON-NLS-2
Возврат ТаблицаРезультатов;
КонецФункции
// Получить результат проверки сведений о товаре.
//
// Параметры:
// РезультатПроверки - Число
//
// Возвращаемое значение:
// Строка
//
Функция РезультатПроверкиСведенийОТовареПФ(РезультатПроверки) Экспорт
РезультатыПроверки = ТаблицаПроверкиСведенийОТовареПФ();
Возврат РезультатыПроверки.Получить(РезультатПроверки);
КонецФункции
Функция ЗаписатьРезультатыПроверкиКодаМаркировкиВРегистрреобразованиеВJSON(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
Возврат Строка(Значение);
КонецФункции
#КонецОбласти
#Область ФункцииРаботыGS1
// Разобрать строку штрихкода в соответствии со стандартом GS1.
//
// Параметры:
// Штрихкод - Строка - значение штрихкода.
//
// Возвращаемое значение:
// Структура - см. МенеджерОборудованияМаркировкаКлиентСервер.НовыйРезультатРазбораСтрокиШтрихкодаGS1.
Функция РазобратьСтрокуШтрихкодаGS1(Знач Штрихкод) Экспорт;
РезультатРазбора = МенеджерОборудованияМаркировкаКлиентСервер.НовыйРезультатРазбораСтрокиШтрихкодаGS1();
КодыGS1 = КодыGS1();
Если СтрНачинаетсяС(Штрихкод, "(") Тогда
МенеджерОборудованияМаркировкаКлиентСервер.РазобратьСтрокуШтрихкодаGS1СоСкобками(Штрихкод, РезультатРазбора, КодыGS1);
Иначе
Разделитель = ОбщегоНазначенияБПОКлиентСервер.РазделительGS1();
ЧастиШтрихкода = СтрРазделить(Штрихкод, Разделитель, Ложь);
Для Каждого ЧастьБезРазделителей Из ЧастиШтрихкода Цикл
МенеджерОборудованияМаркировкаКлиентСервер.РазобратьСтрокуШтрихкодаGS1Служебный(ЧастьБезРазделителей, РезультатРазбора, КодыGS1);
КонецЦикла;
КонецЕсли;
Возврат РезультатРазбора;
КонецФункции
#КонецОбласти
#Область ФункцииМаркировкиПродукции
// Разобрать штриховой код товара.
//
// Параметры:
// Штрихкод - Строка - Штрихкод
// ШтрихкодВBase64 - Булево - Штрихкод в base64
//
// Возвращаемое значение:
// Структура - Разобрать штриховой код товара:
// * Разобран - Булево -
// * ОписаниеОшибки - СТрока
// * ПредставлениеШтрихкода - Строка -
// * ДанныеШтрихкода - Строка -
// * ТипИдентификатораТовара - ПеречислениеСсылка.ТипыИдентификаторовТовараККТ -
// * GTIN - Строка -
// * СерийныйНомер - Строка -
// * EAN - Строка -
// * РеквизитКодаТовараHEX - Строка -
// * РеквизитКодаТовара - Строка -
// * ИдентифицируетЭкземпляр - Булево -
// * ПотребительскаяУпаковкаТабачнойПродукции - Булево -
// * ШтрихкодBase64 - Булево -
// * НаименованиеРеквизита - Строка -
//
Функция РазобратьШтриховойКодТовара(Знач Штрихкод, Знач ШтрихкодВBase64 = Ложь) Экспорт;
КодыGS1 = КодыGS1();
Возврат МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовараСлужебная(Штрихкод, ШтрихкодВBase64, КодыGS1);
КонецФункции
// Коды GS1.
//
// Возвращаемое значение:
// Соответствие из Строка - Коды GS1
Функция КодыGS1() Экспорт
Возврат МенеджерОборудованияМаркировкаПовтИсп.КодыGS1Служебный();
КонецФункции
#КонецОбласти