#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
Функция ТекстЗапросаЗаполненияСтатусовУказанияСерий(ПараметрыУказанияСерий) Экспорт
Возврат ИнтеграцияИС.ТекстЗапросаЗаполненияСтатусовУказанияСерий(
Метаданные.Обработки.ПроверкаИПодборТабачнойПродукцииМОТП, ПараметрыУказанияСерий);
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
Процедура ЗагрузитьДанныеДокументаДлительнаяОперация(Параметры, АдресРезультата) Экспорт
ОписаниеЗамера = ОценкаПроизводительности.НачатьЗамерДлительнойОперации(
"Обработка.ПроверкаИПодборТабачнойПродукцииМОТП.МодульМенеджера.ЗагрузитьДанныеДокументаДлительнаяОперация");
ДанныеДокумента = Новый Структура;
ДанныеДокумента.Вставить("ДеревоМаркированнойПродукции", ДеревоМаркированнойПродукции());
ДанныеДокумента.Вставить("ПодобраннаяМаркируемаяПродукция", ПодобраннаяМаркируемаяПродукция());
ДанныеДокумента.Вставить("ДоступныеДляПроверкиУпаковки", Новый СписокЗначений());
ДанныеДокумента.Вставить("УпаковкиДокумента", Новый СписокЗначений());
ДанныеДокумента.Вставить("НачальныйСтатусПроверки", Параметры.НачальныйСтатусПроверки);
ДанныеДокумента.Вставить("ДетализацияСтруктурыХранения", Параметры.ДетализацияСтруктурыХранения);
ДанныеДокумента.Вставить("РежимПодбораСуществующихУпаковок", Параметры.РежимПодбораСуществующихУпаковок);
ДанныеДокумента.Вставить("ПроверкаЭлектронногоДокумента", Параметры.ПроверкаЭлектронногоДокумента);
ДанныеДокумента.Вставить("ПараметрыПроверкиКодовМаркировки", Параметры.ПараметрыПроверкиКодовМаркировки);
ДанныеДокумента.Вставить("Сценарий", Параметры.Сценарий);
ДанныеДокумента.Вставить("КоличествоНедопустимыхКодовМаркировки", 0);
ДанныеДокумента.Вставить(
"КонтролироватьСканируемуюПродукциюПоДокументуОснованию",
Параметры.КонтролироватьСканируемуюПродукциюПоДокументуОснованию);
ДанныеДокумента.Вставить(
"ВозможностьЗагрузкиДанныхБезПодключенияМОТП",
Параметры.ВозможностьЗагрузкиДанныхБезПодключенияМОТП);
ДанныеДокумента.Вставить("УточнениеКоэффициентовУпаковок", Неопределено);
ДанныеДокумента.Вставить("ДополнительноеДействиеЗагрузки", Неопределено);
СохраненнаяДетализацияСтруктурыХранения = ПроверкаИПодборПродукцииИСМП.СохраненнаяДетализацияСтруктурыХранения(Параметры.РежимПодбораСуществующихУпаковок);
ДопустимыеДетализации = ПроверкаИПодборПродукцииМОТП.ДопустимыеДетализацииСтруктурыХранения(
Не Параметры.ПроверкаНеПоДокументу, Параметры.ПроверяемыйДокумент);
Если ДопустимыеДетализации.Найти(СохраненнаяДетализацияСтруктурыХранения) = Неопределено Тогда
СохраненнаяДетализацияСтруктурыХранения = Неопределено;
КонецЕсли;
ДанныеДокумента.Вставить("СохраненнаяДетализацияСтруктурыХранения", СохраненнаяДетализацияСтруктурыХранения);
ДанныеДокумента.Вставить("СодержимоеУпаковокНедоступно", Ложь);
ДанныеДокумента.Вставить("СтрокаПачкиБезБлока", Неопределено);
ДанныеДокумента.Вставить("СтрокаБлокиБезКоробки", Неопределено);
ДанныеДокумента.Вставить("Организация", Параметры.ПараметрыСканирования.Организация);
ДанныеДокумента.Вставить("ЭтоВосстановлениеДетализации", Параметры.ЭтоВосстановлениеДетализации);
ДанныеДокумента.Вставить("ВидМаркируемойПродукции", Параметры.ВидМаркируемойПродукции);
ДанныеДокумента.Вставить("ПроверяемыйДокумент", Параметры.ПроверяемыйДокумент);
ДанныеДокумента.Вставить("КешГрупповыхУпаковок", Новый Соответствие);
ДанныеДокумента.Вставить(
"ОшибкиПроверкиСредствамиККТ",
РегистрыСведений.РезультатыПроверкиСредствамиККТИСМП.ДанныеРезультатовПроверкиДляПроверкиИПодбора(
Параметры.ПроверяемыйДокумент,
Параметры.ВидМаркируемойПродукции));
ДанныеДокумента.Вставить("ОбработанЧастично", Параметры.РежимИсправленияОшибокПослеПередачиКодов);
ДанныеДокумента.Вставить("ЗначенияШтрихкодовОбработанныхСОшибками", Новый Массив);
ПринудительноУстановитьДетализацию = Неопределено;
Если Параметры.ЭтоВосстановлениеДетализации Тогда
ПринудительноУстановитьДетализацию = Параметры.ДетализацияСтруктурыХранения;
КонецЕсли;
СвойстваВидаПродукции = Новый Структура("РазрешенОборотНемаркируемыхОстатков",
ОбщегоНазначенияИСМПВызовСервера.РазрешенОборотНемаркируемыхОстатковПродукции(Параметры.ВидМаркируемойПродукции));
Если Параметры.ПроверкаНеПоДокументу Тогда
ПараметрыСканирования = Параметры.ПараметрыСканирования;
ПроверяемыеДанные = Параметры.ПроверяемыеДанные;
ПараметрыСканирования.ВыполняетсяЗагрузкаДанныхВФормуПроверкиИПодбораИСМП = Истина;
ПараметрыСканирования.ИспользуетсяСоответствиеШтрихкодовСтрокДерева = Ложь;
РезультатПолученияДанных = ШтрихкодированиеМОТП.ВложенныеШтрихкодыУпаковок(
ПроверяемыеДанные.МаркированныеТовары,
ПараметрыСканирования, Истина);
Если РезультатПолученияДанных.ЕстьОшибки Тогда
ВызватьИсключение РезультатПолученияДанных.ТекстОшибки;
КонецЕсли;
ЗаполнитьТаблицуПодобраннойТабачнойПродукции(ПроверяемыеДанные.ТаблицаМаркируемойПродукции, ДанныеДокумента, СвойстваВидаПродукции);
ДанныеПроверяемогоОбъекта = РезультатПолученияДанных.ВложенныеШтрихкоды;
ЗаполнитьТаблицуПродукцияПоДокументу(ДанныеДокумента, Параметры.ВидМаркируемойПродукции);
ДополнитьТаблицуПодобраннойТабачнойПродукции(
ДанныеПроверяемогоОбъекта, ДанныеДокумента, Параметры.ВидМаркируемойПродукции, ПараметрыСканирования);
ЗаполнитьДеревоМаркированнойПродукции(
ДанныеПроверяемогоОбъекта.ДеревоУпаковок, ДанныеДокумента, ПараметрыСканирования, ПринудительноУстановитьДетализацию);
Иначе
ТаблицаМаркируемойПродукции = ПроверкаИПодборПродукцииИСМП.ТаблицаМаркируемойПродукцииДокумента(
Параметры.ПроверяемыйДокумент, Параметры.ВидМаркируемойПродукции, Параметры.Сценарий);
ЗаполнитьТаблицуПодобраннойТабачнойПродукции(ТаблицаМаркируемойПродукции, ДанныеДокумента, СвойстваВидаПродукции);
Если Параметры.Свойство("ДанныеКлючаСессииИСМП") Тогда
ПараметрыСеанса.ДанныеКлючаСессииИСМП = Параметры.ДанныеКлючаСессииИСМП;
КонецЕсли;
Если Параметры.Свойство("ПараметрыЛогированияЗапросовИСМП") Тогда
ЛогированиеЗапросовИСМП.УстановитьПараметрыЛогированияЗапросов(Параметры.ПараметрыЛогированияЗапросовИСМП);
ЛогированиеЗапросовИС.НастроитьПараметрыЛогированияВФоновомЗадании(Параметры.ПараметрыЛогированияЗапросовИСМП);
ЛогированиеЗапросовИСМП.УстановитьПараметрыЛогированияЗапросов(Параметры.ПараметрыЛогированияЗапросовИСМП);
КонецЕсли;
ПараметрыСканирования = Параметры.ПараметрыСканирования;
Если Параметры.РежимПодбораСуществующихУпаковок Тогда
Если Не Параметры.ЭтоВосстановлениеДетализации
И Не ЗначениеЗаполнено(ПараметрыСканирования.ДетализацияСтруктурыХранения) Тогда
ПараметрыСканирования.ДетализацияСтруктурыХранения = СохраненнаяДетализацияСтруктурыХранения;
ШтрихкодыУпаковокПоДокументу = ШтрихкодированиеМОТП.ШтрихкодыУпаковокИзДокумента(
Параметры.ПроверяемыйДокумент, ПараметрыСканирования);
ПринудительноУстановитьДетализацию = ПроверкаИПодборПродукцииМОТП.ДетализацияНаОснованииСтатистикиПоШтрихкодам(
ШтрихкодыУпаковокПоДокументу, ПараметрыСканирования, Параметры.ПроверяемыйДокумент, Параметры.ВидМаркируемойПродукции);
ПараметрыСканирования.ДетализацияСтруктурыХранения = ПринудительноУстановитьДетализацию;
ДанныеДокумента.ДетализацияСтруктурыХранения = ПринудительноУстановитьДетализацию;
ИначеЕсли ТипЗнч(Параметры.ПроверяемыйДокумент) = Тип("ДокументСсылка.МаркировкаТоваровИСМП") Тогда
ПринудительноУстановитьДетализацию = Перечисления.ДетализацияСтруктурыХраненияИС.Полная;
КонецЕсли;
ПараметрыСканирования.ВыполняетсяЗагрузкаДанныхВФормуПроверкиИПодбораИСМП = Истина;
ПараметрыСканирования.ИспользуетсяСоответствиеШтрихкодовСтрокДерева = Ложь;
РезультатПолученияДанных = ШтрихкодированиеМОТП.ВложенныеШтрихкодыУпаковокПоДокументу(
Параметры.ПроверяемыйДокумент,
ПараметрыСканирования, Истина);
ЗначенияШтрихкодовОбработанныхСОшибками = РегистрыСведений.ПакетыКодовМаркировкиИСМП.ПолучитьДанныеПоДокументу(Параметры.ПроверяемыйДокумент);
ДанныеДокумента.Вставить("ЗначенияШтрихкодовОбработанныхСОшибками", ЗначенияШтрихкодовОбработанныхСОшибками);
Иначе
ВосстановлениеДетализацииТребуетОбращенияКСервису = Ложь;
ПараметрыСканирования.ДетализацияСтруктурыХранения = СохраненнаяДетализацияСтруктурыХранения;
ДанныеДокумента.ДетализацияСтруктурыХранения = СохраненнаяДетализацияСтруктурыХранения;
Если Параметры.ПроверкаЭлектронногоДокумента Тогда
ДанныеНоменклатурыПоДаннымУПД = ПроверкаИПодборПродукцииИСМП.ДанныеНоменклатурыПоДаннымУПД(
ДанныеДокумента.ПроверяемыйДокумент, ДанныеДокумента.ВидМаркируемойПродукции);
ДанныеШтрихкодовСписок = Новый Массив;
ДобавленныеШтрихкоды = Новый Соответствие;
Для Каждого Строка Из ДанныеНоменклатурыПоДаннымУПД.СтрокиТекущейТоварнойГруппы Цикл
Если ДобавленныеШтрихкоды[Строка.Штрихкод] = Неопределено Тогда
ДанныеШтрихкодовСписок.Добавить(
Новый Структура("Штрихкод, Количество", Строка.Штрихкод, 1));
ДобавленныеШтрихкоды[Строка.Штрихкод] = Истина;
КонецЕсли;
КонецЦикла;
Если Не Параметры.ЭтоВосстановлениеДетализации Тогда
ПринудительноУстановитьДетализацию = ПроверкаИПодборПродукцииМОТП.ДетализацияНаОснованииСтатистикиПоШтрихкодам(
ДанныеНоменклатурыПоДаннымУПД.СтрокиТекущейТоварнойГруппы, ПараметрыСканирования, Параметры.ПроверяемыйДокумент, Параметры.ВидМаркируемойПродукции);
Иначе
ФактическаяДетализация = ПроверкаИПодборПродукцииМОТП.ДетализацияНаОснованииСтатистикиПоШтрихкодам(
ДанныеНоменклатурыПоДаннымУПД.СтрокиТекущейТоварнойГруппы, ПараметрыСканирования, Параметры.ПроверяемыйДокумент, Параметры.ВидМаркируемойПродукции);
ДетализацияТребующиеЗапросаКСервису = ПроверкаИПодборПродукцииМОТП.ДетализацияТребуетЗапросаКСервису(ФактическаяДетализация);
Если ДетализацияТребующиеЗапросаКСервису.Найти(ПринудительноУстановитьДетализацию) <> Неопределено Тогда
ВосстановлениеДетализацииТребуетОбращенияКСервису = Истина;
КонецЕсли;
КонецЕсли;
ПараметрыСканирования.ДетализацияСтруктурыХранения = ПринудительноУстановитьДетализацию;
ДанныеДокумента.ДетализацияСтруктурыХранения = ПринудительноУстановитьДетализацию;
ПроверкаИПодборПродукцииИСМП.ПроверитьДанныеУПДНаНаличиеОшибок(ДанныеДокумента, ДанныеНоменклатурыПоДаннымУПД);
ПараметрыСканирования.ВыполняетсяЗагрузкаДанныхВФормуПроверкиИПодбораИСМП = Истина;
ПараметрыСканирования.ИспользуетсяСоответствиеШтрихкодовСтрокДерева = Ложь;
ДляУпаковокТребоватьПодключениеМОТП = Истина;
Если ДанныеДокумента.ВозможностьЗагрузкиДанныхБезПодключенияМОТП = Истина Тогда
ДляУпаковокТребоватьПодключениеМОТП = Ложь;
КонецЕсли;
РезультатПолученияДанных = ШтрихкодированиеМОТП.ВложенныеШтрихкоды(
ДанныеШтрихкодовСписок, ПараметрыСканирования, ДляУпаковокТребоватьПодключениеМОТП, Истина);
Иначе
ШтрихкодыУпаковокПоДокументу = ШтрихкодированиеМОТП.ШтрихкодыУпаковокИзДокумента(
Параметры.ПроверяемыйДокумент, ПараметрыСканирования);
Если Не Параметры.ЭтоВосстановлениеДетализации Тогда
ПринудительноУстановитьДетализацию = ПроверкаИПодборПродукцииМОТП.ДетализацияНаОснованииСтатистикиПоШтрихкодам(
ШтрихкодыУпаковокПоДокументу, ПараметрыСканирования, Параметры.ПроверяемыйДокумент, Параметры.ВидМаркируемойПродукции);
Иначе
ФактическаяДетализация = ПроверкаИПодборПродукцииМОТП.ДетализацияНаОснованииСтатистикиПоШтрихкодам(
ШтрихкодыУпаковокПоДокументу, ПараметрыСканирования, Параметры.ПроверяемыйДокумент, Параметры.ВидМаркируемойПродукции);
ДетализацияТребующиеЗапросаКСервису = ПроверкаИПодборПродукцииМОТП.ДетализацияТребуетЗапросаКСервису(ФактическаяДетализация);
Если ДетализацияТребующиеЗапросаКСервису.Найти(ПринудительноУстановитьДетализацию) <> Неопределено Тогда
ВосстановлениеДетализацииТребуетОбращенияКСервису = Истина;
КонецЕсли;
КонецЕсли;
ПараметрыСканирования.ДетализацияСтруктурыХранения = ПринудительноУстановитьДетализацию;
ДанныеДокумента.ДетализацияСтруктурыХранения = ПринудительноУстановитьДетализацию;
ПараметрыСканирования.ОпределениеВидаПродукцииИСМП = Истина;
ПараметрыСканирования.ВыполняетсяЗагрузкаДанныхВФормуПроверкиИПодбораИСМП = Истина;
ПараметрыСканирования.ИспользуетсяСоответствиеШтрихкодовСтрокДерева = Ложь;
РезультатПолученияДанных = ШтрихкодированиеМОТП.ВложенныеШтрихкодыУпаковокПоДокументу(
Параметры.ПроверяемыйДокумент,
ПараметрыСканирования, Истина);
КонецЕсли;
Если (РезультатПолученияДанных.ТребуетсяОбновлениеКлючаСессии
Или РезультатПолученияДанных.ТребуетсяОбновлениеКлючаСессииРозница
Или Не РезультатПолученияДанных.ЕстьОшибки)
И ПроверкаИПодборПродукцииИСМПКлиентСервер.ЭтоДокументПриобретения(Параметры.ПроверяемыйДокумент) Тогда
Если ПроверкаИПодборПродукцииИСМП.ПрерватьОбработкуЗагрузкиДанных(
ДанныеДокумента,
ПараметрыСканирования,
ДанныеНоменклатурыПоДаннымУПД,
РезультатПолученияДанных,
ВосстановлениеДетализацииТребуетОбращенияКСервису) Тогда
ЛогированиеЗапросовИСМП.ЗаполнитьВозвращаемыеДанныеФоновогоЗадания(ДанныеДокумента);
ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, 0);
ПоместитьВоВременноеХранилище(ДанныеДокумента, АдресРезультата);
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если РезультатПолученияДанных.ЕстьОшибки Тогда
ВызватьИсключение РезультатПолученияДанных.ТекстОшибки;
КонецЕсли;
ЗаполнитьТаблицуПродукцияПоДокументу(ДанныеДокумента, Параметры.ВидМаркируемойПродукции);
ДанныеПроверяемогоДокумента = РезультатПолученияДанных.ВложенныеШтрихкоды;
ДополнитьТаблицуПодобраннойТабачнойПродукции(
ДанныеПроверяемогоДокумента,
ДанныеДокумента,
Параметры.ВидМаркируемойПродукции,
Параметры.ПараметрыСканирования);
ЗаполнитьДеревоМаркированнойПродукции(
ДанныеПроверяемогоДокумента.ДеревоУпаковок, ДанныеДокумента, ПараметрыСканирования, ПринудительноУстановитьДетализацию);
Если Не Параметры.РежимПодбораСуществующихУпаковок И Параметры.ПроверкаЭлектронногоДокумента Тогда
ЗаполнитьТаблицуПродукцияПоДокументу(ДанныеДокумента, Параметры.ВидМаркируемойПродукции);
КонецЕсли;
КонецЕсли;
КоличествоДанных = ИнтеграцияИС.КоличествоСтрокДереваЗначений(ДанныеДокумента.ДеревоМаркированнойПродукции)
+ ДанныеДокумента.ПодобраннаяМаркируемаяПродукция.Количество();
ЛогированиеЗапросовИСМП.ЗаполнитьВозвращаемыеДанныеФоновогоЗадания(ДанныеДокумента);
ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанных);
ПоместитьВоВременноеХранилище(ДанныеДокумента, АдресРезультата);
КонецПроцедуры
Процедура ЗафиксироватьРезультатПроверкиИПодбора(Параметры, АдресРезультата) Экспорт
ОписаниеЗамера = ОценкаПроизводительности.НачатьЗамерДлительнойОперации(
"Обработка.ПроверкаИПодборТабачнойПродукцииМОТП.МодульМенеджера.ЗафиксироватьРезультатПроверкиИПодбора");
ПараметрыСканирования = ОбщегоНазначения.СкопироватьРекурсивно(Параметры.ПараметрыСканирования);
ПараметрыСканирования.СозданиеНаборов = Ложь;
Если Параметры.Свойство("ПараметрыЛогированияЗапросовИСМП") Тогда
ЛогированиеЗапросовИСМП.УстановитьПараметрыЛогированияЗапросов(Параметры.ПараметрыЛогированияЗапросовИСМП);
ЛогированиеЗапросовИС.НастроитьПараметрыЛогированияВФоновомЗадании(Параметры.ПараметрыЛогированияЗапросовИСМП);
ЛогированиеЗапросовИСМП.УстановитьПараметрыЛогированияЗапросов(Параметры.ПараметрыЛогированияЗапросовИСМП);
КонецЕсли;
НачатьТранзакцию();
Попытка
ПараметрыОкончанияПроверки = ПроверкаИПодборПродукцииИСМП.ПараметрыОкончанияПроверки();
ПараметрыОкончанияПроверки.ВидПродукцииИС = Параметры.ВидМаркируемойПродукции;
ПараметрыОкончанияПроверки.СоздаватьАктОРасхождениях = Параметры.СоздаватьАктОРасхождениях;
ПараметрыОкончанияПроверки.ПроверяемыйДокумент = Параметры.ПроверяемыйДокумент;
ПараметрыОкончанияПроверки.Сценарий = Параметры.Сценарий;
ДеревоМаркированнойПродукции = Параметры.ДеревоМаркированнойПродукции.Скопировать();
ДеревоМаркированнойПродукции.Колонки.Добавить("ШтрихкодУпаковки", Новый ОписаниеТипов("СправочникСсылка.ШтрихкодыУпаковокТоваров"));
Если Не Параметры.ПроверкаНеПоДокументу и Параметры.СоздаватьАктОРасхождениях Тогда
ШтрихкодыБрак = ШтрихкодированиеИС.ЗначенияНедопустимыхШтрихкодовИзДереваМаркируемойПродукции(
ДеревоМаркированнойПродукции);
КонецЕсли;
ПроверкаИПодборПродукцииИСМП.УдалитьПустыеУпаковкиДерева(ДеревоМаркированнойПродукции);
ТаблицаШтрихкодовВерхнегоУровня = ПроверкаИПодборПродукцииИСМП.ПустаяТаблицаШтрихкодовВерхнегоУровня();
ТаблицаПодобраннойПровереннойПродукции = ПроверкаИПодборПродукцииИСМП.ПустаяТаблицаПодобраннойПровереннойПродукции();
ТаблицаПодобраннойПровереннойПродукции.Колонки.Добавить("МРЦ", ОбщегоНазначения.ОписаниеТипаЧисло(10, 2));
ЗаполнитьИдентификаторЗапросаГИСМТ = ОбщегоНазначенияИСМПКлиентСерверПовтИсп.ПродукцияПодлежитОбязательнойОнлайнПроверкеПередРозничнойПродажей(Параметры.ВидМаркируемойПродукции,
Параметры.ПараметрыСканирования.ВидОперацииИСМП,
Параметры.ПараметрыСканирования.ТребуетсяПроверкаСредствамиККТ);
Если ЗаполнитьИдентификаторЗапросаГИСМТ Тогда
ДополнитьКолонкамиРозничнойПродажи(ТаблицаШтрихкодовВерхнегоУровня);
ДополнитьКолонкамиРозничнойПродажи(ТаблицаПодобраннойПровереннойПродукции);
КонецЕсли;
Если ПараметрыСканирования.ТребуетсяЧастичноеВыбытие
И ОбщегоНазначенияИСКлиентСерверПовтИсп.ПоддерживаетсяЧастичноеВыбытие(
Параметры.ВидМаркируемойПродукции,
ПараметрыСканирования.ВидОперацииИСМП) Тогда
ПроверкаИПодборПродукцииИСМП.ДополнитьТаблицуШтрихкодовКолонкамиЧастичногоВыбытия(ТаблицаШтрихкодовВерхнегоУровня);
КонецЕсли;
СтрокиДереваНаборов = Новый Массив;
Если ДеревоМаркированнойПродукции.Колонки.Найти("КоличествоПоДаннымИБ") = Неопределено Тогда
ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПоДаннымИБ", Новый ОписаниеТипов("Число"));
КонецЕсли;
Если ДеревоМаркированнойПродукции.Колонки.Найти("КоличествоПотребительскихУпаковокПоДаннымИБ") = Неопределено Тогда
ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПотребительскихУпаковокПоДаннымИБ", Новый ОписаниеТипов("Число"));
КонецЕсли;
ПроверкаИПодборПродукцииИСМП.ЗаполнитьРекурсивноКоличествоПоДаннымИБПоКолонкеКоличество(ДеревоМаркированнойПродукции.Строки, СтрокиДереваНаборов);
Если СтрокиДереваНаборов.Количество() Тогда
ШтрихкодированиеИСМПСлужебный.НормализоватьСвойстваКоллекцииВложенныхШтрихкодов(ДеревоМаркированнойПродукции, ПараметрыСканирования);
ДеревоМаркированнойПродукции.Колонки.Добавить("СтрокаДерева");
ДеревоМаркированнойПродукции.Колонки.Добавить("ОбработанСОшибками", Новый ОписаниеТипов("Булево"));
ШтрихкодированиеИСМПСлужебный.ЗаполнитьСтрокиТаблицыДанныхПоГрупповымУпаковкам(СтрокиДереваНаборов, ПараметрыСканирования);
Для Каждого СтрокаДерева Из СтрокиДереваНаборов Цикл
СтрокаДерева.КоличествоПоДаннымИБ = СтрокаДерева.Количество;
КонецЦикла;
ШтрихкодированиеИСМПСлужебный.НормализоватьДанныеДереваУпаковок(ДеревоМаркированнойПродукции, ПараметрыСканирования);
КонецЕсли;
ПараметрыСозданияШтрихкодов = Справочники.ШтрихкодыУпаковокТоваров.ПараметрыСозданияШтриходовУпаковокПоДеревуМаркируемойПродукции(
ДеревоМаркированнойПродукции, Параметры.ПараметрыСканирования);
Если СтрокиДереваНаборов.Количество() Тогда
ПараметрыСозданияШтрихкодов.ИмяКолонкиКоличествоПотребительскихУпаковок = "КоличествоПотребительскихУпаковок";
КонецЕсли;
ПараметрыСозданияШтрихкодов.ВидПродукции = Параметры.ВидМаркируемойПродукции;
Справочники.ШтрихкодыУпаковокТоваров.РезультатСозданияШтрихкодовУпаковокПоДеревуМаркируемойПродукции(
ДеревоМаркированнойПродукции, ТаблицаШтрихкодовВерхнегоУровня,
ПараметрыСозданияШтрихкодов);
ПараметрыОкончанияПроверки.ТаблицаШтрихкодовВерхнегоУровня = ТаблицаШтрихкодовВерхнегоУровня;
Если ЗаполнитьИдентификаторЗапросаГИСМТ Тогда
ЗаполнитьШтрихкодыВерхнегоУровняИдентификаторамиЗапросовГИСМТ(ДеревоМаркированнойПродукции.Строки, ТаблицаШтрихкодовВерхнегоУровня);
КонецЕсли;
РегистрыСведений.ПулКодовМаркировкиСУЗ.ОтразитьАгрегациюКодовМаркировкиВПуле(ДеревоМаркированнойПродукции);
Если Параметры.РежимИсправленияОшибокПослеПередачиКодов Тогда
ШтрихкодыУпаковокОбработанСОшибкойВГИСМТ = ПроверкаИПодборПродукцииИСМП.КодыМаркировкиДляПовторнойОтправки(ДеревоМаркированнойПродукции);
ДанныеЗаписи = Новый Структура;
ДанныеЗаписи.Вставить("ДокументОснование", Параметры.ПроверяемыйДокумент);
ДанныеЗаписи.Вставить("Сообщение", ОбменДаннымиИСМП.СтроковоеПредставлениеПустогоУникальногоИдентификатора());
ДанныеЗаписи.Вставить("ДанныеСообщения", Новый ХранилищеЗначения(ШтрихкодыУпаковокОбработанСОшибкойВГИСМТ));
РегистрыСведений.ПакетыКодовМаркировкиИСМП.ВыполнитьЗаписьВРегистр(ДанныеЗаписи);
КонецЕсли;
ЕстьРасхождения = Ложь;
Для Каждого СтрокаДерева Из Параметры.ПодобраннаяМаркируемаяПродукция Цикл
НоваяСтрока = ТаблицаПодобраннойПровереннойПродукции.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДерева);
Если Не ЗначениеЗаполнено(НоваяСтрока.Характеристика) Тогда
НоваяСтрока.Характеристика = ОбщегоНазначенияИС.ПустоеЗначениеОпределяемогоТипа("ХарактеристикаНоменклатуры");
КонецЕсли;
Если Не ЗначениеЗаполнено(НоваяСтрока.Серия) Тогда
НоваяСтрока.Серия = ОбщегоНазначенияИС.ПустоеЗначениеОпределяемогоТипа("СерияНоменклатуры");
КонецЕсли;
Если НоваяСтрока.Количество <> НоваяСтрока.КоличествоПодобрано Тогда
ЕстьРасхождения = Истина;
КонецЕсли;
Если Не СтрокаДерева.ПроизвольнаяЕдиницаУчета Тогда
НоваяСтрока.КоличествоПотребительскихУпаковок = 0;
КонецЕсли;
КонецЦикла;
ПараметрыОкончанияПроверки.ТаблицаПодобраннойПровереннойПродукции = ТаблицаПодобраннойПровереннойПродукции;
Если Не Параметры.ПроверкаНеПоДокументу Тогда
Если Параметры.СоздаватьАктОРасхождениях Тогда
ПараметрыОкончанияПроверки.ТаблицаРасхожденийШтриховыхКодов = ТаблицаРасхожденийУпаковокПоРезультатамПроверкиИПодбора(Параметры);
Если Параметры.Свойство("ДанныеКлючаСессииИСМП") Тогда
ПараметрыСеанса.ДанныеКлючаСессииИСМП = Параметры.ДанныеКлючаСессииИСМП;
КонецЕсли;
ЗапрашиватьДанныеСервисаИСМП = ОбщегоНазначенияИСМПКлиентСервер.ЗначениеПараметраСканированияЗапрашиватьДанныеСервисаИСМП(ПараметрыСканирования);
ОбщегоНазначенияИСМПКлиентСервер.УстановитьПараметрСканированияЗапрашиватьДанныеСервисаИСМП(ПараметрыСканирования, Ложь);
ПараметрыСканирования.СопоставлятьНоменклатуру = Ложь;
ПараметрыСканирования.ДетализацияСтруктурыХранения = Параметры.ДетализацияСтруктурыХранения;
РезультатПоискаПоДаннымДокумента = ШтрихкодированиеИС.ВложенныеШтрихкодыУпаковок(
ТаблицаШтрихкодовВерхнегоУровня.ВыгрузитьКолонку("ШтрихкодУпаковки"),
ПараметрыСканирования);
ДеревоУпаковокПоДаннымДокумента = РезультатПоискаПоДаннымДокумента.ДеревоУпаковок;
ДанныеНоменклатурыПоДаннымУПД = ШтрихкодированиеИСМПСлужебный.ДанныеМаркируемойНоменклатурыПоДаннымУПД(Параметры.ПроверяемыйДокумент);
ДляУпаковокТребоватьПодключениеМОТП = Истина;
Если Параметры.ВозможностьЗагрузкиДанныхБезПодключенияМОТП = Истина Тогда
ДляУпаковокТребоватьПодключениеМОТП = Ложь;
КонецЕсли;
ДанныеШтрихкодовСписок = Новый Массив;
Для Каждого КлючИЗначение Из ДанныеНоменклатурыПоДаннымУПД Цикл
Штрихкод = КлючИЗначение.Ключ;
Если ЗначениеЗаполнено(Штрихкод) Тогда
ДанныеШтрихкодовСписок.Добавить(
Новый Структура("Штрихкод, Количество", Штрихкод, 1));
КонецЕсли;
КонецЦикла;
ПараметрыСканирования.ДопустимыеВидыПродукции = ОбщегоНазначенияИСКлиентСервер.ВидыПродукцииИСМП(Истина);
ОбщегоНазначенияИСМПКлиентСервер.УстановитьПараметрСканированияЗапрашиватьДанныеСервисаИСМП(ПараметрыСканирования, ЗапрашиватьДанныеСервисаИСМП);
ПараметрыСканирования.ВыполняетсяЗагрузкаДанныхВФормуПроверкиИПодбораИСМП = Истина;
ПараметрыСканирования.ИспользуетсяСоответствиеШтрихкодовСтрокДерева = Ложь;
РезультатПолученияДереваИСМП = ШтрихкодированиеМОТП.ВложенныеШтрихкоды(
ДанныеШтрихкодовСписок, ПараметрыСканирования, ДляУпаковокТребоватьПодключениеМОТП);
Если РезультатПолученияДереваИСМП.ЕстьОшибки Тогда
ТекстОшибки = СтрШаблон(
НСтр("ru = 'Ошибка при создании Акта о расхождениях.
|%1'"),
РезультатПолученияДереваИСМП.ТекстОшибки);
Если РезультатПолученияДереваИСМП.ТребуетсяОбновлениеКлючаСессии
И Не ОбщегоНазначенияИСМПКлиентСервер.ЗначениеПараметраСканированияЗапрашиватьДанныеСервисаИСМП(ПараметрыСканирования) Тогда
ТекстОшибки = СтрШаблон(
НСтр("ru = '%1
|Включите опцию ""Запрашивать данные сервиса ГИС МТ""
|в панели администрирования ""Интеграция с ИС МП (обувь, одежда, табак...)""
|в разделе ""Настройки сканирования кодов маркировки"".'"),
ТекстОшибки);
КонецЕсли;
ВызватьИсключение ТекстОшибки;
КонецЕсли;
ДеревоУпаковокПоДаннымИСМП = РезультатПолученияДереваИСМП.ВложенныеШтрихкоды.ДеревоУпаковок;
ПараметрыСверки = СверкаКодовМаркировкиИСМП.ИнициализироватьПараметрыСверки();
ПараметрыСверки.ЭтоПродукцияМОТП = Истина;
ПараметрыСверки.СохраненнаяДетализацияСтруктурыХранения = Параметры.ДетализацияСтруктурыХранения;
ТаблицыТОРГ2 = СверкаКодовМаркировкиИСМП.ТаблицыРасхожденийПоДаннымЭДО(
ДеревоУпаковокПоДаннымДокумента,
ДеревоУпаковокПоДаннымИСМП,
ШтрихкодыБрак,
ПараметрыСверки);
ДанныеПроверкиИПодбора = Параметры.ДанныеПроверкиИПодбора.Получить();
ДанныеПроверкиИПодбора.Вставить("ТаблицыТОРГ2", ТаблицыТОРГ2);
Параметры.ДанныеПроверкиИПодбора = Новый ХранилищеЗначения(ДанныеПроверкиИПодбора);
ПараметрыОкончанияПроверки.ШтрихкодыУпаковокПланЭДО = ТаблицыТОРГ2.ШтрихкодыУпаковокПланЭДО;
ПараметрыОкончанияПроверки.ШтрихкодыУпаковокФактЭДО = ТаблицыТОРГ2.ШтрихкодыУпаковокФактЭДО;
КонецЕсли;
Если Параметры.СохранятьОписаниеGTIN Тогда
ТаблицаОписанияGTIN = ПроверкаИПодборПродукцииИСМП.ПустаяТаблицаОписанияGTIN();
ПараметрыОкончанияПроверки.ТаблицаОписанияGTIN = ТаблицаОписанияGTIN;
ПроверкаИПодборПродукцииИСМП.ЗаполнитьТаблицуОписанияGTINПоДеревуУпаковок(
ТаблицаОписанияGTIN,
Параметры.ДеревоМаркированнойПродукции);
КонецЕсли;
ПараметрыОкончанияПроверки.ДеревоМаркированнойПродукции = ДеревоМаркированнойПродукции;
ПроверкаИПодборПродукцииИСМП.ЗафиксироватьРезультатПроверкиИПодбора(ПараметрыОкончанияПроверки);
Если Параметры.СоздаватьАктОРасхождениях
И ЗначениеЗаполнено(ПараметрыОкончанияПроверки.СозданныйАктОРасхождениях) Тогда
РегистрыСведений.СтатусыПроверкиИПодбораДокументовИС.ОтразитьЗавершениеПроверкиДокумента(
ПараметрыОкончанияПроверки.СозданныйАктОРасхождениях,
Параметры.ВидМаркируемойПродукции,
Параметры.ДанныеПроверкиИПодбора,,
Параметры.Сценарий);
РегистрыСведений.СтатусыПроверкиИПодбораДокументовИС.ОтразитьЗавершениеПроверкиДокумента(
Параметры.ПроверяемыйДокумент,
Параметры.ВидМаркируемойПродукции,
Неопределено,
Перечисления.ТребуемоеДействиеДокументЭДО.Подтвердить,
Параметры.Сценарий);
Иначе
Если ЕстьРасхождения Тогда
ТребуемоеДействие = Перечисления.ТребуемоеДействиеДокументЭДО.Отклонить;
Иначе
ТребуемоеДействие = Перечисления.ТребуемоеДействиеДокументЭДО.Подтвердить;
КонецЕсли;
РегистрыСведений.СтатусыПроверкиИПодбораДокументовИС.ОтразитьЗавершениеПроверкиДокумента(
Параметры.ПроверяемыйДокумент,
Параметры.ВидМаркируемойПродукции,
Параметры.ДанныеПроверкиИПодбора,
ТребуемоеДействие,
Параметры.Сценарий);
КонецЕсли;
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ЗаголовокСообщения = НСтр("ru = 'Произошла ошибка при сохранении результатов проверки:'");
Информация = ИнформацияОбОшибке();
СообщенияПользователю = ПолучитьСообщенияПользователю(Истина);
ТекстыСообщенияЖР = Новый Массив;
ТекстыСообщенияЖР.Добавить(ЗаголовокСообщения);
ТекстыСообщенияЖР.Добавить(Символы.ПС);
ТекстыСообщенияЖР.Добавить(ОбработкаОшибок.ПодробноеПредставлениеОшибки(Информация));
Если СообщенияПользователю.Количество() Тогда
Для Каждого Сообщение Из СообщенияПользователю Цикл
ТекстыСообщенияЖР.Добавить(Символы.ПС);
ТекстыСообщенияЖР.Добавить(Сообщение.Текст);
КонецЦикла;
КонецЕсли;
ОбщегоНазначенияИСМП.ЗаписатьОшибкуВЖурналРегистрации(
СтрСоединить(ТекстыСообщенияЖР),
Метаданные.Обработки.ПроверкаИПодборПродукцииИСМП);
ТекстыСообщения = Новый Массив;
ТекстыСообщения.Добавить(ЗаголовокСообщения);
ТекстыСообщения.Добавить(Символы.ПС);
ТекстыСообщения.Добавить(ОбработкаОшибок.КраткоеПредставлениеОшибки(Информация));
Если СообщенияПользователю.Количество() Тогда
Для Каждого Сообщение Из СообщенияПользователю Цикл
ТекстыСообщения.Добавить(Символы.ПС);
ТекстыСообщения.Добавить(Сообщение.Текст);
КонецЦикла;
Иначе
ТекстыСообщения.Добавить(Символы.ПС);
ТекстыСообщения.Добавить(НСтр("ru = 'Подробности см. в журнале регистрации.'"));
КонецЕсли;
ВызватьИсключение СтрСоединить(ТекстыСообщения);
КонецПопытки;
КоличествоДанных = ИнтеграцияИС.КоличествоСтрокДереваЗначений(ДеревоМаркированнойПродукции);
ОценкаПроизводительности.ЗакончитьЗамерДлительнойОперации(ОписаниеЗамера, КоличествоДанных);
РезультатПроверки = Новый Структура();
Если Параметры.ПроверкаНеПоДокументу Тогда
РезультатПроверки.Вставить("ТаблицаШтрихкодовВерхнегоУровня", ТаблицаШтрихкодовВерхнегоУровня);
РезультатПроверки.Вставить("ТаблицаПодобраннойПровереннойПродукции", ТаблицаПодобраннойПровереннойПродукции);
Иначе
РезультатПроверки.Вставить("СозданныйАктОРасхождениях", ПараметрыОкончанияПроверки.СозданныйАктОРасхождениях);
КонецЕсли;
ЛогированиеЗапросовИСМП.ЗаполнитьВозвращаемыеДанныеФоновогоЗадания(РезультатПроверки);
ПоместитьВоВременноеХранилище(РезультатПроверки, АдресРезультата);
КонецПроцедуры
Функция ДетализацияСтруктурыХраненияДерева(ДеревоУпаковок) Экспорт
УпаковкиДерева = Новый Структура;
УпаковкиДерева.Вставить("ЕстьПачки", Ложь);
УпаковкиДерева.Вставить("ЕстьБлоки", Ложь);
УпаковкиДерева.Вставить("ЕстьКоробки", Ложь);
УпаковкиДерева.Вставить("ЕстьПалеты", Ложь);
УпаковкиДерева.Вставить("ЕстьПачкиБезБлока", Ложь);
УпаковкиДерева.Вставить("ЕстьБлокиБезКоробки", Ложь);
РазрешеныПачкиВКоробках = Истина;
Если ТипЗнч(ДеревоУпаковок) = Тип("ДеревоЗначений") Тогда
СтрокиДерева = ДеревоУпаковок.Строки;
Иначе
СтрокиДерева = Новый Массив;
СтрокиДерева.Добавить(ДеревоУпаковок);
КонецЕсли;
ОпределитьНаличиеУпаковокВСтрокахДерева(СтрокиДерева, УпаковкиДерева, РазрешеныПачкиВКоробках);
Если УпаковкиДерева.ЕстьКоробки Тогда
Если УпаковкиДерева.ЕстьБлоки И УпаковкиДерева.ЕстьПачки Тогда
ДетализацияСтруктурыХраненияДерева = Перечисления.ДетализацияСтруктурыХраненияИС.Полная
ИначеЕсли УпаковкиДерева.ЕстьБлоки Тогда
ДетализацияСтруктурыХраненияДерева = Перечисления.ДетализацияСтруктурыХраненияИС.КоробаСГрупповымиУпаковками;
Иначе
ДетализацияСтруктурыХраненияДерева = Перечисления.ДетализацияСтруктурыХраненияИС.Полная;
КонецЕсли;
ИначеЕсли УпаковкиДерева.ЕстьБлоки Тогда
ДетализацияСтруктурыХраненияДерева = Перечисления.ДетализацияСтруктурыХраненияИС.ГрупповыеУпаковкиСПотребительскими;
ИначеЕсли УпаковкиДерева.ЕстьПачки Тогда
ДетализацияСтруктурыХраненияДерева = Перечисления.ДетализацияСтруктурыХраненияИС.ПотребительскиеУпаковки;
ИначеЕсли УпаковкиДерева.ЕстьБлокиБезКоробки Тогда
ДетализацияСтруктурыХраненияДерева = Перечисления.ДетализацияСтруктурыХраненияИС.КоробаСГрупповымиУпаковками;
ИначеЕсли УпаковкиДерева.ЕстьПачкиБезБлока Тогда
ДетализацияСтруктурыХраненияДерева = Перечисления.ДетализацияСтруктурыХраненияИС.ГрупповыеУпаковкиСПотребительскими;
Иначе
ДетализацияСтруктурыХраненияДерева = Перечисления.ДетализацияСтруктурыХраненияИС.ПотребительскиеУпаковки;
КонецЕсли;
Возврат ДетализацияСтруктурыХраненияДерева;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ДополнитьКолонкамиРозничнойПродажи(Таблица)
Таблица.Колонки.Добавить("РазрешительныйРежимИдентификаторЗапросаГИСМТ", Метаданные.ОпределяемыеТипы.УникальныйИдентификаторИС.Тип);
Таблица.Колонки.Добавить("РазрешительныйРежимДатаЗапросаГИСМТ", Новый ОписаниеТипов("Строка"));
КонецПроцедуры
Функция ТаблицаРасхожденийУпаковокПоРезультатамПроверкиИПодбора(Параметры)
ТаблицаРасхождений = Новый ТаблицаЗначений;
ТаблицаРасхождений.Колонки.Добавить("ШтрихкодУпаковки", Новый ОписаниеТипов("СправочникСсылка.ШтрихкодыУпаковокТоваров"));
ТаблицаРасхождений.Колонки.Добавить("Штрихкод", ОбщегоНазначения.ОписаниеТипаСтрока(200));
ТаблицаРасхождений.Колонки.Добавить("Номенклатура", Метаданные.ОпределяемыеТипы.Номенклатура.Тип);
ТаблицаРасхождений.Колонки.Добавить("Характеристика", Метаданные.ОпределяемыеТипы.ХарактеристикаНоменклатуры.Тип);
ТаблицаРасхождений.Колонки.Добавить("Серия", Метаданные.ОпределяемыеТипы.СерияНоменклатуры.Тип);
ТаблицаРасхождений.Колонки.Добавить("ЭтоИзлишек", Новый ОписаниеТипов("Булево"));
Для Каждого СтрокаДерева Из Параметры.ДеревоМаркированнойПродукции.Строки Цикл
ЗаполнитьТаблицуРасхожденийПоСтрокеДерева(СтрокаДерева, ТаблицаРасхождений);
КонецЦикла;
Возврат ТаблицаРасхождений;
КонецФункции
Процедура ЗаполнитьТаблицуРасхожденийПоСтрокеДерева(СтрокаДерева, ТаблицаРасхождений)
ЭтоИзлишек = (СтрокаДерева.СтатусПроверки = Перечисления.СтатусыПроверкиНаличияПродукцииИС.НеЧислилась
Или СтрокаДерева.СтатусПроверки = СтрокаДерева.НеСодержитсяВДанныхДокумента);
ЭтоНедостача = СтрокаДерева.СтатусПроверки = Перечисления.СтатусыПроверкиНаличияПродукцииИС.Отсутствует;
ЭтоТипУпаковкиПоКоторомуФиксируютсяРасхождения = (СтрокаДерева.ТипУпаковки = Перечисления.ТипыУпаковок.МонотоварнаяУпаковка
Или СтрокаДерева.ТипУпаковки = Перечисления.ТипыУпаковок.МаркированныйТовар);
ВозможнаПроверкаПодчиненныхСтрок = (СтрокаДерева.ТипУпаковки = Перечисления.ТипыУпаковок.МонотоварнаяУпаковка
Или СтрокаДерева.ТипУпаковки = Перечисления.ТипыУпаковок.МультитоварнаяУпаковка
Или СтрокаДерева.ТипУпаковки = ПроверкаИПодборПродукцииИСМПКлиентСервер.ТипУпаковкиГрупповыеУпаковкиБезКоробки()
Или СтрокаДерева.ТипУпаковки = ПроверкаИПодборПродукцииИСМПКлиентСервер.ТипУпаковкиПотребительскиеУпаковкиБезУпаковки());
Если ЭтоТипУпаковкиПоКоторомуФиксируютсяРасхождения
И (ЭтоИзлишек Или ЭтоНедостача) Тогда
НоваяСтрокаТаблицы = ТаблицаРасхождений.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаТаблицы, СтрокаДерева);
НоваяСтрокаТаблицы.ЭтоИзлишек = ЭтоИзлишек;
Возврат;
КонецЕсли;
Если ВозможнаПроверкаПодчиненныхСтрок Тогда
Для Каждого ПодчиненнаяСтрока Из СтрокаДерева.Строки Цикл
ЗаполнитьТаблицуРасхожденийПоСтрокеДерева(ПодчиненнаяСтрока, ТаблицаРасхождений);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ОпределитьНаличиеУпаковокВСтрокахДерева(СтрокиДерева, УпаковкиДерева, РазрешеныПачкиВКоробках)
Для Каждого СтрокаДерева Из СтрокиДерева Цикл
Если УпаковкиДерева.ЕстьПачки И Не РазрешеныПачкиВКоробках Тогда
Прервать;
ИначеЕсли СтрокаДерева.ТипУпаковки = Перечисления.ТипыУпаковок.МаркированныйТовар Тогда
Если СтрокаДерева.Родитель <> Неопределено
И СтрокаДерева.Родитель.ТипУпаковки = ПроверкаИПодборПродукцииИСМПКлиентСервер.ТипУпаковкиПотребительскиеУпаковкиБезУпаковки() Тогда
УпаковкиДерева.ЕстьПачкиБезБлока = Истина;
Иначе
УпаковкиДерева.ЕстьПачки = Истина;
Если Не РазрешеныПачкиВКоробках Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если СтрокаДерева.ВидУпаковки = Перечисления.ВидыУпаковокИС.Групповая
Или СтрокаДерева.ВидУпаковки = Перечисления.ВидыУпаковокИС.Набор Тогда
Если СтрокаДерева.Родитель <> Неопределено
И СтрокаДерева.Родитель.ТипУпаковки = ПроверкаИПодборПродукцииИСМПКлиентСервер.ТипУпаковкиГрупповыеУпаковкиБезКоробки() Тогда
УпаковкиДерева.ЕстьБлокиБезКоробки = Истина;
Иначе
УпаковкиДерева.ЕстьБлоки = Истина;
КонецЕсли;
КонецЕсли;
Если Не УпаковкиДерева.ЕстьКоробки Тогда
УпаковкиДерева.ЕстьКоробки = (СтрокаДерева.ВидУпаковки = Перечисления.ВидыУпаковокИС.Логистическая);
КонецЕсли;
Если СтрокаДерева.Строки.Количество() > 0 Тогда
ОпределитьНаличиеУпаковокВСтрокахДерева(СтрокаДерева.Строки, УпаковкиДерева, РазрешеныПачкиВКоробках);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьТаблицуПодобраннойТабачнойПродукции(ТаблицаМаркируемойПродукции, ДанныеДокумента, СвойстваВидаПродукции)
Если ДанныеДокумента.РежимПодбораСуществующихУпаковок
Или Не ДанныеДокумента.ПроверкаЭлектронногоДокумента Тогда
НомерСтроки = 1;
Для Каждого СтрокаИсточника Из ТаблицаМаркируемойПродукции Цикл
СтрокаПодобраннойПродукции = ДанныеДокумента.ПодобраннаяМаркируемаяПродукция.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаПодобраннойПродукции, СтрокаИсточника,, "КоличествоПотребительскихУпаковок");
СтрокаПодобраннойПродукции.НоменклатураСопоставлена = ЗначениеЗаполнено(СтрокаПодобраннойПродукции.Номенклатура);
СтрокаПодобраннойПродукции.ПредставлениеGTIN = ПроверкаИПодборПродукцииИСМПКлиентСервер.ПредставлениеМассиваGTIN(СтрокаПодобраннойПродукции.КодыGTIN);
Если СтрокаПодобраннойПродукции.КодыGTIN.Количество() = 1 Тогда
СтрокаПодобраннойПродукции.GTIN = СтрокаПодобраннойПродукции.КодыGTIN[0].Значение;
КонецЕсли;
СтрокаПодобраннойПродукции.НомерСтроки = НомерСтроки;
ПроверкаИПодборПродукцииИСМПКлиентСервер.УстановитьИндексКартинкиСостояниеПодбораКодаМаркировки(СтрокаПодобраннойПродукции, СвойстваВидаПродукции);
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
Иначе
ИменаКолонок = Новый Массив;
ИменаКолонок.Добавить("Номенклатура");
ИменаКолонок.Добавить("Характеристика");
Если ДанныеДокумента.ВидМаркируемойПродукции = Перечисления.ВидыПродукцииИС.Табак Тогда
ИменаКолонок.Добавить("МРЦ");
КонецЕсли;
ИменаКолонокСтрокой = СтрСоединить(ИменаКолонок, ",");
Для Каждого СтрокаИсточника Из ТаблицаМаркируемойПродукции Цикл
СтруктураПоиска = Новый Структура(ИменаКолонокСтрокой);
ЗаполнитьЗначенияСвойств(СтруктураПоиска, СтрокаИсточника);
Если СтрокаИсточника.КодыGTIN.Количество() = 1 Тогда
СтруктураПоиска.Вставить("GTIN", СтрокаИсточника.КодыGTIN[0].Значение);
КонецЕсли;
НайденныеСтроки = ДанныеДокумента.ПодобраннаяМаркируемаяПродукция.НайтиСтроки(СтруктураПоиска);
Если НайденныеСтроки.Количество() = 0 Тогда
СтрокаПодобраннойПродукции = ДанныеДокумента.ПодобраннаяМаркируемаяПродукция.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаПодобраннойПродукции, СтруктураПоиска);
СтрокаПодобраннойПродукции.НоменклатураСопоставлена = ЗначениеЗаполнено(СтрокаПодобраннойПродукции.Номенклатура);
СтрокаПодобраннойПродукции.КодыGTIN = СтрокаИсточника.КодыGTIN;
СтрокаПодобраннойПродукции.ПредставлениеGTIN = ПроверкаИПодборПродукцииИСМПКлиентСервер.ПредставлениеМассиваGTIN(СтрокаПодобраннойПродукции.КодыGTIN);
Иначе
СтрокаПодобраннойПродукции = НайденныеСтроки[0];
КонецЕсли;
СтрокаПодобраннойПродукции.Количество = СтрокаПодобраннойПродукции.Количество + СтрокаИсточника.Количество;
КонецЦикла;
НомерСтроки = 0;
Для Каждого СтрокаПодобраннойПродукции Из ДанныеДокумента.ПодобраннаяМаркируемаяПродукция Цикл
НомерСтроки = НомерСтроки + 1;
СтрокаПодобраннойПродукции.НомерСтроки = НомерСтроки;
ПроверкаИПодборПродукцииИСМПКлиентСервер.УстановитьИндексКартинкиСостояниеПодбораКодаМаркировки(СтрокаПодобраннойПродукции, СвойстваВидаПродукции);
КонецЦикла;
КонецЕсли;
ИнтеграцияИСПереопределяемый.ЗаполнитьСлужебныеРеквизитыВКоллекции(Неопределено, ДанныеДокумента.ПодобраннаяМаркируемаяПродукция);
КонецПроцедуры
Процедура ДополнитьТаблицуПодобраннойТабачнойПродукции(ДанныеПроверяемогоДокумента, ДанныеДокумента, ВидПродукции, ПараметрыСканирования)
ТаблицаМаркируемойПродукции = ДанныеПроверяемогоДокумента.МаркированныеТовары.СкопироватьКолонки();
ДополнитьТаблицуМаркируемойПродукции(ДанныеПроверяемогоДокумента.ДеревоУпаковок, ТаблицаМаркируемойПродукции);
ПроверкаИПодборПродукцииИСМП.ДополнитьТаблицуПодобраннойМаркируемойПродукции(
ТаблицаМаркируемойПродукции, ДанныеДокумента, ВидПродукции, ПараметрыСканирования);
КонецПроцедуры
Процедура ЗаполнитьДеревоМаркированнойПродукции(ДеревоУпаковокДокумента, ДанныеДокумента, ПараметрыСканирования, ПринудительноУстановитьДетализацию)
Если ПринудительноУстановитьДетализацию = Неопределено Тогда
ДетализацияСтруктурыХраненияДанныхДокумента = ДетализацияСтруктурыХраненияДерева(ДеревоУпаковокДокумента);
Если ДанныеДокумента.СохраненнаяДетализацияСтруктурыХранения <> Неопределено Тогда
Если ДеревоУпаковокДокумента.Строки.Количество() = 0 Тогда
ДанныеДокумента.ДетализацияСтруктурыХранения = ДанныеДокумента.СохраненнаяДетализацияСтруктурыХранения;
ИначеЕсли ДетализацияСтруктурыХраненияДанныхДокумента = Перечисления.ДетализацияСтруктурыХраненияИС.Полная
И ДанныеДокумента.СохраненнаяДетализацияСтруктурыХранения = Перечисления.ДетализацияСтруктурыХраненияИС.КоробаСГрупповымиУпаковками Тогда
ДанныеДокумента.ДетализацияСтруктурыХранения = ДанныеДокумента.СохраненнаяДетализацияСтруктурыХранения;
ИначеЕсли ДетализацияСтруктурыХраненияДанныхДокумента <> Перечисления.ДетализацияСтруктурыХраненияИС.ПотребительскиеУпаковки Тогда
ДанныеДокумента.ДетализацияСтруктурыХранения = ДетализацияСтруктурыХраненияДанныхДокумента;
Иначе
ДанныеДокумента.ДетализацияСтруктурыХранения = ДанныеДокумента.СохраненнаяДетализацияСтруктурыХранения;
КонецЕсли;
Иначе
ДанныеДокумента.ДетализацияСтруктурыХранения = ДетализацияСтруктурыХраненияДерева(ДеревоУпаковокДокумента);
КонецЕсли;
Иначе
ДанныеДокумента.ДетализацияСтруктурыХранения = ПринудительноУстановитьДетализацию;
КонецЕсли;
КоллекцияСтрокПриемника = ДанныеДокумента.ДеревоМаркированнойПродукции.Строки;
Если ДанныеДокумента.ПараметрыПроверкиКодовМаркировки.КонтролироватьСоставГрупповойУпаковкиПриИзмененииСтрокиДерева Тогда
ДанныеДокумента.ПараметрыПроверкиКодовМаркировки.КонтролироватьСоставГрупповойУпаковкиПриИзмененииСтрокиДерева = Ложь;
ДанныеДокумента.ПараметрыПроверкиКодовМаркировки.КонтролироватьСоставГрупповойУпаковки = Истина;
КонецЕсли;
Для Каждого СтрокаДереваУпаковок Из ДеревоУпаковокДокумента.Строки Цикл
ДобавитьСтрокуДереваМаркированнойПродукцииПриЗагрузке(СтрокаДереваУпаковок, КоллекцияСтрокПриемника, ДанныеДокумента, ПараметрыСканирования);
КонецЦикла;
Если ДанныеДокумента.СтрокаПачкиБезБлока = Неопределено
И ДанныеДокумента.ДетализацияСтруктурыХранения <> Перечисления.ДетализацияСтруктурыХраненияИС.ПотребительскиеУпаковки Тогда
ДобавленнаяСтрокаПачкиБезБлока(ДанныеДокумента);
КонецЕсли;
Если ДанныеДокумента.СтрокаБлокиБезКоробки = Неопределено
И ДанныеДокумента.ДетализацияСтруктурыХранения <> Перечисления.ДетализацияСтруктурыХраненияИС.ПотребительскиеУпаковки
И ДанныеДокумента.ДетализацияСтруктурыХранения <> Перечисления.ДетализацияСтруктурыХраненияИС.ГрупповыеУпаковкиСПотребительскими Тогда
ДобавленнаяСтрокаБлокиБезКоробки(ДанныеДокумента);
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьШтрихкодыВерхнегоУровняИдентификаторамиЗапросовГИСМТ(СтрокиДерева, ТаблицаШтрихкодов)
Для Каждого Строка Из СтрокиДерева Цикл
СтруктураПоиска = Новый Структура("Штрихкод", Строка.Штрихкод);
СтрокиТаблицы = ТаблицаШтрихкодов.НайтиСтроки(СтруктураПоиска);
Для Каждого СтрокаТаблицы Из СтрокиТаблицы Цикл
СтрокаТаблицы.РазрешительныйРежимИдентификаторЗапросаГИСМТ = Строка.РазрешительныйРежимИдентификаторЗапросаГИСМТ;
СтрокаТаблицы.РазрешительныйРежимДатаЗапросаГИСМТ = Строка.РазрешительныйРежимДатаЗапросаГИСМТ;
КонецЦикла;
ЗаполнитьШтрихкодыВерхнегоУровняИдентификаторамиЗапросовГИСМТ(Строка.Строки, ТаблицаШтрихкодов);
КонецЦикла;
КонецПроцедуры
Процедура ДобавитьСтрокуДереваМаркированнойПродукцииПриЗагрузке(СтрокаИсточника, КоллекцияСтрокПриемника, ДанныеДокумента, ПараметрыСканирования)
КешГрупповыхУпаковок = ДанныеДокумента.КешГрупповыхУпаковок;
Если СтрокаИсточника.ТипУпаковки = ПроверкаИПодборПродукцииИСМПКлиентСервер.ТипУпаковкиПотребительскиеУпаковкиБезУпаковки() Тогда
Если ДанныеДокумента.ДетализацияСтруктурыХранения <> Перечисления.ДетализацияСтруктурыХраненияИС.ПотребительскиеУпаковки Тогда
НоваяСтрока = ДанныеДокумента.СтрокаПачкиБезБлока;
Если НоваяСтрока = Неопределено Тогда
НоваяСтрока = ДобавленнаяСтрокаПачкиБезБлока(ДанныеДокумента);
КонецЕсли;
Иначе
Для Каждого СтрокаИсточникаПачка Из СтрокаИсточника.Строки Цикл
ДобавитьСтрокуДереваМаркированнойПродукцииПриЗагрузке(СтрокаИсточникаПачка, КоллекцияСтрокПриемника, ДанныеДокумента, ПараметрыСканирования);
КонецЦикла;
Возврат;
КонецЕсли;
ИначеЕсли СтрокаИсточника.ТипУпаковки = ПроверкаИПодборПродукцииИСМПКлиентСервер.ТипУпаковкиГрупповыеУпаковкиБезКоробки() Тогда
Если ДанныеДокумента.ДетализацияСтруктурыХранения <> Перечисления.ДетализацияСтруктурыХраненияИС.ПотребительскиеУпаковки
И ДанныеДокумента.ДетализацияСтруктурыХранения <> Перечисления.ДетализацияСтруктурыХраненияИС.ГрупповыеУпаковкиСПотребительскими Тогда
НоваяСтрока = ДанныеДокумента.СтрокаБлокиБезКоробки;
Если НоваяСтрока = Неопределено Тогда
НоваяСтрока = ДобавленнаяСтрокаБлокиБезКоробки(ДанныеДокумента);
КонецЕсли;
Иначе
Для Каждого СтрокаИсточникаБлок Из СтрокаИсточника.Строки Цикл
Если ДанныеДокумента.ДетализацияСтруктурыХранения = Перечисления.ДетализацияСтруктурыХраненияИС.ГрупповыеУпаковкиСПотребительскими Тогда
ДобавитьСтрокуДереваМаркированнойПродукцииПриЗагрузке(СтрокаИсточникаБлок, КоллекцияСтрокПриемника, ДанныеДокумента, ПараметрыСканирования);
Иначе
Для Каждого СтрокаИсточникаПачка Из СтрокаИсточникаБлок.Строки Цикл
ДобавитьСтрокуДереваМаркированнойПродукцииПриЗагрузке(СтрокаИсточникаПачка, КоллекцияСтрокПриемника, ДанныеДокумента, ПараметрыСканирования);
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат;
КонецЕсли;
ИначеЕсли СтрокаИсточника.Родитель = Неопределено
И СтрокаИсточника.ТипУпаковки = Перечисления.ТипыУпаковок.МаркированныйТовар
И ДанныеДокумента.ДетализацияСтруктурыХранения <> Перечисления.ДетализацияСтруктурыХраненияИС.ПотребительскиеУпаковки Тогда
СтрокаПачкиБезБлока = ДанныеДокумента.СтрокаПачкиБезБлока;
Если СтрокаПачкиБезБлока = Неопределено Тогда
СтрокаПачкиБезБлока = ДобавленнаяСтрокаПачкиБезБлока(ДанныеДокумента);
КонецЕсли;
НоваяСтрока = СтрокаПачкиБезБлока.Строки.Добавить();
НоваяСтрока.СтатусПроверки = ДанныеДокумента.НачальныйСтатусПроверки;
ИначеЕсли СтрокаИсточника.Родитель = Неопределено
И (ПроверкаИПодборПродукцииМОТПКлиентСервер.ЭтоУпаковкаБлока(СтрокаИсточника)
Или ПроверкаИПодборПродукцииМОТПКлиентСервер.ЭтоУпаковкаНабор(СтрокаИсточника))
И ДанныеДокумента.ДетализацияСтруктурыХранения <> Перечисления.ДетализацияСтруктурыХраненияИС.ПотребительскиеУпаковки
И ДанныеДокумента.ДетализацияСтруктурыХранения <> Перечисления.ДетализацияСтруктурыХраненияИС.ГрупповыеУпаковкиСПотребительскими Тогда
СтрокаБлокиБезКоробки = ДанныеДокумента.СтрокаБлокиБезКоробки;
Если СтрокаБлокиБезКоробки = Неопределено Тогда
СтрокаБлокиБезКоробки = ДобавленнаяСтрокаБлокиБезКоробки(ДанныеДокумента);
КонецЕсли;
НоваяСтрока = СтрокаБлокиБезКоробки.Строки.Добавить();
НоваяСтрока.СтатусПроверки = ДанныеДокумента.НачальныйСтатусПроверки;
ИначеЕсли СтрокаИсточника.Родитель <> Неопределено
И (ПроверкаИПодборПродукцииМОТПКлиентСервер.ЭтоУпаковкаБлока(СтрокаИсточника.Родитель)
Или ПроверкаИПодборПродукцииМОТПКлиентСервер.ЭтоУпаковкаНабор(СтрокаИсточника.Родитель))
И СтрокаИсточника.ТипУпаковки = Перечисления.ТипыУпаковок.МаркированныйТовар
И ДанныеДокумента.ДетализацияСтруктурыХранения = Перечисления.ДетализацияСтруктурыХраненияИС.КоробаСГрупповымиУпаковками Тогда
Возврат;
Иначе
НоваяСтрока = КоллекцияСтрокПриемника.Добавить();
НоваяСтрока.СтатусПроверки = ДанныеДокумента.НачальныйСтатусПроверки;
КонецЕсли;
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника);
НоваяСтрока.СтатусКодаМаркировки = СтрокаИсточника.Статус;
ОшибкаПроверкиККТ = ДанныеДокумента.ОшибкиПроверкиСредствамиККТ.Получить(НоваяСтрока.Штрихкод);
Если ОшибкаПроверкиККТ <> Неопределено Тогда
НоваяСтрока.ТекстОшибкиПроверкиСредствамиККТ = ОшибкаПроверкиККТ.ОписаниеОшибок;
Если ОшибкаПроверкиККТ.ТребуетсяПолныйКодМаркировки Тогда
НоваяСтрока.СостояниеТребованияПолногоКодаККТ = 1;
КонецЕсли;
КонецЕсли;
ПроверкаИПодборПродукцииИСМП.ОбработкаСтрокиЧастичногоВыбытияПриВосстановленииДанных(
НоваяСтрока,
СтрокаИсточника,
ПараметрыСканирования,
ДанныеДокумента.ВидМаркируемойПродукции);
Если ДанныеДокумента.ЗначенияШтрихкодовОбработанныхСОшибками.Найти(НоваяСтрока.Штрихкод) <> Неопределено Тогда
НоваяСтрока.ТекстОбработанСОшибкойВГИСМТ = НСтр("ru = 'Пакет обработан с ошибкой в ГИС МТ'");
НоваяСтрока.ОбработанСОшибкойВГИСМТ = Истина;
КонецЕсли;
ПроверкаИПодборПродукцииИСМПКлиентСервер.ЗаполнитьСвойствоВключаетМРЦ(
ДанныеДокумента.ВидМаркируемойПродукции, НоваяСтрока, СтрокаИсточника);
Если НоваяСтрока.ТипУпаковки = Перечисления.ТипыУпаковок.ПустаяСсылка() Тогда
НоваяСтрока.ТипУпаковки = Перечисления.ТипыУпаковок.МонотоварнаяУпаковка;
ИначеЕсли НоваяСтрока.ТипУпаковки = Перечисления.ТипыУпаковок.МаркированныйТовар
И НЕ ЗначениеЗаполнено(НоваяСтрока.Номенклатура) Тогда
НоваяСтрока.ПредставлениеСодержимоеУпаковки = СтрокаИсточника.ПредставлениеНоменклатуры;
НоваяСтрока.ПредставлениеСодержимогоДоСопоставления = СтрокаИсточника.ПредставлениеНоменклатуры;
КонецЕсли;
Если ТипЗнч(ДанныеДокумента.ПроверяемыйДокумент) = Тип("ДокументСсылка.МаркировкаТоваровИСМП") Тогда
ОтрезатьСодержимоеБлока = Ложь;
ОтрезатьСодержимоеЛогистическойУпаковки = Ложь;
Иначе
ОтрезатьСодержимоеБлока =
(СтрокаИсточника.ВидУпаковки = Перечисления.ВидыУпаковокИС.Групповая Или СтрокаИсточника.ВидУпаковки = Перечисления.ВидыУпаковокИС.Набор)
И (ДанныеДокумента.ДетализацияСтруктурыХранения = Перечисления.ДетализацияСтруктурыХраненияИС.КоробаСГрупповымиУпаковками
Или ДанныеДокумента.ДетализацияСтруктурыХранения = Перечисления.ДетализацияСтруктурыХраненияИС.ПалетыСМонотоварнымиКоробами
Или (СтрокаИсточника.КоличествоПотребительскихУпаковок > 0 И СтрокаИсточника.Строки.Количество() = 0));
ОтрезатьСодержимоеЛогистическойУпаковки =
СтрокаИсточника.ВидУпаковки = Перечисления.ВидыУпаковокИС.Логистическая
И (ЗначениеЗаполнено(СтрокаИсточника.Номенклатура) И СтрокаИсточника.КоличествоПотребительскихУпаковок > 0 И ЗначениеЗаполнено(СтрокаИсточника.GTIN))
И (ДанныеДокумента.ДетализацияСтруктурыХранения = Перечисления.ДетализацияСтруктурыХраненияИС.ПалетыСМонотоварнымиКоробами
Или СтрокаИсточника.Строки.Количество() = 0);
Если ОтрезатьСодержимоеЛогистическойУпаковки
И СтрокаИсточника.СоставКодаМаркировки <> Неопределено
И Не СтрокаИсточника.СоставКодаМаркировки.Свойство("GTIN") Тогда
ОтрезатьСодержимоеЛогистическойУпаковки = Ложь;
КонецЕсли;
КонецЕсли;
НоваяСтрока.КоличествоПодчиненныхПотребительскихУпаковок = СтрокаИсточника.КоличествоПотребительскихУпаковок;
Если (НоваяСтрока.ВидУпаковки = Перечисления.ВидыУпаковокИС.Групповая
Или НоваяСтрока.ВидУпаковки = Перечисления.ВидыУпаковокИС.Набор)
И ОтрезатьСодержимоеБлока Тогда
НоваяСтрока.НеПересчитыватьКоличествоПотребительскихУпаковок = Истина;
КонецЕсли;
Если НоваяСтрока.ВидУпаковки = Перечисления.ВидыУпаковокИС.Логистическая
И ОтрезатьСодержимоеЛогистическойУпаковки Тогда
НоваяСтрока.НеПересчитыватьКоличествоПотребительскихУпаковок = Истина;
КонецЕсли;
КоллекцияСтрокНовойСтроки = НоваяСтрока.Строки;
ПроверкаИПодборПродукцииИСМПКлиентСервер.УстановитьДоступностьУпаковкиДляПроверки(НоваяСтрока, ДанныеДокумента.ДоступныеДляПроверкиУпаковки);
ПроверкаИПодборПродукцииИСМПКлиентСервер.СформироватьПредставлениеДляСтрокиДереваМаркированнойПродукции(НоваяСтрока, ДанныеДокумента.ВидМаркируемойПродукции);
ПроверкаИПодборПродукцииМОТПКлиентСервер.СформироватьПредставлениеСодержимогоУпаковки(НоваяСтрока);
Если Не ДанныеДокумента.ПараметрыПроверкиКодовМаркировки.РежимИсправленияОшибокПослеПередачиКодов
Или НоваяСтрока.ОбработанСОшибкойВГИСМТ
Или (НоваяСтрока.ТипУпаковки = Перечисления.ТипыУпаковок.МаркированныйТовар
И НоваяСтрока.Родитель <> Неопределено
И НоваяСтрока.Родитель.ОбработанСОшибкойВГИСМТ) Тогда
ПроверкаИПодборПродукцииМОТПКлиентСервер.ПроверитьДопустимостьКодаМаркировки(НоваяСтрока, ДанныеДокумента.ПараметрыПроверкиКодовМаркировки, ДанныеДокумента.РежимПодбораСуществующихУпаковок);
КонецЕсли;
Если ИнтеграцияИСКлиентСервер.ЭтоУпаковка(НоваяСтрока.ТипУпаковки) Тогда
ДанныеДокумента.УпаковкиДокумента.Добавить(НоваяСтрока.Штрихкод);
КонецЕсли;
Для Каждого ПодчиненнаяСтрокаИсточника Из СтрокаИсточника.Строки Цикл
ДобавитьСтрокуДереваМаркированнойПродукцииПриЗагрузке(ПодчиненнаяСтрокаИсточника, КоллекцияСтрокНовойСтроки, ДанныеДокумента, ПараметрыСканирования);
КонецЦикла;
Если ДанныеДокумента.ПараметрыПроверкиКодовМаркировки.КонтролироватьСоставГрупповойУпаковки
И НоваяСтрока.ВидУпаковки = ПредопределенноеЗначение("Перечисление.ВидыУпаковокИС.Групповая")
И КешГрупповыхУпаковок.Получить(НоваяСтрока.НормализованныйШтрихкод) = Неопределено Тогда
ПроверкаИПодборПродукцииМОТПКлиентСервер.ПроверитьСоставАгрегата(НоваяСтрока, ДанныеДокумента.ПараметрыПроверкиКодовМаркировки);
КешГрупповыхУпаковок.Вставить(НоваяСтрока.НормализованныйШтрихкод, Истина);
КонецЕсли;
Если НоваяСтрока.НедопустимыйКодМаркировки Тогда
ДанныеДокумента.КоличествоНедопустимыхКодовМаркировки = ДанныеДокумента.КоличествоНедопустимыхКодовМаркировки + 1;
КонецЕсли;
КонецПроцедуры
Функция ДобавленнаяСтрокаПачкиБезБлока(ДанныеДокумента)
НоваяСтрока = ДанныеДокумента.ДеревоМаркированнойПродукции.Строки.Вставить(0);
ПроверкаИПодборПродукцииМОТПКлиентСервер.ЗаполнитьСтрокуПачкиБезБлока(НоваяСтрока, ДанныеДокумента.ВидМаркируемойПродукции);
ДанныеДокумента.СтрокаПачкиБезБлока = НоваяСтрока;
Возврат НоваяСтрока;
КонецФункции
Функция ДобавленнаяСтрокаБлокиБезКоробки(ДанныеДокумента)
СтрокиДерева = ДанныеДокумента.ДеревоМаркированнойПродукции.Строки;
Если СтрокиДерева.Количество() = 0 Тогда
НоваяСтрока = СтрокиДерева.Вставить(0);
ИначеЕсли СтрокиДерева[0].ТипУпаковки <> ПроверкаИПодборПродукцииИСМПКлиентСервер.ТипУпаковкиПотребительскиеУпаковкиБезУпаковки() Тогда
НоваяСтрока = СтрокиДерева.Вставить(0);
Иначе
НоваяСтрока = СтрокиДерева.Вставить(1);
КонецЕсли;
ПроверкаИПодборПродукцииМОТПКлиентСервер.ЗаполнитьСтрокуБлокиБезКоробки(НоваяСтрока, ДанныеДокумента.ВидМаркируемойПродукции);
ДанныеДокумента.СтрокаБлокиБезКоробки = НоваяСтрока;
Возврат НоваяСтрока;
КонецФункции
Функция ДеревоМаркированнойПродукции()
ТипБулево = Новый ОписаниеТипов("Булево");
ТипЧисло = Новый ОписаниеТипов("Число");
ТипСтрока = Новый ОписаниеТипов("Строка");
ДеревоМаркированнойПродукции = Новый ДеревоЗначений();
ДеревоМаркированнойПродукции.Колонки.Добавить("СтатусПроверки", Новый ОписаниеТипов("ПеречислениеСсылка.СтатусыПроверкиНаличияПродукцииИС"));
ДеревоМаркированнойПродукции.Колонки.Добавить("ПредставлениеПроверкиПодчиненных", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("ТипУпаковки", Новый ОписаниеТипов("ПеречислениеСсылка.ПрочиеЗоныПересчетаПродукцииИСМП, ПеречислениеСсылка.ТипыУпаковок"));
ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПодчиненныхУпаковок", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПодчиненныхВНаличии", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПодчиненныхОтсутствует", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("Штрихкод", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("ВсяУпаковкаПроверена", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("ИндексКартинкиТипУпаковки", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("ИндексКартинкиСтатусПроверки", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("ТребуетсяПеремаркировка", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("Представление", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("ПредставлениеСодержимоеУпаковки");
ДеревоМаркированнойПродукции.Колонки.Добавить("ПредставлениеСодержимогоДоСопоставления", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПодчиненныхОтложено", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПодчиненныхПотребительскихУпаковок", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("НомерСтикераОтложено", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("НеСодержитсяВДанныхДокумента", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("НеСоответствуетОтбору", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("ИдетПроверкаДаннойУпаковки", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПодчиненныхНеЧислилось", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПодчиненныхНеПроверялось", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПодчиненныхВсего", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("ХешСумма", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("Номенклатура", Метаданные.ОпределяемыеТипы.Номенклатура.Тип);
ДеревоМаркированнойПродукции.Колонки.Добавить("Характеристика", Метаданные.ОпределяемыеТипы.ХарактеристикаНоменклатуры.Тип);
ДеревоМаркированнойПродукции.Колонки.Добавить("Серия", Метаданные.ОпределяемыеТипы.СерияНоменклатуры.Тип);
ДеревоМаркированнойПродукции.Колонки.Добавить("ИдентификаторСтроки", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("ВУпаковкеРазныеСерии", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("ВУпаковкеРазнаяНоменклатура", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("ВУпаковкеРазныеХарактеристики", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("ИННВладельца", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("ИННПроизводителя", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("МРЦ", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("ВключаетМРЦ", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("СтатусКодаМаркировки", Новый ОписаниеТипов("ПеречислениеСсылка.СтатусыКодовМаркировкиМОТП"));
ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПодчиненныхГрупповыхУпаковок", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("GTIN", Метаданные.ОпределяемыеТипы.GTIN.Тип);
ДеревоМаркированнойПродукции.Колонки.Добавить("ВУпаковкеРазныйGTIN", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("ПредставлениеПроверкиКодаМаркировки", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("НедопустимыйКодМаркировки", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("Количество", ОбщегоНазначения.ОписаниеТипаЧисло(15, 3));
ДеревоМаркированнойПродукции.Колонки.Добавить("ПроизвольнаяЕдиницаУчета", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("ТребуетВзвешивания", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("НеПересчитыватьКоличествоПотребительскихУпаковок", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("СодержимоеНедоступно", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("ВидУпаковки", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыУпаковокИС"));
ДеревоМаркированнойПродукции.Колонки.Добавить("ТипШтрихкода", Новый ОписаниеТипов("ПеречислениеСсылка.ТипыШтрихкодов"));
ДеревоМаркированнойПродукции.Колонки.Добавить("ТекстОшибкиПроверкиСредствамиККТ", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("СостояниеТребованияПолногоКодаККТ" , ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("ЧастичноеВыбытие", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("ЧастичноеВыбытиеВариантУчета", Новый ОписаниеТипов("ПеречислениеСсылка.ВариантыУчетаЧастичногоВыбытияИС"));
ДеревоМаркированнойПродукции.Колонки.Добавить("ЧастичноеВыбытиеНоменклатура", Метаданные.ОпределяемыеТипы.Номенклатура.Тип);
ДеревоМаркированнойПродукции.Колонки.Добавить("ЧастичноеВыбытиеХарактеристика", Метаданные.ОпределяемыеТипы.ХарактеристикаНоменклатуры.Тип);
ДеревоМаркированнойПродукции.Колонки.Добавить("ПлановоеКоличествоПотребительскихУпаковок", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("ТекстОбработанСОшибкойВГИСМТ", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("ОбработанСОшибкойВГИСМТ", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("ХешСуммаНормализации", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("НормализованныйШтрихкод", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("ДатаПроизводства", Новый ОписаниеТипов("Дата"));
ДеревоМаркированнойПродукции.Колонки.Добавить("ВСеройЗоне", ТипБулево);
ДеревоМаркированнойПродукции.Колонки.Добавить("Коэффициент", ТипЧисло);
ДеревоМаркированнойПродукции.Колонки.Добавить("РазрешительныйРежимИдентификаторЗапросаГИСМТ", Метаданные.ОпределяемыеТипы.УникальныйИдентификаторИС.Тип);
ДеревоМаркированнойПродукции.Колонки.Добавить("РазрешительныйРежимДатаЗапросаГИСМТ", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("ОрганыБлокировкиКМ", ТипСтрока);
ДеревоМаркированнойПродукции.Колонки.Добавить("ПродажаПоДаннымОффлайнРежима", ТипБулево);
Возврат ДеревоМаркированнойПродукции;
КонецФункции
Функция ПодобраннаяМаркируемаяПродукция()
ПодобраннаяМаркируемаяПродукция = Новый ТаблицаЗначений();
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("Номенклатура", Метаданные.ОпределяемыеТипы.Номенклатура.Тип);
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("Характеристика", Метаданные.ОпределяемыеТипы.ХарактеристикаНоменклатуры.Тип);
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("Серия", Метаданные.ОпределяемыеТипы.СерияНоменклатуры.Тип);
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("КоличествоПодобрано", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("ИндексКодаМаркировки", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("МРЦ", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("ВключаетМРЦ", Новый ОписаниеТипов("Булево"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("GTIN", Метаданные.ОпределяемыеТипы.GTIN.Тип);
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("ПредставлениеНоменклатуры", Новый ОписаниеТипов("Строка"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("СтатусУказанияСерий", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("ХарактеристикиИспользуются", Новый ОписаниеТипов("Булево"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("ТипНоменклатуры", Метаданные.ОпределяемыеТипы.ТипНоменклатуры.Тип);
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("КоличествоИС", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("НоменклатураСопоставлена", Новый ОписаниеТипов("Булево"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("КодыGTIN", Новый ОписаниеТипов("СписокЗначений"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("ПредставлениеGTIN", Новый ОписаниеТипов("Строка"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("НоменклатураСопоставленаПоУПД", Новый ОписаниеТипов("Булево"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("КоличествоПотребительскихУпаковок", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("КоличествоПотребительскихУпаковокВСтруктуреУпаковок", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("ПроизвольнаяЕдиницаУчета", Новый ОписаниеТипов("Булево"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("ТребуетВзвешивания", Новый ОписаниеТипов("Булево"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("КоличествоПотребительскихУпаковокТребующихВзвешивания", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("КоличествоПодобраноВзвешено", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("КоличествоПодобраноВзвешеноОСУ", Новый ОписаниеТипов("Число"));
ПодобраннаяМаркируемаяПродукция.Колонки.Добавить("КоличествоПотребительскихУпаковокОСУ", Новый ОписаниеТипов("Число"));
Возврат ПодобраннаяМаркируемаяПродукция;
КонецФункции
Процедура ЗаполнитьТаблицуПродукцияПоДокументу(ДанныеДокумента, ВидПродукции)
ПодобраннаяМаркируемаяПродукция = ДанныеДокумента.ПодобраннаяМаркируемаяПродукция;
Если ПодобраннаяМаркируемаяПродукция.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ПродукцияПоДокументу = ПодобраннаяМаркируемаяПродукция.СкопироватьКолонки();
Для Каждого СтрокаПодобраннойПродукции Из ПодобраннаяМаркируемаяПродукция Цикл
Если СтрокаПодобраннойПродукции.Количество = 0 Тогда
Продолжить;
КонецЕсли;
ЗаполнитьЗначенияСвойств(
ПродукцияПоДокументу.Добавить(), СтрокаПодобраннойПродукции);
КонецЦикла;
Если ПродукцияПоДокументу.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ДанныеДокумента.Вставить("ПродукцияПоДокументу", ПродукцияПоДокументу);
КонецПроцедуры
Процедура ДополнитьТаблицуМаркируемойПродукции(ДеревоУпаковок, ТаблицаМаркируемойПродукции)
Для Каждого СтрокаДерева Из ДеревоУпаковок.Строки Цикл
ДобавитьСтроку = Ложь;
Если СтрокаДерева.ВидУпаковки = Перечисления.ВидыУпаковокИС.Потребительская Тогда
ДобавитьСтроку = Истина;
ИначеЕсли СтрокаДерева.ВидУпаковки = Перечисления.ВидыУпаковокИС.Групповая
Или СтрокаДерева.ВидУпаковки = Перечисления.ВидыУпаковокИС.Набор
Или СтрокаДерева.ВидУпаковки = Перечисления.ВидыУпаковокИС.Логистическая Тогда
Если СтрокаДерева.Строки.Количество() = 0 Тогда
ДобавитьСтроку = Не (СтрокаДерева.ТипШтрихкода = Перечисления.ТипыШтрихкодов.SSCC);
Иначе
ДополнитьТаблицуМаркируемойПродукции(СтрокаДерева, ТаблицаМаркируемойПродукции);
КонецЕсли;
КонецЕсли;
Если ДобавитьСтроку Тогда
СтрокаТЧ = ТаблицаМаркируемойПродукции.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтрокаДерева);
СтрокаТЧ.СтрокаДерева = СтрокаДерева;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#КонецЕсли