Проверка количества товаров в документе / Модуль объекта

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

#Область ОбработчикиСобытий

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

	
	НоменклатураСервер.ПроверитьЗаполнениеХарактеристик(ЭтотОбъект,МассивНепроверяемыхРеквизитов,Отказ);
	
	НоменклатураСервер.ПроверитьЗаполнениеСерий(ЭтотОбъект,
		НоменклатураСервер.ПараметрыУказанияСерий(ЭтотОбъект, Обработки.ПроверкаКоличестваТоваровВДокументе),
		Отказ,
		МассивНепроверяемыхРеквизитов);
	
	ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов);
КонецПроцедуры

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

#Область СлужебныеПроцедурыИФункции

Функция ЗавершитьПроверку(УчитываемыеПоля, ПереноситьРезультатВОрдер = Истина, ЭтоПроверкаМРМ = Ложь) Экспорт
	
	// 1. Формируем таблицу по данным документа.
	// - если упаковки учитываются, то по упаковкам, иначе в базовых
	// - серии учитываем, если это не серии, которые указываются по факту отбора
	// - неотгружаемые строки игнорируем - их всегда будем брать из обработки
	// 2. Формируем таблицу по данным обработки.
	// - если упаковки учитываются, то по упаковкам, иначе в базовых
	// - серии учитываем, если это не серии, которые указываются по факту отбора
	// 3. Сравниваем сумму отружаемых строк с документом - получаем таблицу недостач
	// 4. Все неотгружаемые строки разделяем
	// - на излишки (по ним потом нужно будет делать документ результата проверки и их нужно перенести в документ)
	// - просто неотружаемые (их просто нужно просто перенести в документ)
	// 5. Если излишков и недостач нет, то проверяем расхождения по сериям (по факту отбора с учетом остатков) - по
	// таким сериям нужно сформировать документ результата проверки.
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Ссылка",Ордер);
	Запрос.УстановитьПараметр("ТоварыИзОбработки",Товары.Выгрузить());
	Запрос.УстановитьПараметр("УчитыватьУпаковки", УчитываемыеПоля.УчитыватьУпаковки);
	Запрос.УстановитьПараметр("УчитыватьСерии", УчитываемыеПоля.УчитыватьСерии);
	Запрос.УстановитьПараметр("НеУчитываемыеСтатусыСерий", УчитываемыеПоля.НеУчитываемыеСтатусыСерий);
	
	Запрос.УстановитьПараметр("ПоВсейТЧ",Истина);
	Запрос.УстановитьПараметр("ЭтоУдаление",Ложь);
	Запрос.УстановитьПараметр("НомерСтроки",Неопределено);
	Запрос.УстановитьПараметр("Номенклатура",Неопределено);
	Запрос.УстановитьПараметр("Характеристика",Неопределено);
	Запрос.УстановитьПараметр("Назначение",Неопределено);
	Запрос.УстановитьПараметр("Упаковка",Неопределено);
	Запрос.УстановитьПараметр("Серия",Неопределено);
	
	МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	Запрос.Текст = ТекстЗапросаВременныеТаблицыДокументаИОбработки();
	Запрос.ВыполнитьПакет();
	
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ТоварыИзОрдера.Номенклатура КАК Номенклатура,
	|	ТоварыИзОрдера.Характеристика КАК Характеристика,
	|	ТоварыИзОрдера.Назначение КАК Назначение,
	|	ТоварыИзОрдера.Серия КАК Серия,
	|	0 КАК КоличествоКОтгрузке,
	|	0 КАК КоличествоУпаковокКОтгрузке,
	|	ТоварыИзОрдера.Количество КАК КоличествоВДокументе,
	|	ТоварыИзОрдера.КоличествоУпаковок КАК КоличествоУпаковокВДокументе,
	|	ВЫРАЗИТЬ(ТоварыИзОрдера.Упаковка КАК Справочник.УпаковкиЕдиницыИзмерения) КАК Упаковка
	|ПОМЕСТИТЬ ТоварыКПроверке
	|ИЗ
	|	ТоварыИзОрдера КАК ТоварыИзОрдера
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ТоварыИзОбработки.Номенклатура,
	|	ТоварыИзОбработки.Характеристика,
	|	ТоварыИзОбработки.Назначение,
	|	ТоварыИзОбработки.Серия,
	|	ТоварыИзОбработки.Количество,
	|	ТоварыИзОбработки.КоличествоУпаковок,
	|	0,
	|	0,
	|	ВЫРАЗИТЬ(ТоварыИзОбработки.Упаковка КАК Справочник.УпаковкиЕдиницыИзмерения)
	|ИЗ
	|	ТоварыИзОбработки КАК ТоварыИзОбработки
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	НеотобранныеТовары.Номенклатура КАК Номенклатура,
	|	НеотобранныеТовары.Характеристика КАК Характеристика,
	|	НеотобранныеТовары.Назначение КАК Назначение,
	|	НеотобранныеТовары.Серия КАК Серия,
	|	НеотобранныеТовары.Упаковка КАК Упаковка,
	|	СУММА(ВЫБОР
	|			КОГДА ЕСТЬNULL(НеотобранныеТовары.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|				ТОГДА (НеотобранныеТовары.КоличествоУпаковокВДокументе - НеотобранныеТовары.КоличествоУпаковокКОтгрузке) / НеотобранныеТовары.Упаковка.КоличествоУпаковок
	|			ИНАЧЕ НеотобранныеТовары.КоличествоВДокументе - НеотобранныеТовары.КоличествоКОтгрузке
	|		КОНЕЦ) КАК КоличествоНедобор,
	|	СУММА(ВЫБОР
	|			КОГДА ЕСТЬNULL(НеотобранныеТовары.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|				ТОГДА НеотобранныеТовары.КоличествоУпаковокКОтгрузке / НеотобранныеТовары.Упаковка.КоличествоУпаковок
	|			ИНАЧЕ НеотобранныеТовары.КоличествоКОтгрузке
	|		КОНЕЦ) КАК КоличествоКОтгрузке,
	|	СУММА(ВЫБОР
	|			КОГДА ЕСТЬNULL(НеотобранныеТовары.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|				ТОГДА НеотобранныеТовары.КоличествоУпаковокВДокументе / НеотобранныеТовары.Упаковка.КоличествоУпаковок
	|			ИНАЧЕ НеотобранныеТовары.КоличествоВДокументе
	|		КОНЕЦ) КАК КоличествоВДокументе,
	|	СУММА(НеотобранныеТовары.КоличествоУпаковокВДокументе - НеотобранныеТовары.КоличествоУпаковокКОтгрузке) КАК КоличествоУпаковокНедобор,
	|	СУММА(НеотобранныеТовары.КоличествоУпаковокКОтгрузке) КАК КоличествоУпаковокКОтгрузке,
	|	СУММА(НеотобранныеТовары.КоличествоУпаковокВДокументе) КАК КоличествоУпаковокВДокументе,
	|	ВЫБОР
	|		КОГДА Товары.ЕдиницаИзмерения.ТипИзмеряемойВеличины В (&ТипыМерныхВеличин)
	|			ТОГДА ВЫБОР
	|					КОГДА СУММА(НеотобранныеТовары.КоличествоКОтгрузке) >= СУММА(НеотобранныеТовары.КоличествоВДокументе) - &ДопустимоеОтклонение * СУММА(НеотобранныеТовары.КоличествоВДокументе) / 100
	|						ТОГДА ЛОЖЬ
	|					ИНАЧЕ ИСТИНА
	|				КОНЕЦ
	|		ИНАЧЕ ВЫБОР
	|				КОГДА ЕСТЬNULL(НеотобранныеТовары.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|							И СУММА(НеотобранныеТовары.КоличествоУпаковокВДокументе - НеотобранныеТовары.КоличествоУпаковокКОтгрузке) > 0
	|						ИЛИ СУММА(НеотобранныеТовары.КоличествоВДокументе - НеотобранныеТовары.КоличествоКОтгрузке) > 0
	|					ТОГДА ИСТИНА
	|				ИНАЧЕ ЛОЖЬ
	|			КОНЕЦ
	|	КОНЕЦ КАК ЭтоНедобор
	|ИЗ
	|	ТоварыКПроверке КАК НеотобранныеТовары
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары
	|		ПО НеотобранныеТовары.Номенклатура = Товары.Ссылка
	|
	|СГРУППИРОВАТЬ ПО
	|	НеотобранныеТовары.Номенклатура,
	|	Товары.ЕдиницаИзмерения.ТипИзмеряемойВеличины,
	|	НеотобранныеТовары.Характеристика,
	|	НеотобранныеТовары.Назначение,
	|	НеотобранныеТовары.Серия,
	|	НеотобранныеТовары.Упаковка,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(НеотобранныеТовары.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|			ТОГДА НЕОПРЕДЕЛЕНО
	|		ИНАЧЕ НеотобранныеТовары.Упаковка
	|	КОНЕЦ,
	|	НеотобранныеТовары.Упаковка.ТипУпаковки
	|
	|ИМЕЮЩИЕ
	|	(СУММА(НеотобранныеТовары.КоличествоВДокументе - НеотобранныеТовары.КоличествоКОтгрузке) > 0
	|		ИЛИ СУММА(НеотобранныеТовары.КоличествоУпаковокВДокументе - НеотобранныеТовары.КоличествоУпаковокКОтгрузке) > 0)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВЫРАЗИТЬ(ТоварыИзОбработки.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
	|	ТоварыИзОбработки.Характеристика КАК Характеристика,
	|	ВЫРАЗИТЬ(ТоварыИзОбработки.Упаковка КАК Справочник.УпаковкиЕдиницыИзмерения) КАК Упаковка,
	|	ТоварыИзОбработки.Назначение КАК Назначение,
	|	ТоварыИзОбработки.Серия КАК Серия,
	|	ТоварыИзОбработки.Количество КАК Количество,
	|	ТоварыИзОбработки.КоличествоУпаковок КАК КоличествоУпаковок,
	|	ТоварыИзОбработки.КоличествоВДокументе КАК КоличествоВДокументе,
	|	ТоварыИзОбработки.КоличествоУпаковокВДокументе КАК КоличествоУпаковокВДокументе
	|ПОМЕСТИТЬ ТоварыИзОбработкиДляЗапроса
	|ИЗ
	|	&ТоварыИзОбработки КАК ТоварыИзОбработки
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	НеотгружаемыеТовары.Номенклатура КАК Номенклатура,
	|	НеотгружаемыеТовары.Характеристика КАК Характеристика,
	|	НеотгружаемыеТовары.Упаковка КАК Упаковка,
	|	НеотгружаемыеТовары.Назначение КАК Назначение,
	|	НеотгружаемыеТовары.Серия КАК Серия,
	|	СУММА(НеотгружаемыеТовары.Количество) - НеотгружаемыеТовары.КоличествоВДокументе КАК Количество,
	|	СУММА(НеотгружаемыеТовары.КоличествоУпаковок) - НеотгружаемыеТовары.КоличествоУпаковокВДокументе КАК КоличествоУпаковок,
	|	ВЫБОР
	|		КОГДА НеотгружаемыеТовары.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины В (&ТипыМерныхВеличин)
	|			ТОГДА ВЫБОР
	|					КОГДА СУММА(НеотгружаемыеТовары.КоличествоУпаковок) > НеотгружаемыеТовары.КоличествоУпаковокВДокументе + &ДопустимоеОтклонение * НеотгружаемыеТовары.КоличествоУпаковокВДокументе / 100
	|						ТОГДА ИСТИНА
	|					ИНАЧЕ ЛОЖЬ
	|				КОНЕЦ
	|		ИНАЧЕ ВЫБОР
	|				КОГДА СУММА(НеотгружаемыеТовары.КоличествоУпаковок) - НеотгружаемыеТовары.КоличествоУпаковокВДокументе > 0
	|					ТОГДА ИСТИНА
	|				ИНАЧЕ ЛОЖЬ
	|			КОНЕЦ
	|	КОНЕЦ КАК ЭтоИзлишек
	|ИЗ
	|	ТоварыИзОбработкиДляЗапроса КАК НеотгружаемыеТовары
	|ГДЕ
	|	ЕСТЬNULL(НеотгружаемыеТовары.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) <> ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|
	|СГРУППИРОВАТЬ ПО
	|	НеотгружаемыеТовары.Номенклатура,
	|	НеотгружаемыеТовары.Характеристика,
	|	НеотгружаемыеТовары.Упаковка,
	|	НеотгружаемыеТовары.Назначение,
	|	НеотгружаемыеТовары.Серия,
	|	НеотгружаемыеТовары.КоличествоВДокументе,
	|	НеотгружаемыеТовары.КоличествоУпаковокВДокументе,
	|	НеотгружаемыеТовары.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины
	|
	|ИМЕЮЩИЕ
	|	СУММА(НеотгружаемыеТовары.КоличествоУпаковок) > 0
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	НеотгружаемыеТовары.Номенклатура,
	|	НеотгружаемыеТовары.Характеристика,
	|	НеотгружаемыеТовары.Упаковка,
	|	НеотгружаемыеТовары.Назначение,
	|	НеотгружаемыеТовары.Серия,
	|	(СУММА(НеотгружаемыеТовары.КоличествоУпаковок) - НеотгружаемыеТовары.КоличествоУпаковокВДокументе) / НеотгружаемыеТовары.Упаковка.КоличествоУпаковок,
	|	СУММА(НеотгружаемыеТовары.КоличествоУпаковок) - НеотгружаемыеТовары.КоличествоУпаковокВДокументе,
	|	ВЫБОР
	|		КОГДА СУММА(НеотгружаемыеТовары.КоличествоУпаковок) - НеотгружаемыеТовары.КоличествоУпаковокВДокументе > 0
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ
	|ИЗ
	|	ТоварыИзОбработкиДляЗапроса КАК НеотгружаемыеТовары
	|ГДЕ
	|	ЕСТЬNULL(НеотгружаемыеТовары.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|
	|СГРУППИРОВАТЬ ПО
	|	НеотгружаемыеТовары.Номенклатура,
	|	НеотгружаемыеТовары.Характеристика,
	|	НеотгружаемыеТовары.Упаковка,
	|	НеотгружаемыеТовары.Назначение,
	|	НеотгружаемыеТовары.Серия,
	|	НеотгружаемыеТовары.КоличествоВДокументе,
	|	НеотгружаемыеТовары.КоличествоУпаковокВДокументе,
	|	НеотгружаемыеТовары.Упаковка.КоличествоУпаковок
	|
	|ИМЕЮЩИЕ
	|	СУММА(НеотгружаемыеТовары.КоличествоУпаковок) > 0";
	
	ТипыМерныхВеличин = Справочники.УпаковкиЕдиницыИзмерения.МерныеТипыЕдиницИзмерений();
	ДопустимоеОтклонениеКоличества = Константы.ДопустимоеОтклонениеОтгрузкиПриемкиМерныхТоваров.Получить();
	
	Запрос.УстановитьПараметр("ТипыМерныхВеличин", ТипыМерныхВеличин);
	Запрос.УстановитьПараметр("ДопустимоеОтклонение", ДопустимоеОтклонениеКоличества);
	
	Результат = Запрос.ВыполнитьПакет();
	
	НеотобранныеТовары = Результат[1].Выгрузить();
	НеотгружаемыеТовары = Результат[3].Выгрузить();
	
	УсловияНедобора = Новый Структура("ЭтоНедобор", Истина);
	УсловиеИзлишка = Новый Структура("ЭтоИзлишек", Истина);
	
	ОтобранныеТовары = НеотобранныеТовары.НайтиСтроки(УсловияНедобора);
	ОтгружаемыеТовары = НеотгружаемыеТовары.НайтиСтроки(УсловиеИзлишка);
	
	Недобор.Очистить();
	Неотгружаемые.Очистить();
	
	Для Каждого СтрокаТовары Из ОтобранныеТовары Цикл
		НоваяСтрока = Недобор.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТовары);
	КонецЦикла;
	
	Для Каждого СтрокаТовары Из ОтгружаемыеТовары Цикл
		НоваяСтрока = Неотгружаемые.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТовары);
	КонецЦикла;
	
	Если Не ПереноситьРезультатВОрдер Тогда
		
		Возврат Неотгружаемые.Количество() = 0
			И Недобор.Количество() = 0;
		
	КонецЕсли;
	
	ПереносВыполнен = Истина;
	
	Если Неотгружаемые.Количество() = 0
		И Недобор.Количество() = 0 Тогда
		
		ПереносВыполнен = ПеренестиРезультатыВОрдер(УчитываемыеПоля, ЭтоПроверкаМРМ);
		
	КонецЕсли;
	
	Возврат ПереносВыполнен;
	
КонецФункции

Функция ОтразитьРасхожденияВУчете(УчитываемыеПоля, ЭтоПроверкаМРМ = Ложь) Экспорт

	ПереносВыполнен = ПеренестиРезультатыВОрдер(УчитываемыеПоля, ЭтоПроверкаМРМ);
	
	Возврат ПереносВыполнен;
	
КонецФункции

Функция ПеренестиРезультатыВОрдер(УчитываемыеПоля, ЭтоПроверкаМРМ = Ложь)
	
	ЭтоОрдерНаПеремещение = ТипЗнч(Ордер) = Тип("ДокументСсылка.ОрдерНаПеремещениеТоваров");
	
	ДокументОбъект = Ордер.ПолучитьОбъект();
	
	Если РежимИсправления Тогда
		
		Если ЭтоОрдерНаПеремещение Тогда
			ДокументОбъект.ОтгружаемыеТовары.Очистить();
		Иначе
			
			УсловиеОтбораСтрок = Новый Структура;
			УсловиеОтбораСтрок.Вставить("ЭтоУпаковочныйЛист", Ложь);
			УсловиеОтбораСтрок.Вставить("УпаковочныйЛистРодитель", Документы.УпаковочныйЛист.ПустаяСсылка());
			
			НайденныеСтроки = ДокументОбъект.ОтгружаемыеТовары.НайтиСтроки(УсловиеОтбораСтрок);
			Для Каждого СтрМас Из НайденныеСтроки Цикл
				ДокументОбъект.ОтгружаемыеТовары.Удалить(СтрМас);
			КонецЦикла;
			
		КонецЕсли;
		
	Иначе
		УсловиеОтбораСтрок = Новый Структура;
		УсловиеОтбораСтрок.Вставить("Действие", Перечисления.ДействияСоСтрокамиОрдеровНаОтгрузку.Отобрать);
		
		НайденныеСтроки = ДокументОбъект.ОтгружаемыеТовары.НайтиСтроки(УсловиеОтбораСтрок);
		Для Каждого СтрМас Из НайденныеСтроки Цикл
			ДокументОбъект.ОтгружаемыеТовары.Удалить(СтрМас);
		КонецЦикла;
	КонецЕсли;
	
	Для Каждого СтрТабл Из Товары Цикл
		
		Если СтрТабл.КоличествоУпаковок = 0 Тогда
			Продолжить;
		КонецЕсли;
		
		СтрокаТовары = ДокументОбъект.ОтгружаемыеТовары.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаТовары, СтрТабл);
		Если Не ЭтоОрдерНаПеремещение Тогда
			СтрокаТовары.УпаковочныйЛистРодитель = СтрТабл.УпаковочныйЛист;
			СтрокаТовары.УпаковочныйЛист = Документы.УпаковочныйЛист.ПустаяСсылка();
		КонецЕсли;
		СтрокаТовары.СтатусУказанияСерий = 0;
		Если СтрТабл.НеОтгружать Тогда
			СтрокаТовары.Действие = Перечисления.ДействияСоСтрокамиОрдеровНаОтгрузку.НеОтгружать;
		Иначе	
			СтрокаТовары.Действие = Перечисления.ДействияСоСтрокамиОрдеровНаОтгрузку.Отгрузить;
		КонецЕсли;
		
	КонецЦикла;
	
	ЕстьСтрокиКОтбору = Ложь;
	
	Если ВариантУчетаНедобора = "Добрать" Тогда
		Для Каждого СтрТабл Из Недобор Цикл
			СтрокаТовары = ДокументОбъект.ОтгружаемыеТовары.Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаТовары, СтрТабл);
			СтрокаТовары.СтатусУказанияСерий = 0;
			СтрокаТовары.Количество          = СтрТабл.КоличествоНедобор;
			СтрокаТовары.КоличествоУпаковок  = СтрТабл.КоличествоУпаковокНедобор;
			СтрокаТовары.Упаковка		  	 = СтрТабл.Упаковка;
			СтрокаТовары.Действие = Перечисления.ДействияСоСтрокамиОрдеровНаОтгрузку.Отобрать;
			ЕстьСтрокиКОтбору = Истина;
		КонецЦикла;
	КонецЕсли;
	
	Если ЭтоОрдерНаПеремещение Тогда
		Если Не ЕстьСтрокиКОтбору Тогда
			ДокументОбъект.Статус = Перечисления.СтатусыОрдеровНаПеремещение.КОтгрузке;
		Иначе
			ДокументОбъект.Статус = Перечисления.СтатусыОрдеровНаПеремещение.КОтбору;
		КонецЕсли;
		ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ДокументОбъект,Документы.ОрдерНаПеремещениеТоваров);
		НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ДокументОбъект, ПараметрыУказанияСерий);
		
		НоменклатураСервер.ЗаполнитьДействиеПоКомплектностиТоварныхМест(ДокументОбъект);
		
		УсловиеОтбораСтрок = Новый Структура("Действие", Перечисления.ДействияСоСтрокамиОрдеровНаОтгрузку.НеОтгружать);		
		НайденныеСтроки = ДокументОбъект.ОтгружаемыеТовары.НайтиСтроки(УсловиеОтбораСтрок);
		Если НайденныеСтроки.Количество() = ДокументОбъект.ОтгружаемыеТовары.Количество() Тогда
			ДокументОбъект.Статус = Перечисления.СтатусыОрдеровНаПеремещение.Принят;
		КонецЕсли;
		
	Иначе
		Если Не ЕстьСтрокиКОтбору Тогда
			ДокументОбъект.Статус = ?(ЗначениеЗаполнено(СтатусОрдера), СтатусОрдера,
				Перечисления.СтатусыРасходныхОрдеров.КОтгрузке);
		Иначе
			ДокументОбъект.Статус = Перечисления.СтатусыРасходныхОрдеров.КОтбору;
		КонецЕсли;
		
		ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ДокументОбъект,Документы.РасходныйОрдерНаТовары);
		НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ДокументОбъект, ПараметрыУказанияСерий.ОтгружаемыеТовары);
		
		НоменклатураСервер.ЗаполнитьДействиеПоКомплектностиТоварныхМест(ДокументОбъект);
		
		Документы.РасходныйОрдерНаТовары.ИзменитьТоварыПоРаспоряжениямПоОтгружаемымТоварам(ДокументОбъект, Ложь, Истина);
		
		УсловиеОтбораСтрок = Новый Структура("Действие", Перечисления.ДействияСоСтрокамиОрдеровНаОтгрузку.НеОтгружать);		
		НайденныеСтроки = ДокументОбъект.ОтгружаемыеТовары.НайтиСтроки(УсловиеОтбораСтрок);
		Если НайденныеСтроки.Количество() = ДокументОбъект.ОтгружаемыеТовары.Количество() Тогда
			ДокументОбъект.Статус = Перечисления.СтатусыРасходныхОрдеров.Отгружен;
			ДокументОбъект.ОтгрузкаПоЗаданиюНаПеревозку = Ложь;
			ДокументОбъект.ЗаданиеНаПеревозку = Документы.ЗаданиеНаПеревозку.ПустаяСсылка();
		КонецЕсли;
				
		ДокументОбъект.ВсегоМест = УпаковочныеЛистыСервер.КоличествоМестВТЧ(ДокументОбъект.ОтгружаемыеТовары);
	КонецЕсли;
	
	ДокументРасхожденийОбъект = СформироватьДокументРасхождений(ДокументОбъект);
	
	ПереносВыполнен = Истина;
	
	Если Не ЭтоОрдерНаПеремещение Тогда
		ДополнитьОрдерСтрокамиУпаковочныхЛистов(ДокументОбъект);
		Для каждого Элем Из ШтрихкодыУпаковок Цикл
			НовСтрока = ДокументОбъект.ШтрихкодыУпаковок.Добавить();
			НовСтрока.ШтрихкодУпаковки = Элем.ШтрихкодУпаковки;
		КонецЦикла; 
	КонецЕсли;
	
	ПереносВыполнен = Истина;
	Если Не ЭтоОрдерНаПеремещение
		И ДокументОбъект.ОтгружаемыеТовары.Количество() Тогда
		ПереносВыполнен = ДокументОбъект.ПроверитьЗаполнение();
		Если Не ПереносВыполнен Тогда
			Возврат ПереносВыполнен;
		КонецЕсли;
	КонецЕсли;
	
	НачатьТранзакцию();
	Попытка
		Если ДокументРасхожденийОбъект <> Неопределено Тогда
			ДокументРасхожденийОбъект.Записать(РежимЗаписиДокумента.Проведение);
			ДокументОтраженияРезультатов = ДокументРасхожденийОбъект.Ссылка;
		КонецЕсли;	
		
		Если Не ЭтоОрдерНаПеремещение
			И ДокументОбъект.ОтгрузкаПоЗаданиюНаПеревозку
			И Не ЗначениеЗаполнено(ДокументОбъект.ЗаданиеНаПеревозку) Тогда
			
			Если Не ЗначениеЗаполнено(ЭтотОбъект.ЗаданиеНаПеревозку)
				И ДокументОбъект.Статус = Перечисления.СтатусыРасходныхОрдеров.КОтгрузке Тогда
				
				Если ЭтоПроверкаМРМ Тогда
					ДокументОбъект.Статус = Перечисления.СтатусыРасходныхОрдеров.Проверен;
				Иначе
					ОтменитьТранзакцию();
					
					ПереносВыполнен = Ложь;
					ТекстСообщения = НСтр("ru = 'Не выбрано задание на перевозку. Невозможно завершить проверку.'");
					
					ДокументОтраженияРезультатов = Документы.КорректировкаПоОрдеруНаТовары.ПустаяСсылка();
					
					ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
					
					Возврат ПереносВыполнен;
				КонецЕсли;
				
			КонецЕсли;
			
			ДокументОбъект.ЗаданиеНаПеревозку = ЭтотОбъект.ЗаданиеНаПеревозку;
			
		ИначеЕсли Не ЭтоОрдерНаПеремещение
			И Не ЗначениеЗаполнено(ДокументОбъект.ЗаданиеНаПеревозку)
			И ЗначениеЗаполнено(ЭтотОбъект.ЗаданиеНаПеревозку) Тогда
			
			ДокументОбъект.ЗаданиеНаПеревозку = ЭтотОбъект.ЗаданиеНаПеревозку;
			ДокументОбъект.ОтгрузкаПоЗаданиюНаПеревозку = Истина;
			
		КонецЕсли;
		
		Если Не ЭтоОрдерНаПеремещение
			И ЗначениеЗаполнено(ДокументОбъект.ЗаданиеНаПеревозку) Тогда
			
			ДокументОбъект.ПорядокДоставки = ДоставкаТоваров.ПорядокДоставкиВЗаданииНаПеревозку(ДокументОбъект.ЗаданиеНаПеревозку,
																								ДокументОбъект.Получатель);
			
		КонецЕсли;
		
		Если ДокументОбъект.ОтгружаемыеТовары.Количество() = 0 Тогда
			ДокументОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
		Иначе
			ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
		КонецЕсли;
		
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ИнформацияОбОшибке().Описание);
		ДокументОтраженияРезультатов = Документы.КорректировкаПоОрдеруНаТовары.ПустаяСсылка();
		ПереносВыполнен = Ложь;
	КонецПопытки;
	
	Если ПереносВыполнен
		И Не ЭтоОрдерНаПеремещение Тогда
		УпаковочныеЛистыСервер.СинхронизироватьУпаковочныеЛистыСРасходнымОрдером(ДокументОбъект.Ссылка, УчитываемыеПоля.УчитыватьУпаковки);
	КонецЕсли;
	
	Возврат ПереносВыполнен;
	
