Проверка и подбор табачной продукции МОТП / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
	
#Область ПрограммныйИнтерфейс

// Возвращает текст запроса для расчета статусов указания серий
// Параметры:
// 	ПараметрыУказанияСерий - Структура - состав полей задается в функции ПроверкаИПодборПродукцииМОТП.ПараметрыУказанияСерий
// Возвращаемое значение:
// 	Строка - текст запроса расчета статуса указания серий.
Функция ТекстЗапросаЗаполненияСтатусовУказанияСерий(ПараметрыУказанияСерий) Экспорт
	
	Возврат ИнтеграцияИС.ТекстЗапросаЗаполненияСтатусовУказанияСерий(
		Метаданные.Обработки.ПроверкаИПодборТабачнойПродукцииМОТП, ПараметрыУказанияСерий);
	
КонецФункции

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

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

// Фоновая операция по фиксации результатов проверки и подбора в документе, 
// 
// Параметры:
// 	Параметры - Структура - содержит следующие значения:
// 	   * СоздаватьАктОРасхождениях    - Булево - признак необходимости создания акта о расхождениях.
// 	   * ПроверяемыйДокумент          - ДокументСсылка - документ, для которого выполнялась проверка и подбор.
// 	   * ДеревоМаркированнойПродукции - ДеревоЗначений - содержит результаты проверки и подбора с иерархией упаковок.
// 	   * ДанныеПроверкиИПодбора       - ХранилищеЗначения - содержит слепок состояния проверки и подбора, если предусмотрено его хранение по окончании результатов проверки.
// 	   * ПроверкаНеПоДокументу        - Булево - признак того, что проверка и подбор была вызвана из произвольной формы.
// 	   * СохранятьОписаниеGTIN        - Булево - Сохранять описание GTIN, EAN, коэффициенты групповых упаковок.
// 	   * ПодобраннаяМаркируемаяПродукция - ТаблицаЗначений - содержит информацию о подобранной продукции сгруппированную до 
// 	       номенклатуры, характеристики, серии.
// 	   * Сценарий                     - Число - номер сценария проверки/подбора в документе
// 	АдресРезультата - Строка - адрес временного хранилища, в которое будут помещены результаты выполнения
Процедура ЗафиксироватьРезультатПроверкиИПодбора(Параметры, АдресРезультата) Экспорт
	
	ОписаниеЗамера = ОценкаПроизводительности.НачатьЗамерДлительнойОперации(
		"Обработка.ПроверкаИПодборТабачнойПродукцииМОТП.МодульМенеджера.ЗафиксироватьРезультатПроверкиИПодбора");
	
	ПараметрыСканирования = ОбщегоНазначения.СкопироватьРекурсивно(Параметры.ПараметрыСканирования);
	// Количество для мультитоварных наборов и монотоварных наборов с отдельной номенклатурой требуется рассчитать заново
	ПараметрыСканирования.СозданиеНаборов = Ложь;
	
	Если Параметры.Свойство("ПараметрыЛогированияЗапросовИСМП") Тогда
		ЛогированиеЗапросовИСМП.УстановитьПараметрыЛогированияЗапросов(Параметры.ПараметрыЛогированияЗапросовИСМП);
		ЛогированиеЗапросовИС.НастроитьПараметрыЛогированияВФоновомЗадании(Параметры.ПараметрыЛогированияЗапросовИСМП);
		ЛогированиеЗапросовИСМП.УстановитьПараметрыЛогированияЗапросов(Параметры.ПараметрыЛогированияЗапросовИСМП);
	КонецЕсли;
	
	НачатьТранзакцию();
	
	Попытка
		
		ПараметрыОкончанияПроверки = ПроверкаИПодборПродукцииИСМП.ПараметрыОкончанияПроверки();
		ПараметрыОкончанияПроверки.ВидПродукцииИС            = Параметры.ВидМаркируемойПродукции;
		ПараметрыОкончанияПроверки.СоздаватьАктОРасхождениях = Параметры.СоздаватьАктОРасхождениях;
		ПараметрыОкончанияПроверки.ПроверяемыйДокумент       = Параметры.ПроверяемыйДокумент;
		ПараметрыОкончанияПроверки.Сценарий                  = Параметры.Сценарий;
		
		ДеревоМаркированнойПродукции = Параметры.ДеревоМаркированнойПродукции.Скопировать();
		ДеревоМаркированнойПродукции.Колонки.Добавить("ШтрихкодУпаковки", Новый ОписаниеТипов("СправочникСсылка.ШтрихкодыУпаковокТоваров"));
		Если Не Параметры.ПроверкаНеПоДокументу и Параметры.СоздаватьАктОРасхождениях Тогда
			ШтрихкодыБрак = ШтрихкодированиеИС.ЗначенияНедопустимыхШтрихкодовИзДереваМаркируемойПродукции(
				ДеревоМаркированнойПродукции);
		КонецЕсли;
		ПроверкаИПодборПродукцииИСМП.УдалитьПустыеУпаковкиДерева(ДеревоМаркированнойПродукции);
		
		ТаблицаШтрихкодовВерхнегоУровня        = ПроверкаИПодборПродукцииИСМП.ПустаяТаблицаШтрихкодовВерхнегоУровня();
		ТаблицаПодобраннойПровереннойПродукции = ПроверкаИПодборПродукцииИСМП.ПустаяТаблицаПодобраннойПровереннойПродукции();
		
		ТаблицаПодобраннойПровереннойПродукции.Колонки.Добавить("МРЦ", ОбщегоНазначения.ОписаниеТипаЧисло(10, 2));
		
		ЗаполнитьИдентификаторЗапросаГИСМТ = ОбщегоНазначенияИСМПКлиентСерверПовтИсп.ПродукцияПодлежитОбязательнойОнлайнПроверкеПередРозничнойПродажей(Параметры.ВидМаркируемойПродукции,
			Параметры.ПараметрыСканирования.ВидОперацииИСМП,
			Параметры.ПараметрыСканирования.ТребуетсяПроверкаСредствамиККТ);
		
		Если ЗаполнитьИдентификаторЗапросаГИСМТ Тогда
			ДополнитьКолонкамиРозничнойПродажи(ТаблицаШтрихкодовВерхнегоУровня);
			ДополнитьКолонкамиРозничнойПродажи(ТаблицаПодобраннойПровереннойПродукции);
		КонецЕсли;
		
		Если ПараметрыСканирования.ТребуетсяЧастичноеВыбытие
			И ОбщегоНазначенияИСКлиентСерверПовтИсп.ПоддерживаетсяЧастичноеВыбытие(
				Параметры.ВидМаркируемойПродукции,
				ПараметрыСканирования.ВидОперацииИСМП) Тогда
				ПроверкаИПодборПродукцииИСМП.ДополнитьТаблицуШтрихкодовКолонкамиЧастичногоВыбытия(ТаблицаШтрихкодовВерхнегоУровня);
		КонецЕсли;
		
		// Количество для мультитоварных наборов и монотоварных наборов с отдельной номенклатурой требуется рассчитать заново
		СтрокиДереваНаборов = Новый Массив;
		Если ДеревоМаркированнойПродукции.Колонки.Найти("КоличествоПоДаннымИБ") = Неопределено Тогда
			ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПоДаннымИБ", Новый ОписаниеТипов("Число"));
		КонецЕсли;
		Если ДеревоМаркированнойПродукции.Колонки.Найти("КоличествоПотребительскихУпаковокПоДаннымИБ") = Неопределено Тогда
			ДеревоМаркированнойПродукции.Колонки.Добавить("КоличествоПотребительскихУпаковокПоДаннымИБ", Новый ОписаниеТипов("Число"));
		КонецЕсли;
		ПроверкаИПодборПродукцииИСМП.ЗаполнитьРекурсивноКоличествоПоДаннымИБПоКолонкеКоличество(ДеревоМаркированнойПродукции.Строки, СтрокиДереваНаборов);
		Если СтрокиДереваНаборов.Количество() Тогда
			ШтрихкодированиеИСМПСлужебный.НормализоватьСвойстваКоллекцииВложенныхШтрихкодов(ДеревоМаркированнойПродукции, ПараметрыСканирования);
			ДеревоМаркированнойПродукции.Колонки.Добавить("СтрокаДерева");
			ДеревоМаркированнойПродукции.Колонки.Добавить("ОбработанСОшибками", Новый ОписаниеТипов("Булево"));
			ШтрихкодированиеИСМПСлужебный.ЗаполнитьСтрокиТаблицыДанныхПоГрупповымУпаковкам(СтрокиДереваНаборов, ПараметрыСканирования);
			Для Каждого СтрокаДерева Из СтрокиДереваНаборов Цикл
				СтрокаДерева.КоличествоПоДаннымИБ = СтрокаДерева.Количество;
			КонецЦикла;
			ШтрихкодированиеИСМПСлужебный.НормализоватьДанныеДереваУпаковок(ДеревоМаркированнойПродукции, ПараметрыСканирования);
		КонецЕсли;
		
		ПараметрыСозданияШтрихкодов = Справочники.ШтрихкодыУпаковокТоваров.ПараметрыСозданияШтриходовУпаковокПоДеревуМаркируемойПродукции(
			ДеревоМаркированнойПродукции, Параметры.ПараметрыСканирования);
		Если СтрокиДереваНаборов.Количество() Тогда
			ПараметрыСозданияШтрихкодов.ИмяКолонкиКоличествоПотребительскихУпаковок = "КоличествоПотребительскихУпаковок";
		КонецЕсли;
		ПараметрыСозданияШтрихкодов.ВидПродукции = Параметры.ВидМаркируемойПродукции;
		
		Справочники.ШтрихкодыУпаковокТоваров.РезультатСозданияШтрихкодовУпаковокПоДеревуМаркируемойПродукции(
			ДеревоМаркированнойПродукции, ТаблицаШтрихкодовВерхнегоУровня,
			ПараметрыСозданияШтрихкодов);
		ПараметрыОкончанияПроверки.ТаблицаШтрихкодовВерхнегоУровня = ТаблицаШтрихкодовВерхнегоУровня;
		
		Если ЗаполнитьИдентификаторЗапросаГИСМТ Тогда
			ЗаполнитьШтрихкодыВерхнегоУровняИдентификаторамиЗапросовГИСМТ(ДеревоМаркированнойПродукции.Строки, ТаблицаШтрихкодовВерхнегоУровня);
		КонецЕсли;
		
		РегистрыСведений.ПулКодовМаркировкиСУЗ.ОтразитьАгрегациюКодовМаркировкиВПуле(ДеревоМаркированнойПродукции);
		
		Если Параметры.РежимИсправленияОшибокПослеПередачиКодов Тогда
			
			ШтрихкодыУпаковокОбработанСОшибкойВГИСМТ = ПроверкаИПодборПродукцииИСМП.КодыМаркировкиДляПовторнойОтправки(ДеревоМаркированнойПродукции);
			
			ДанныеЗаписи = Новый Структура;
			ДанныеЗаписи.Вставить("ДокументОснование", Параметры.ПроверяемыйДокумент);
			ДанныеЗаписи.Вставить("Сообщение",         ОбменДаннымиИСМП.СтроковоеПредставлениеПустогоУникальногоИдентификатора());
			ДанныеЗаписи.Вставить("ДанныеСообщения",   Новый ХранилищеЗначения(ШтрихкодыУпаковокОбработанСОшибкойВГИСМТ));
			
			РегистрыСведений.ПакетыКодовМаркировкиИСМП.ВыполнитьЗаписьВРегистр(ДанныеЗаписи); 
			
		КонецЕсли;
		
		ЕстьРасхождения = Ложь;
		РазрешенОборотНемаркированныхОстатков = ОбщегоНазначенияИСМППовтИсп.РазрешенОборотНемаркируемыхОстатковПродукции(ПараметрыОкончанияПроверки.ВидПродукцииИС);
		
		Для Каждого СтрокаДерева Из Параметры.ПодобраннаяМаркируемаяПродукция Цикл
		
			НоваяСтрока = ТаблицаПодобраннойПровереннойПродукции.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаДерева);
			Если Не ЗначениеЗаполнено(НоваяСтрока.Характеристика) Тогда
				НоваяСтрока.Характеристика = ОбщегоНазначенияИС.ПустоеЗначениеОпределяемогоТипа("ХарактеристикаНоменклатуры"); 
			КонецЕсли;
				
			Если Не ЗначениеЗаполнено(НоваяСтрока.Серия) Тогда
				НоваяСтрока.Серия = ОбщегоНазначенияИС.ПустоеЗначениеОпределяемогоТипа("СерияНоменклатуры"); 
			КонецЕсли;
			
			Если РазрешенОборотНемаркированныхОстатков И 
				(СтрокаДерева.ИндексКодаМаркировки = 6 Или СтрокаДерева.ИндексКодаМаркировки = 7) Тогда
				// немаркированные остатки, не подобранные или частично подобранные
				НоваяСтрока.КоличествоПодобрано = НоваяСтрока.Количество;
			КонецЕсли;
			
			Если НоваяСтрока.Количество <> НоваяСтрока.КоличествоПодобрано Тогда
				ЕстьРасхождения = Истина;
			КонецЕсли;
		
			Если Не СтрокаДерева.ПроизвольнаяЕдиницаУчета Тогда
				НоваяСтрока.КоличествоПотребительскихУпаковок = 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
					И СтрокаДерева.ТипШтрихкода <> Перечисления.ТипыШтрихкодов.SSCC18
					И СтрокаДерева.ТипШтрихкода <> Перечисления.ТипыШтрихкодов.SSCC20;
			Иначе
				ДополнитьТаблицуМаркируемойПродукции(СтрокаДерева, ТаблицаМаркируемойПродукции);
			КонецЕсли;
			
		КонецЕсли;
		
		Если ДобавитьСтроку Тогда
			
			СтрокаТЧ = ТаблицаМаркируемойПродукции.Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтрокаДерева);
			СтрокаТЧ.СтрокаДерева = СтрокаДерева;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#КонецЕсли

Связанные материалы