КонецФункции

Функция СформироватьДокументРасхождений(ОрдерОбъект)
	
	// 1. Посчитаем по заданиям на отбор, сколько отобрали
	// 2. Посчитаем то, что показывает обработка
	// 3. Посчитаем, сколько уже учтено в документах расхождений
	// 4. Посчитаем, сколько в ордере отгружаемых строк и неотгружаемых
	// 5. На разницу создадим новый документ расхождений.
	
	Если Не СкладыСервер.ИспользоватьАдресноеХранение(Склад, Помещение, ОрдерОбъект.Дата) Тогда
		Возврат Неопределено;
	КонецЕсли;

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

Процедура ДополнитьОрдерСтрокамиУпаковочныхЛистов(ДокументОбъект);
	
	Если Не ПолучитьФункциональнуюОпцию("ИспользоватьУпаковочныеЛисты") Тогда
		Возврат;
	КонецЕсли;
	
	ТаблицаТовары = ДокументОбъект.ОтгружаемыеТовары.Выгрузить(,"УпаковочныйЛистРодитель");
	ТаблицаТовары.Свернуть("УпаковочныйЛистРодитель");
	
	Для Каждого СтрТабл Из ТаблицаТовары Цикл
		
		Если ЗначениеЗаполнено(СтрТабл.УпаковочныйЛистРодитель) Тогда
			
			ПараметрыПоиска = Новый Структура;
			ПараметрыПоиска.Вставить("УпаковочныйЛист", СтрТабл.УпаковочныйЛистРодитель);
			ПараметрыПоиска.Вставить("ЭтоУпаковочныйЛист", Истина);
			
			НайденныеСтроки = ДокументОбъект.ОтгружаемыеТовары.НайтиСтроки(ПараметрыПоиска);
			
			Если НайденныеСтроки.Количество() = 0 Тогда
				НоваяСтрока = ДокументОбъект.ОтгружаемыеТовары.Добавить();
				НоваяСтрока.УпаковочныйЛист  = СтрТабл.УпаковочныйЛистРодитель;
				НоваяСтрока.ЭтоУпаковочныйЛист = Истина;
				НоваяСтрока.Действие = Перечисления.ДействияСоСтрокамиОрдеровНаОтгрузку.Отгрузить;
				НоваяСтрока.Количество = 1;
				НоваяСтрока.КоличествоУпаковок = 1;
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

// Заполнить статусы проблем.
// 
// Параметры:
//  УчитываемыеПоля - см. СкладыКлиентСервер.УчитываемыеПриПроверкеРасходногоОрдераПоля
//  ТекущиеДанные - СтрокаТабличнойЧасти
//  ЭтоУдаление - Булево - Это удаление
//  ЗаполнятьТЧ - Булево - Заполнять ТЧ
// 
// Возвращаемое значение:
//  ВыборкаИзРезультатаЗапроса, Неопределено - Заполнить статусы проблем
Функция ЗаполнитьСтатусыПроблем(УчитываемыеПоля, ТекущиеДанные, ЭтоУдаление, ЗаполнятьТЧ) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	ТекстЗапросаВременныеТаблицыДокументаИОбработки() + Символы.ПС +
	"ВЫБРАТЬ
	|	ТоварыИзОбработкиБезГруппировки.НомерСтроки,
	|	ТоварыИзОбработки.КоличествоУпаковок КАК КоличествоУпаковокСумма,
	|	ТоварыИзОбработки.КоличествоСумма КАК КоличествоСумма,
	|	ТоварыИзОбработки.КоличествоУпаковокНеОтгружать,
	|	ЕСТЬNULL(ТоварыИзОрдера.Количество, 0) КАК КоличествоВДокументе,
	|	ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) КАК КоличествоУпаковокВДокументе,
	|	ВЫБОР
	|		КОГДА Товары.ЕдиницаИзмерения.ТипИзмеряемойВеличины В (&ТипыМерныхВеличин)
	|			ТОГДА ВЫБОР
	|					КОГДА ТоварыИзОбработки.КоличествоУпаковок < ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) - &ДопустимоеОтклонение * ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) / 100
	|							И ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) > 0
	|							И ТоварыИзОбработкиБезГруппировки.НеОтгружать = 0
	|						ТОГДА 0
	|					КОГДА ТоварыИзОбработки.КоличествоУпаковок <= ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) + &ДопустимоеОтклонение * ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) / 100
	|							И ТоварыИзОбработки.КоличествоУпаковок >= ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) - &ДопустимоеОтклонение * ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) / 100
	|							И ТоварыИзОрдера.КоличествоУпаковок > 0
	|							И ТоварыИзОбработкиБезГруппировки.НеОтгружать = 0
	|						ТОГДА 1
	|					КОГДА ТоварыИзОбработки.КоличествоУпаковок <= ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) + &ДопустимоеОтклонение * ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) / 100
	|							И ТоварыИзОбработки.КоличествоУпаковок >= ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) - &ДопустимоеОтклонение * ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) / 100
	|							И ТоварыИзОбработки.НеОтгружать = 1
	|							И ТоварыИзОбработкиБезГруппировки.НеОтгружать = 0
	|						ТОГДА 2
	|					КОГДА ТоварыИзОбработкиБезГруппировки.НеОтгружать = 1
	|						ТОГДА 3
	|					КОГДА ТоварыИзОбработки.КоличествоУпаковок > ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0)
	|							ИЛИ ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) = 0
	|						ТОГДА 4
	|					ИНАЧЕ 404
	|				КОНЕЦ
	|		ИНАЧЕ ВЫБОР
	|				КОГДА ЕСТЬNULL(ТоварыИзОбработкиБезГруппировки.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|					ТОГДА ВЫБОР
	|							КОГДА ТоварыИзОбработки.КоличествоСумма < ЕСТЬNULL(ТоварыИзОрдера.Количество, 0)
	|									И ЕСТЬNULL(ТоварыИзОрдера.Количество, 0) > 0
	|									И ТоварыИзОбработкиБезГруппировки.НеОтгружать = 0
	|								ТОГДА 0
	|							КОГДА ТоварыИзОбработки.КоличествоСумма = ЕСТЬNULL(ТоварыИзОрдера.Количество, 0)
	|									И ТоварыИзОрдера.Количество > 0
	|									И ТоварыИзОбработки.НеОтгружать = 0
	|								ТОГДА 1
	|							КОГДА ТоварыИзОбработки.КоличествоСумма = ЕСТЬNULL(ТоварыИзОрдера.Количество, 0)
	|									И ТоварыИзОбработки.НеОтгружать = 1
	|									И ТоварыИзОбработкиБезГруппировки.НеОтгружать = 0
	|								ТОГДА 2
	|							КОГДА ТоварыИзОбработкиБезГруппировки.НеОтгружать = 1
	|								ТОГДА 3
	|							КОГДА ТоварыИзОбработки.КоличествоСумма > ЕСТЬNULL(ТоварыИзОрдера.Количество, 0)
	|									ИЛИ ЕСТЬNULL(ТоварыИзОрдера.Количество, 0) = 0
	|								ТОГДА 4
	|							ИНАЧЕ 404
	|						КОНЕЦ
	|				ИНАЧЕ ВЫБОР
	|						КОГДА ТоварыИзОбработки.КоличествоУпаковок < ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0)
	|								И ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) > 0
	|								И ТоварыИзОбработкиБезГруппировки.НеОтгружать = 0
	|							ТОГДА 0
	|						КОГДА ТоварыИзОбработки.КоличествоУпаковок = ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0)
	|								И ТоварыИзОрдера.КоличествоУпаковок > 0
	|								И ТоварыИзОбработки.НеОтгружать = 0
	|							ТОГДА 1
	|						КОГДА ТоварыИзОбработки.КоличествоУпаковок = ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0)
	|								И ТоварыИзОбработки.НеОтгружать = 1
	|								И ТоварыИзОбработкиБезГруппировки.НеОтгружать = 0
	|							ТОГДА 2
	|						КОГДА ТоварыИзОбработкиБезГруппировки.НеОтгружать = 1
	|							ТОГДА 3
	|						КОГДА ТоварыИзОбработки.КоличествоУпаковок > ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0)
	|								ИЛИ ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) = 0
	|							ТОГДА 4
	|						ИНАЧЕ 404
	|					КОНЕЦ
	|			КОНЕЦ
	|	КОНЕЦ КАК СтатусПроблемы
	|ПОМЕСТИТЬ ТаблицаПроблем
	|ИЗ
	|	ТоварыИзОбработкиБезГруппировки КАК ТоварыИзОбработкиБезГруппировки
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары
	|		ПО ТоварыИзОбработкиБезГруппировки.Номенклатура = Товары.Ссылка
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыИзОбработки КАК ТоварыИзОбработки
	|		ПО ТоварыИзОбработкиБезГруппировки.Номенклатура = ТоварыИзОбработки.Номенклатура
	|			И ТоварыИзОбработкиБезГруппировки.Характеристика = ТоварыИзОбработки.Характеристика
	|			И ТоварыИзОбработкиБезГруппировки.Назначение = ТоварыИзОбработки.Назначение
	|			И ТоварыИзОбработкиБезГруппировки.Упаковка = ТоварыИзОбработки.Упаковка
	|			И ТоварыИзОбработкиБезГруппировки.Серия = ТоварыИзОбработки.Серия
	|		ЛЕВОЕ СОЕДИНЕНИЕ ТоварыИзОрдера КАК ТоварыИзОрдера
	|		ПО ТоварыИзОбработкиБезГруппировки.Номенклатура = ТоварыИзОрдера.Номенклатура
	|			И ТоварыИзОбработкиБезГруппировки.Характеристика = ТоварыИзОрдера.Характеристика
	|			И ТоварыИзОбработкиБезГруппировки.Назначение = ТоварыИзОрдера.Назначение
	|			И ТоварыИзОбработкиБезГруппировки.Серия = ТоварыИзОрдера.Серия
	|			И (ТоварыИзОбработкиБезГруппировки.Упаковка = ТоварыИзОрдера.Упаковка)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТаблицаПроблем.НомерСтроки КАК НомерСтроки,
	|	ВЫБОР
	|		КОГДА ЕСТЬNULL(ТоварыИзОбработкиБезГруппировки.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ЭтоТоварноеМесто,
	|	ТаблицаПроблем.КоличествоУпаковокСумма КАК КоличествоУпаковокСумма,
	|	ТаблицаПроблем.КоличествоСумма КАК КоличествоСумма,
	|	ТаблицаПроблем.КоличествоВДокументе КАК КоличествоВДокументе,
	|	ТаблицаПроблем.КоличествоУпаковокВДокументе КАК КоличествоУпаковокВДокументе,
	|	ТаблицаПроблем.КоличествоУпаковокНеОтгружать КАК КоличествоУпаковокНеОтгружать,
	|	ТаблицаПроблем.СтатусПроблемы
	|ИЗ
	|	ТоварыИзОбработкиБезГруппировки КАК ТоварыИзОбработкиБезГруппировки
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаПроблем КАК ТаблицаПроблем
	|		ПО ТоварыИзОбработкиБезГруппировки.НомерСтроки = ТаблицаПроблем.НомерСтроки
	|			И (ТаблицаПроблем.СтатусПроблемы <> ТоварыИзОбработкиБезГруппировки.СтатусПроблемы
	|				ИЛИ ТаблицаПроблем.КоличествоСумма <> ТоварыИзОбработкиБезГруппировки.КоличествоСумма
	|				ИЛИ ТаблицаПроблем.КоличествоУпаковокСумма <> ТоварыИзОбработкиБезГруппировки.КоличествоУпаковокСумма
	|				ИЛИ ТаблицаПроблем.КоличествоУпаковокНеОтгружать <> ТоварыИзОбработкиБезГруппировки.КоличествоУпаковокНеОтгружать
	|				ИЛИ ТаблицаПроблем.КоличествоУпаковокВДокументе <> ТоварыИзОбработкиБезГруппировки.КоличествоУпаковокВДокументе)
	|
	|УПОРЯДОЧИТЬ ПО
	|	НомерСтроки";
	
	ТипыМерныхВеличин = Справочники.УпаковкиЕдиницыИзмерения.МерныеТипыЕдиницИзмерений();
	ДопустимоеОтклонениеКоличества = Константы.ДопустимоеОтклонениеОтгрузкиПриемкиМерныхТоваров.Получить();

	Запрос.УстановитьПараметр("Ссылка",Ордер);
	Запрос.УстановитьПараметр("ТоварыИзОбработки",Товары.Выгрузить());
	Запрос.УстановитьПараметр("УчитыватьУпаковки", УчитываемыеПоля.УчитыватьУпаковки);
	Запрос.УстановитьПараметр("УчитыватьСерии", УчитываемыеПоля.УчитыватьСерии);
	Запрос.УстановитьПараметр("НеУчитываемыеСтатусыСерий", УчитываемыеПоля.НеУчитываемыеСтатусыСерий);
	Запрос.УстановитьПараметр("ТипыМерныхВеличин", ТипыМерныхВеличин);
	Запрос.УстановитьПараметр("ДопустимоеОтклонение", ДопустимоеОтклонениеКоличества);

	Если ТекущиеДанные = Неопределено Тогда
		Запрос.УстановитьПараметр("ПоВсейТЧ",Истина);
		Запрос.УстановитьПараметр("ЭтоУдаление",Ложь);
		Запрос.УстановитьПараметр("НомерСтроки",Неопределено);
		Запрос.УстановитьПараметр("Номенклатура",Неопределено);
		Запрос.УстановитьПараметр("Характеристика",Неопределено);
		Запрос.УстановитьПараметр("Назначение", Неопределено);
		Запрос.УстановитьПараметр("Упаковка",Неопределено);
		Запрос.УстановитьПараметр("Серия",Неопределено);
	Иначе
		Запрос.УстановитьПараметр("ПоВсейТЧ",Ложь);
		Запрос.УстановитьПараметр("ЭтоУдаление",ЭтоУдаление);
		Запрос.УстановитьПараметр("НомерСтроки",ТекущиеДанные.НомерСтроки);
		Запрос.УстановитьПараметр("Номенклатура",ТекущиеДанные.Номенклатура);
		Запрос.УстановитьПараметр("Характеристика",ТекущиеДанные.Характеристика);
		Запрос.УстановитьПараметр("Назначение", ТекущиеДанные.Назначение);
		Запрос.УстановитьПараметр("Упаковка",ТекущиеДанные.Упаковка);
		Запрос.УстановитьПараметр("Серия",ТекущиеДанные.Серия);
	КонецЕсли;
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если ЗаполнятьТЧ Тогда
		Пока Выборка.Следующий() Цикл
			ЗаполнитьЗначенияСвойств(Товары[Выборка.НомерСтроки - 1], Выборка);
		КонецЦикла;
		Возврат Неопределено;
	Иначе
		Возврат Выборка;
	КонецЕсли;
		
КонецФункции

Функция РазбитьПоНеотгружаемым(УчитываемыеПоля) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	ТекстЗапросаВременныеТаблицыДокументаИОбработки() +
	"
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТоварыИзОбработки.Номенклатура,
	|	ТоварыИзОбработки.Характеристика,
	|	ТоварыИзОбработки.Назначение,
	|	ТоварыИзОбработки.Упаковка,
	|	ТоварыИзОбработки.Количество КАК Количество,
	|	ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0) КАК КоличествоУпаковокВДокументе,
	|	ТоварыИзОбработки.Серия,
	|	ТоварыИзОбработки.СтатусУказанияСерий
	|ИЗ
	|	ТоварыИзОбработки КАК ТоварыИзОбработки
	|		ЛЕВОЕ СОЕДИНЕНИЕ ТоварыИзОрдера КАК ТоварыИзОрдера
	|		ПО ТоварыИзОбработки.Номенклатура = ТоварыИзОрдера.Номенклатура
	|			И ТоварыИзОбработки.Характеристика = ТоварыИзОрдера.Характеристика
	|			И ТоварыИзОбработки.Назначение = ТоварыИзОрдера.Назначение
	|			И ТоварыИзОбработки.Упаковка = ТоварыИзОрдера.Упаковка
	|			И ТоварыИзОбработки.Серия = ТоварыИзОрдера.Серия
	|ГДЕ
	|	ТоварыИзОбработки.КоличествоУпаковок > ЕСТЬNULL(ТоварыИзОрдера.КоличествоУпаковок, 0)";	
	Запрос.УстановитьПараметр("Ссылка",Ордер);
	Запрос.УстановитьПараметр("ТоварыИзОбработки",Товары.Выгрузить());
	Запрос.УстановитьПараметр("УчитыватьУпаковки", УчитываемыеПоля.УчитыватьУпаковки);
	Запрос.УстановитьПараметр("УчитыватьСерии", УчитываемыеПоля.УчитыватьСерии);
	Запрос.УстановитьПараметр("НеУчитываемыеСтатусыСерий", УчитываемыеПоля.НеУчитываемыеСтатусыСерий);
	
	Запрос.УстановитьПараметр("ПоВсейТЧ",Истина);
	Запрос.УстановитьПараметр("ЭтоУдаление",Ложь);
	Запрос.УстановитьПараметр("НомерСтроки",Неопределено);
	Запрос.УстановитьПараметр("Номенклатура",Неопределено);
	Запрос.УстановитьПараметр("Характеристика",Неопределено);
	Запрос.УстановитьПараметр("Назначение",Неопределено);
	Запрос.УстановитьПараметр("Упаковка",Неопределено);
	Запрос.УстановитьПараметр("Серия",Неопределено);

	Возврат Запрос.Выполнить().Выбрать();
	
КонецФункции

Функция ТекстЗапросаВременныеТаблицыДокументаИОбработки()
	                             
	ЭтоОрдерНаПеремещение = ТипЗнч(Ордер) = Тип("ДокументСсылка.ОрдерНаПеремещениеТоваров");
	Если ЭтоОрдерНаПеремещение Тогда
		ТекстЗапроса =
		"ВЫБРАТЬ
		|	ТаблицаТовары.Номенклатура КАК Номенклатура,
		|	ТаблицаТовары.Характеристика КАК Характеристика,
		|	ТаблицаТовары.Назначение КАК Назначение,
		|	ВЫБОР
		|		КОГДА ТаблицаТовары.СтатусУказанияСерий В (&НеУчитываемыеСтатусыСерий)
		|			ТОГДА ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
		|		ИНАЧЕ ТаблицаТовары.Серия
		|	КОНЕЦ КАК Серия,
		|	ВЫБОР
		|		КОГДА &УчитыватьУпаковки
		|				ИЛИ ЕСТЬNULL(ТаблицаТовары.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
		|			ТОГДА ТаблицаТовары.Упаковка
		|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
		|	КОНЕЦ КАК Упаковка,
		|	ВЫБОР
		|		КОГДА ТаблицаТовары.Действие = ЗНАЧЕНИЕ(Перечисление.ДействияСоСтрокамиОрдеровНаОтгрузку.НеОтгружать)
		|			ТОГДА 0
		|		ИНАЧЕ ТаблицаТовары.Количество
		|	КОНЕЦ КАК Количество,
		|	ВЫБОР
		|		КОГДА ТаблицаТовары.Действие = ЗНАЧЕНИЕ(Перечисление.ДействияСоСтрокамиОрдеровНаОтгрузку.НеОтгружать)
		|			ТОГДА 0
		|		КОГДА &УчитыватьУпаковки
		|				ИЛИ ЕСТЬNULL(ТаблицаТовары.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
		|			ТОГДА ТаблицаТовары.КоличествоУпаковок
		|		ИНАЧЕ ТаблицаТовары.Количество
		|	КОНЕЦ КАК КоличествоУпаковок
		|ПОМЕСТИТЬ ТоварыИзОрдераДляЗапроса
		|ИЗ
		|	Документ.ОрдерНаПеремещениеТоваров.ОтгружаемыеТовары КАК ТаблицаТовары
		|ГДЕ
		|	ИСТИНА
		|	И ТаблицаТовары.Ссылка = &Ссылка
		|	И &УсловиеОтбораСтрок
		|	И (&ПоВсейТЧ
		|			ИЛИ ТаблицаТовары.Номенклатура = &Номенклатура
		|				И ТаблицаТовары.Характеристика = &Характеристика
		|				И ТаблицаТовары.Назначение = &Назначение
		|				И (ТаблицаТовары.Упаковка = &Упаковка
		|					ИЛИ НЕ &УчитыватьУпаковки)
		|				И (ТаблицаТовары.Серия = &Серия
		|					ИЛИ НЕ &УчитыватьСерии))";
	Иначе
		ТекстЗапроса =
		"ВЫБРАТЬ
		|	ТаблицаТовары.Номенклатура КАК Номенклатура,
		|	ТаблицаТовары.Характеристика КАК Характеристика,
		|	ТаблицаТовары.Назначение КАК Назначение,
		|	ВЫБОР
		|		КОГДА ТаблицаТовары.СтатусУказанияСерий В (&НеУчитываемыеСтатусыСерий)
		|			ТОГДА ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
		|		ИНАЧЕ ТаблицаТовары.Серия
		|	КОНЕЦ КАК Серия,
		|	ВЫБОР
		|		КОГДА &УчитыватьУпаковки
		|				ИЛИ ЕСТЬNULL(ТаблицаТовары.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
		|			ТОГДА ТаблицаТовары.Упаковка
		|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
		|	КОНЕЦ КАК Упаковка,
		|	ВЫБОР
		|		КОГДА ТаблицаТовары.Действие = ЗНАЧЕНИЕ(Перечисление.ДействияСоСтрокамиОрдеровНаОтгрузку.НеОтгружать)
		|			ТОГДА 0
		|		ИНАЧЕ ТаблицаТовары.Количество
		|	КОНЕЦ КАК Количество,
		|	ВЫБОР
		|		КОГДА ТаблицаТовары.Действие = ЗНАЧЕНИЕ(Перечисление.ДействияСоСтрокамиОрдеровНаОтгрузку.НеОтгружать)
		|			ТОГДА 0
		|		КОГДА &УчитыватьУпаковки
		|				ИЛИ ЕСТЬNULL(ТаблицаТовары.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
		|			ТОГДА ТаблицаТовары.КоличествоУпаковок
		|		ИНАЧЕ ТаблицаТовары.Количество
		|	КОНЕЦ КАК КоличествоУпаковок
		|ПОМЕСТИТЬ ТоварыИзОрдераДляЗапроса
		|ИЗ
		|	Документ.РасходныйОрдерНаТовары.ОтгружаемыеТовары КАК ТаблицаТовары
		|ГДЕ
		|	ИСТИНА
		|	И ТаблицаТовары.Ссылка = &Ссылка
		|	И &УсловиеОтбораСтрок
		|	И (&ПоВсейТЧ
		|			ИЛИ ТаблицаТовары.Номенклатура = &Номенклатура
		|				И ТаблицаТовары.Характеристика = &Характеристика
		|				И ТаблицаТовары.Назначение = &Назначение
		|				И (ТаблицаТовары.Упаковка = &Упаковка
		|					ИЛИ НЕ &УчитыватьУпаковки)
		|				И (ТаблицаТовары.Серия = &Серия
		|					ИЛИ НЕ &УчитыватьСерии))";
	КонецЕсли;
	ТекстЗапроса = ТекстЗапроса + "
	|;";
	
	ТекстЗапроса = ТекстЗапроса + Символы.ПС +
	"ВЫБРАТЬ
	|	ВЫРАЗИТЬ(ТаблицаТовары.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
	|	ТаблицаТовары.Характеристика,
	|	ТаблицаТовары.Назначение,
	|	ТаблицаТовары.Серия КАК Серия,
	|	ТаблицаТовары.Упаковка КАК Упаковка,
	|	СУММА(ТаблицаТовары.Количество) КАК Количество,
	|	СУММА(ТаблицаТовары.КоличествоУпаковок) КАК КоличествоУпаковок
	|ПОМЕСТИТЬ ТоварыИзОрдера
	|ИЗ
	|	ТоварыИзОрдераДляЗапроса КАК ТаблицаТовары
	|
	|СГРУППИРОВАТЬ ПО
	|	ТаблицаТовары.Номенклатура,
	|	ТаблицаТовары.Характеристика,
	|	ТаблицаТовары.Назначение,
	|	ТаблицаТовары.Серия,
	|	ТаблицаТовары.Упаковка
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТоварыИзОбработки.Номенклатура,
	|	ТоварыИзОбработки.Характеристика,
	|	ТоварыИзОбработки.Назначение,
	|	ВЫРАЗИТЬ(ТоварыИзОбработки.Упаковка КАК Справочник.УпаковкиЕдиницыИзмерения) КАК Упаковка,
	|	ТоварыИзОбработки.Количество КАК Количество,
	|	ТоварыИзОбработки.КоличествоУпаковок КАК КоличествоУпаковок,
	|	ТоварыИзОбработки.КоличествоУпаковокНеОтгружать КАК КоличествоУпаковокНеОтгружать,
	|	ТоварыИзОбработки.КоличествоУпаковокСумма КАК КоличествоУпаковокСумма,
	|	ТоварыИзОбработки.КоличествоСумма КАК КоличествоСумма,
	|	ТоварыИзОбработки.КоличествоУпаковокВДокументе КАК КоличествоУпаковокВДокументе,
	|	ТоварыИзОбработки.Серия КАК Серия,
	|	ТоварыИзОбработки.СтатусУказанияСерий,
	|	ТоварыИзОбработки.НомерСтроки,
	|	ТоварыИзОбработки.СтатусПроблемы,
	|	ТоварыИзОбработки.НеОтгружать
	|ПОМЕСТИТЬ ТоварыИзОбработкиДляЗапроса
	|ИЗ
	|	&ТоварыИзОбработки КАК ТоварыИзОбработки
	|ГДЕ
	|	(&ПоВсейТЧ
	|			ИЛИ ТоварыИзОбработки.Номенклатура = &Номенклатура
	|				И ТоварыИзОбработки.Характеристика = &Характеристика
	|				И ТоварыИзОбработки.Назначение = &Назначение
	|				И (ТоварыИзОбработки.Упаковка = &Упаковка
	|					ИЛИ НЕ &УчитыватьУпаковки)
	|				И (ТоварыИзОбработки.Серия = &Серия
	|					ИЛИ НЕ &УчитыватьСерии))
	|	И (НЕ &ЭтоУдаление
	|			ИЛИ ТоварыИзОбработки.НомерСтроки <> &НомерСтроки)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТоварыИзОбработки.Номенклатура,
	|	ТоварыИзОбработки.Характеристика,
	|	ТоварыИзОбработки.Назначение,
	|	ВЫБОР
	|		КОГДА &УчитыватьУпаковки
	|				ИЛИ ЕСТЬNULL(ТоварыИзОбработки.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|			ТОГДА ВЫРАЗИТЬ(ТоварыИзОбработки.Упаковка КАК Справочник.УпаковкиЕдиницыИзмерения)
	|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
	|	КОНЕЦ КАК Упаковка,
	|	ТоварыИзОбработки.Количество КАК Количество,
	|	ВЫБОР
	|		КОГДА &УчитыватьУпаковки
	|				ИЛИ ЕСТЬNULL(ТоварыИзОбработки.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|			ТОГДА ТоварыИзОбработки.КоличествоУпаковок
	|		ИНАЧЕ ТоварыИзОбработки.Количество
	|	КОНЕЦ КАК КоличествоУпаковок,
	|	ТоварыИзОбработки.КоличествоУпаковокНеОтгружать КАК КоличествоУпаковокНеОтгружать,
	|	ТоварыИзОбработки.КоличествоУпаковокСумма КАК КоличествоУпаковокСумма,
	|	ТоварыИзОбработки.КоличествоСумма КАК КоличествоСумма,
	|	ТоварыИзОбработки.КоличествоУпаковокВДокументе КАК КоличествоУпаковокВДокументе,
	|	ВЫБОР
	|		КОГДА НЕ ТоварыИзОбработки.СтатусУказанияСерий В (&НеУчитываемыеСтатусыСерий)
	|			ТОГДА ТоварыИзОбработки.Серия
	|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)
	|	КОНЕЦ КАК Серия,
	|	ТоварыИзОбработки.СтатусУказанияСерий,
	|	ТоварыИзОбработки.НомерСтроки,
	|	ТоварыИзОбработки.СтатусПроблемы,
	|	ТоварыИзОбработки.НеОтгружать
	|ПОМЕСТИТЬ ТоварыИзОбработкиБезГруппировки
	|ИЗ
	|	ТоварыИзОбработкиДляЗапроса КАК ТоварыИзОбработки
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВЫРАЗИТЬ(ТоварыИзОбработкиБезГруппировки.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
	|	ТоварыИзОбработкиБезГруппировки.Характеристика,
	|	ТоварыИзОбработкиБезГруппировки.Назначение,
	|	ТоварыИзОбработкиБезГруппировки.Серия,
	|	ТоварыИзОбработкиБезГруппировки.Упаковка,
	|	СУММА(ТоварыИзОбработкиБезГруппировки.КоличествоУпаковок) КАК КоличествоУпаковок
	|ПОМЕСТИТЬ ТоварыИзОбработкиВТоварныхМестахОтгружаемые
	|ИЗ
	|	ТоварыИзОбработкиБезГруппировки КАК ТоварыИзОбработкиБезГруппировки
	|ГДЕ
	|	ЕСТЬNULL(ТоварыИзОбработкиБезГруппировки.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|	И ТоварыИзОбработкиБезГруппировки.НеОтгружать = 0
	|
	|СГРУППИРОВАТЬ ПО
	|	ВЫРАЗИТЬ(ТоварыИзОбработкиБезГруппировки.Номенклатура КАК Справочник.Номенклатура),
	|	ТоварыИзОбработкиБезГруппировки.Характеристика,
	|	ТоварыИзОбработкиБезГруппировки.Назначение,
	|	ТоварыИзОбработкиБезГруппировки.Упаковка,
	|	ТоварыИзОбработкиБезГруппировки.Серия
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ТоварыИзОбработкиВТоварныхМестах.Номенклатура,
	|	ТоварыИзОбработкиВТоварныхМестах.Характеристика,
	|	ТоварыИзОбработкиВТоварныхМестах.Назначение,
	|	ТоварыИзОбработкиВТоварныхМестах.Серия,
	|	УпаковкиЕдиницыИзмерения.Ссылка КАК ТоварноеМесто,
	|	УпаковкиЕдиницыИзмерения.КоличествоУпаковок
	|ПОМЕСТИТЬ ТоварныеМестаНоменклатуры
	|ИЗ
	|	ТоварыИзОбработкиВТоварныхМестахОтгружаемые КАК ТоварыИзОбработкиВТоварныхМестах
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УпаковкиЕдиницыИзмерения КАК УпаковкиЕдиницыИзмерения
	|		ПО ТоварыИзОбработкиВТоварныхМестах.Номенклатура.НаборУпаковок = УпаковкиЕдиницыИзмерения.Владелец
	|ГДЕ
	|	НЕ УпаковкиЕдиницыИзмерения.ПометкаУдаления
	|	И УпаковкиЕдиницыИзмерения.ТипУпаковки = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ТоварыИзОбработкиВТоварныхМестах.Номенклатура,
	|	ТоварыИзОбработкиВТоварныхМестах.Характеристика,
	|	ТоварыИзОбработкиВТоварныхМестах.Назначение,
	|	ТоварыИзОбработкиВТоварныхМестах.Серия,
	|	УпаковкиЕдиницыИзмерения.Ссылка,
	|	УпаковкиЕдиницыИзмерения.КоличествоУпаковок
	|ИЗ
	|	ТоварыИзОбработкиВТоварныхМестахОтгружаемые КАК ТоварыИзОбработкиВТоварныхМестах
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.УпаковкиЕдиницыИзмерения КАК УпаковкиЕдиницыИзмерения
	|		ПО ТоварыИзОбработкиВТоварныхМестах.Номенклатура.НаборУпаковок = ЗНАЧЕНИЕ(Справочник.НаборыУпаковок.ИндивидуальныйДляНоменклатуры)
	|			И ТоварыИзОбработкиВТоварныхМестах.Номенклатура = УпаковкиЕдиницыИзмерения.Владелец
	|ГДЕ
	|	НЕ УпаковкиЕдиницыИзмерения.ПометкаУдаления
	|	И УпаковкиЕдиницыИзмерения.ТипУпаковки = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТоварныеМестаНоменклатуры.Номенклатура,
	|	ТоварныеМестаНоменклатуры.Характеристика,
	|	ТоварныеМестаНоменклатуры.Назначение,
	|	ТоварныеМестаНоменклатуры.Серия,
	|	МИНИМУМ(ВЫБОР
	|			КОГДА ЕСТЬNULL(ТоварыИзОбработкиВТоварныхМестах.КоличествоУпаковок, 0) / ТоварныеМестаНоменклатуры.КоличествоУпаковок - (ВЫРАЗИТЬ(ЕСТЬNULL(ТоварыИзОбработкиВТоварныхМестах.КоличествоУпаковок, 0) / ТоварныеМестаНоменклатуры.КоличествоУпаковок КАК ЧИСЛО(12, 0))) >= 0
	|				ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ТоварыИзОбработкиВТоварныхМестах.КоличествоУпаковок, 0) / ТоварныеМестаНоменклатуры.КоличествоУпаковок КАК ЧИСЛО(12, 0))
	|			ИНАЧЕ (ВЫРАЗИТЬ(ЕСТЬNULL(ТоварыИзОбработкиВТоварныхМестах.КоличествоУпаковок, 0) / ТоварныеМестаНоменклатуры.КоличествоУпаковок КАК ЧИСЛО(12, 0))) - 1
	|		КОНЕЦ) КАК Количество
	|ПОМЕСТИТЬ ТоварыИзОбработкиВТоварныхМестахКомплектыОтгружаемые
	|ИЗ
	|	ТоварныеМестаНоменклатуры КАК ТоварныеМестаНоменклатуры
	|		ЛЕВОЕ СОЕДИНЕНИЕ ТоварыИзОбработкиВТоварныхМестахОтгружаемые КАК ТоварыИзОбработкиВТоварныхМестах
	|		ПО ТоварныеМестаНоменклатуры.Номенклатура = ТоварыИзОбработкиВТоварныхМестах.Номенклатура
	|			И ТоварныеМестаНоменклатуры.Характеристика = ТоварыИзОбработкиВТоварныхМестах.Характеристика
	|			И ТоварныеМестаНоменклатуры.Назначение = ТоварыИзОбработкиВТоварныхМестах.Назначение
	|			И ТоварныеМестаНоменклатуры.Серия = ТоварыИзОбработкиВТоварныхМестах.Серия
	|			И ТоварныеМестаНоменклатуры.ТоварноеМесто = ТоварыИзОбработкиВТоварныхМестах.Упаковка
	|
	|СГРУППИРОВАТЬ ПО
	|	ТоварныеМестаНоменклатуры.Номенклатура,
	|	ТоварныеМестаНоменклатуры.Характеристика,
	|	ТоварныеМестаНоменклатуры.Назначение,
	|	ТоварныеМестаНоменклатуры.Серия
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТоварыИзОбработкиБезГруппировки.Номенклатура,
	|	ТоварыИзОбработкиБезГруппировки.Характеристика,
	|	ТоварыИзОбработкиБезГруппировки.Назначение,
	|	ТоварыИзОбработкиБезГруппировки.Упаковка,
	|	ВЫБОР
	|		КОГДА ТоварыИзОбработкиБезГруппировки.Упаковка = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|			ТОГДА СУММА(ВЫБОР
	|						КОГДА ТоварыИзОбработкиБезГруппировки.НеОтгружать = 0
	|							ТОГДА ТоварыИзОбработкиБезГруппировки.КоличествоУпаковок
	|						ИНАЧЕ 0
	|					КОНЕЦ) / ТоварыИзОбработкиБезГруппировки.Упаковка.КоличествоУпаковок
	|		ИНАЧЕ СУММА(ВЫБОР
	|					КОГДА ТоварыИзОбработкиБезГруппировки.НеОтгружать = 0
	|						ТОГДА ТоварыИзОбработкиБезГруппировки.Количество
	|					ИНАЧЕ 0
	|				КОНЕЦ)
	|	КОНЕЦ КАК Количество,
	|	СУММА(ВЫБОР
	|			КОГДА ТоварыИзОбработкиБезГруппировки.НеОтгружать = 0
	|				ТОГДА ТоварыИзОбработкиБезГруппировки.КоличествоУпаковок
	|			ИНАЧЕ 0
	|		КОНЕЦ) КАК КоличествоУпаковок,
	|	ВЫБОР
	|		КОГДА ТоварыИзОбработкиБезГруппировки.Упаковка = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто)
	|			ТОГДА СУММА(ВЫБОР
	|						КОГДА ТоварыИзОбработкиБезГруппировки.НеОтгружать = 1
	|							ТОГДА ТоварыИзОбработкиБезГруппировки.КоличествоУпаковок
	|						ИНАЧЕ 0
	|					КОНЕЦ) / ТоварыИзОбработкиБезГруппировки.Упаковка.КоличествоУпаковок
	|		ИНАЧЕ СУММА(ВЫБОР
	|					КОГДА ТоварыИзОбработкиБезГруппировки.НеОтгружать = 1
	|						ТОГДА ТоварыИзОбработкиБезГруппировки.Количество
	|					ИНАЧЕ 0
	|				КОНЕЦ)
	|	КОНЕЦ КАК КоличествоНеОтгружать,
	|	СУММА(ВЫБОР
	|			КОГДА ТоварыИзОбработкиБезГруппировки.НеОтгружать = 1
	|				ТОГДА ТоварыИзОбработкиБезГруппировки.КоличествоУпаковок
	|			ИНАЧЕ 0
	|		КОНЕЦ) КАК КоличествоУпаковокНеОтгружать,
	|	ТоварыИзОбработкиБезГруппировки.Серия,
	|	ЕСТЬNULL(ТоварыИзОбработкиВТоварныхМестахКомплектыОтгружаемые.Количество, ТоварыИзОбработкиБезГруппировки.КоличествоСумма) КАК КоличествоСумма,
	|	МАКСИМУМ(ТоварыИзОбработкиБезГруппировки.НеОтгружать) КАК НеОтгружать,
	|	МАКСИМУМ(ТоварыИзОбработкиБезГруппировки.СтатусУказанияСерий) КАК СтатусУказанияСерий
	|ПОМЕСТИТЬ ТоварыИзОбработки
	|ИЗ
	|	ТоварыИзОбработкиБезГруппировки КАК ТоварыИзОбработкиБезГруппировки
	|		ЛЕВОЕ СОЕДИНЕНИЕ ТоварыИзОбработкиВТоварныхМестахКомплектыОтгружаемые КАК ТоварыИзОбработкиВТоварныхМестахКомплектыОтгружаемые
	|		ПО ТоварыИзОбработкиБезГруппировки.Номенклатура = ТоварыИзОбработкиВТоварныхМестахКомплектыОтгружаемые.Номенклатура
	|			И ТоварыИзОбработкиБезГруппировки.Характеристика = ТоварыИзОбработкиВТоварныхМестахКомплектыОтгружаемые.Характеристика
	|			И ТоварыИзОбработкиБезГруппировки.Назначение = ТоварыИзОбработкиВТоварныхМестахКомплектыОтгружаемые.Назначение
	|			И ТоварыИзОбработкиБезГруппировки.Серия = ТоварыИзОбработкиВТоварныхМестахКомплектыОтгружаемые.Серия
	|			И (ЕСТЬNULL(ТоварыИзОбработкиБезГруппировки.Упаковка.ТипУпаковки, НЕОПРЕДЕЛЕНО) = ЗНАЧЕНИЕ(Перечисление.ТипыУпаковокНоменклатуры.ТоварноеМесто))
	|
	|СГРУППИРОВАТЬ ПО
	|	ТоварыИзОбработкиБезГруппировки.Номенклатура,
	|	ТоварыИзОбработкиБезГруппировки.Характеристика,
	|	ТоварыИзОбработкиБезГруппировки.Назначение,
	|	ТоварыИзОбработкиБезГруппировки.Упаковка,
	|	ТоварыИзОбработкиБезГруппировки.Серия,
	|	ЕСТЬNULL(ТоварыИзОбработкиВТоварныхМестахКомплектыОтгружаемые.Количество, ТоварыИзОбработкиБезГруппировки.КоличествоСумма),
	|	ТоварыИзОбработкиБезГруппировки.Упаковка.КоличествоУпаковок
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|УНИЧТОЖИТЬ ТоварыИзОрдераДляЗапроса
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|УНИЧТОЖИТЬ ТоварыИзОбработкиДляЗапроса
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|УНИЧТОЖИТЬ ТоварыИзОбработкиВТоварныхМестахОтгружаемые
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|УНИЧТОЖИТЬ ТоварныеМестаНоменклатуры
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|УНИЧТОЖИТЬ ТоварыИзОбработкиВТоварныхМестахКомплектыОтгружаемые";
	
	ТекстЗапроса = ТекстЗапроса + ";";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&УсловиеОтбораСтрок", Обработки.ПроверкаКоличестваТоваровВДокументе.УсловиеОтбораСтрок(ЭтотОбъект)); 
	
	Возврат ТекстЗапроса;
КонецФункции

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

#КонецЕсли

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