Корректировка назначения товаров / Модуль менеджера

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

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

#Область Проведение

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

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

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

//++ Локализация

//++ НЕ УТ

#Область Печать

// Заполняет список команд печати.
// 
// Параметры:
//   КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	Если Константы.ВыводитьДопКолонкиНаправлениеДеятельностиИГК.Получить() Тогда
		КомандаПечати = КомандыПечати.Добавить();
		КомандаПечати.МенеджерПечати = "Документ.КорректировкаНазначенияТоваров";
		КомандаПечати.Идентификатор = "КорректировкаНазначенияТоваров";
		КомандаПечати.Представление = НСтр("ru = 'Корректировка назначения товаров'");
		КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
	КонецЕсли;
	
КонецПроцедуры 

// Формирует печатные формы.
//
// Параметры:
//  МассивОбъектов  - Массив    - ссылки на объекты, которые нужно распечатать;
//  ПараметрыПечати - Структура - дополнительные настройки печати;
//  КоллекцияПечатныхФорм - ТаблицаЗначений - сформированные табличные документы (выходной параметр).
//  ОбъектыПечати         - СписокЗначений  - значение - ссылка на объект;
//                                            представление - имя области в которой был выведен объект (выходной
//                                                            параметр);
//  ПараметрыВывода       - Структура       - дополнительные параметры сформированных табличных документов (выходной
//                                            параметр).
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "КорректировкаНазначенияТоваров") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, 
		                                                     "КорректировкаНазначенияТоваров",
		                                                     НСтр("ru = 'Корректировка назначения товаров'"), 
		                                                     ПечатнаяФормаКорректировкаНазначенияТоваров(МассивОбъектов, ОбъектыПечати, ПараметрыПечати));
	КонецЕсли;
	
КонецПроцедуры 

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

//-- НЕ УТ

//-- Локализация

// Определяет список команд создания на основании.
//
// Параметры:
//  КомандыСозданияНаОсновании - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.КомандыСозданияНаОсновании
//  Параметры - см. СозданиеНаОснованииПереопределяемый.ПередДобавлениемКомандСозданияНаОсновании.Параметры
//
Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры) Экспорт
	
	КорректировкаНазначенияТоваровЛокализация.ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании, Параметры);

КонецПроцедуры

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

// Определяет список команд отчетов.
//
// Параметры:
//   КомандыОтчетов - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.КомандыОтчетов
//   Параметры - См. ВариантыОтчетовПереопределяемый.ПередДобавлениемКомандОтчетов.Параметры
//
Процедура ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры) Экспорт
	
	КорректировкаНазначенияТоваровЛокализация.ДобавитьКомандыОтчетов(КомандыОтчетов, Параметры);

КонецПроцедуры

// Имена реквизитов, от значений которых зависят параметры указания серий
//
//	Возвращаемое значение:
//		Строка - имена реквизитов, перечисленные через запятую.
//
Функция ИменаРеквизитовДляЗаполненияПараметровУказанияСерий() Экспорт
	ИменаРеквизитов = "Дата";
	
	Возврат ИменаРеквизитов;
КонецФункции

// Возвращает параметры указания серий для товаров, указанных в документе
//
// Параметры:
//  Объект - Структура - структура значений реквизитов объекта, необходимых для заполнения параметров указания серий.
//
// Возвращаемое значение:
//  Структура - состав полей задается в функции НоменклатураКлиентСервер.ПараметрыУказанияСерий.
//
Функция ПараметрыУказанияСерий(Объект) Экспорт
	
	ПараметрыУказанияСерий = НоменклатураКлиентСервер.ПараметрыУказанияСерий();
	
	ПараметрыУказанияСерий.ПолноеИмяОбъекта = "Документ.КорректировкаНазначенияТоваров";
	
	ПараметрыУказанияСерий.ИмяТЧСерии = "Товары";
	ПараметрыУказанияСерий.УчитыватьСебестоимостьПоСериям = ПолучитьФункциональнуюОпцию("УчитыватьСебестоимостьПоСериямСклад");
	ПараметрыУказанияСерий.ИспользоватьСерииНоменклатуры  = ПолучитьФункциональнуюОпцию("ИспользоватьСерииНоменклатурыСклад");
	
	ПараметрыУказанияСерий.СкладскиеОперации.Добавить(Перечисления.СкладскиеОперации.ПустаяСсылка());
	
	ПараметрыУказанияСерий.ИменаПолейДополнительные.Добавить("Склад");
	ПараметрыУказанияСерий.ИменаПолейДополнительные.Добавить("ИсходноеНазначение");
	ПараметрыУказанияСерий.ИменаПолейДополнительные.Добавить("НовоеНазначение");
	
	ПараметрыУказанияСерий.ЭтоНакладная = Истина;
	
	ПараметрыУказанияСерий.Дата = Объект.Дата;
	
	Возврат ПараметрыУказанияСерий;

КонецФункции

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

КонецФункции

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

// Возвращает массив доступных действий с документом КорректировкаНазначенияТоваров
//
// Параметры:
//  Назначение		 - СправочникСсылка.Назначения	 - назначение, выбранное в корректировке, 
//                      для алгоритма имеет смысл только давальческое.
// Возвращаемое значение:
//  Массив Из ПеречислениеСсылка.ВидыОперацийКорректировкиНазначения - массив доступных операций.
//
Функция ДоступныеДействия(Назначение = Неопределено) Экспорт
	
	ЧастичныеПрава = Ложь;
	
	Если Не Пользователи.РолиДоступны("ДополнительныеОперацииКорректировкиНазначенияТоваров") Тогда
		ЧастичныеПрава = Истина;
	КонецЕсли;
	
	ЭтоДавальческийМатериал = Ложь;
	Если ЗначениеЗаполнено(Назначение) Тогда
		
		ТипНазначения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Назначение, "ТипНазначения");
		
		Если ТипНазначения = Перечисления.ТипыНазначений.ДавальческоеМатериалыПодЭтап22
			//++ Устарело_Переработка24
			Или ТипНазначения = Перечисления.ТипыНазначений.ДавальческоеМатериалы22
			Или ТипНазначения = Перечисления.ТипыНазначений.Давальческое21
			//-- Устарело_Переработка24
			Или Ложь Тогда
			ЭтоДавальческийМатериал = Истина;
		КонецЕсли;
		
	КонецЕсли;
	
	Массив = Новый Массив();
	Если Не ЭтоДавальческийМатериал Тогда
		Массив.Добавить(Перечисления.ВидыОперацийКорректировкиНазначения.Резервировать);
	КонецЕсли;
	
	Если Не ЧастичныеПрава Тогда
		Массив.Добавить(Перечисления.ВидыОперацийКорректировкиНазначения.РезервироватьИКорректировать);
	КонецЕсли;
	
	Массив.Добавить(Перечисления.ВидыОперацийКорректировкиНазначения.СнятьРезерв);
	
	Если Не ЧастичныеПрава Тогда
		Массив.Добавить(Перечисления.ВидыОперацийКорректировкиНазначения.СнятьРезервПоМногимНазначениям);
	КонецЕсли;
	
	Если Не ЧастичныеПрава Тогда
		Массив.Добавить(Перечисления.ВидыОперацийКорректировкиНазначения.ПроизвольнаяКорректировкаНазначений);
	КонецЕсли;
	
	Возврат Массив;
	
КонецФункции

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

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

//++ НЕ УТ
#Область ПроводкиРеглУчета

// Функция возвращает текст запроса для отражения документа в регламентированном учете.
//
// Возвращаемое значение:
//	Строка - Текст запроса
//
Функция ТекстОтраженияВРеглУчете() Экспорт

	Возврат КорректировкаНазначенияТоваровЛокализация.ТекстОтраженияВРеглУчете();

КонецФункции

// Функция возвращает текст запроса дополнительных временных таблиц,
// необходимых для отражения в регламентированном учете.
//
// Возвращаемое значение:
//	Строка - Текст запроса создания временных таблиц.
//
Функция ТекстЗапросаВТОтраженияВРеглУчете() Экспорт

	Возврат КорректировкаНазначенияТоваровЛокализация.ТекстЗапросаВТОтраженияВРеглУчете();

КонецФункции

#КонецОбласти
//-- НЕ УТ

// Инициализирует параметры, обслуживающие выбор назначений в формах документа.
//
//  Возвращаемое значение:
//  См. Справочники.Назначения.МакетФормыВыбораНазначений
//
Функция МакетФормыВыбораНазначений() Экспорт
	
	МакетФормы = Справочники.Назначения.МакетФормыВыбораНазначений();
	
	ШаблонНазначения = Справочники.Назначения.ДобавитьШаблонНазначений(МакетФормы);
	ШаблонНазначения.ТипыНазначений.Удалить(ШаблонНазначения.ТипыНазначений.Найти(Перечисления.ТипыНазначений.ДавальческоеПродукция22));
	ШаблонНазначения.Договор = "&Договор";
	ШаблонНазначения.УсловиеИспользования = "Объект.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийКорректировкиНазначения.СнятьРезерв)";
	
	ШаблонНазначения = Справочники.Назначения.ДобавитьШаблонНазначений(МакетФормы);
	ШаблонНазначения.ТипыНазначений.Удалить(ШаблонНазначения.ТипыНазначений.Найти(Перечисления.ТипыНазначений.ДавальческоеПродукция22));
	ШаблонНазначения.Договор = "&Договор";
	ШаблонНазначения.УсловиеИспользования = "Объект.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийКорректировкиНазначения.РезервироватьИКорректировать)";
	
	ШаблонНазначения = Справочники.Назначения.ДобавитьШаблонНазначений(МакетФормы);
	ШаблонНазначения.ТипыНазначений.Удалить(ШаблонНазначения.ТипыНазначений.Найти(Перечисления.ТипыНазначений.ДавальческоеПродукция22));
	ШаблонНазначения.УсловиеИспользования = "Объект.ВидОперации В(
		|ЗНАЧЕНИЕ(Перечисление.ВидыОперацийКорректировкиНазначения.СнятьРезервПоМногимНазначениям),
		|ЗНАЧЕНИЕ(Перечисление.ВидыОперацийКорректировкиНазначения.Резервировать),
		|ЗНАЧЕНИЕ(Перечисление.ВидыОперацийКорректировкиНазначения.ПроизвольнаяКорректировкаНазначений),
		|ЗНАЧЕНИЕ(Перечисление.ВидыОперацийКорректировкиНазначения.ВстречнаяКорректировка),
		|ЗНАЧЕНИЕ(Перечисление.ВидыОперацийКорректировкиНазначения.ПустаяСсылка))";
	
	// Остатки списываемых товаров на складе.
	ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказов", Истина, "Объект.Товары.ИсходноеНазначение", "ВНаличии");
	ОписаниеКолонок.Колонки.НайтиПоЗначению("ВНаличии").Пометка = Истина;
	
	ОписаниеКолонок.ПутиКДанным.Номенклатура     = "Объект.Товары.Номенклатура";
	ОписаниеКолонок.ПутиКДанным.Характеристика   = "Объект.Товары.Характеристика";
	ОписаниеКолонок.ПутиКДанным.Склад            = "Объект.Товары.Склад";
	ОписаниеКолонок.ПутиКДанным.ИсключаемыеНазначения = "Объект.Назначение";
	
	// Потребности в оприходуемых товарах на складе.
	ОписаниеКолонок = Справочники.Назначения.ДобавитьОписаниеКолонок(МакетФормы, "ОбеспечениеЗаказов", Истина, "Объект.Товары.НовоеНазначение", "Потребность");
	ОписаниеКолонок.Колонки.НайтиПоЗначению("Потребность").Пометка = Истина;
	
	ОписаниеКолонок.ПутиКДанным.Номенклатура     = "Объект.Товары.Номенклатура";
	ОписаниеКолонок.ПутиКДанным.Характеристика   = "Объект.Товары.Характеристика";
	ОписаниеКолонок.ПутиКДанным.Склад            = "Объект.Товары.Склад";
	ОписаниеКолонок.ПутиКДанным.ИсключаемыеНазначения = "Объект.Назначение";
	
	Возврат МакетФормы;
	
КонецФункции

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЗначениеРазрешено(Организация)";

КонецПроцедуры

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

// Возвращает структуру с наименованием табличных частей документа, хранящих информацию о товарах.
//
// Возвращаемое значение:
//	Структура - коллекция, содержащая следующие наименования табличных частей:
//		* Товары - ТаблицаЗначений, ТабличнаяЧасть, Неопределено - данные о товарах документа.
//	
Функция КоллекцияТабличныхЧастейТоваров() Экспорт
	
	ТаблицыДокумента = Новый Структура("Товары");
	
	Возврат ТаблицыДокумента;
	
КонецФункции

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

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

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

#Область ЗаполнениеПоОстаткам

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

// Возвращает таблицу для заполнения корректировки назначения.
// Параметры:
//  Организация - СправочникСсылка.СтруктураПредприятия -
//  Товары - ТаблицаЗначений
//  Регистратор - ДокументСсылка.КорректировкаНазначенияТоваров, Неопределено -
// Возвращаемое значение:
//  Структура -
//   *ТаблицаТоваров - ТаблицаЗначений -
//   *ТаблицаИтогов - ТаблицаЗначений -

Функция ТаблицаСнятияРезерваПоМногимНазначениям(Организация, Товары, Регистратор, Назначения) Экспорт

	Запрос = Новый Запрос();
	Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	Запрос.УстановитьПараметр("Организация",     Организация);
	Запрос.УстановитьПараметр("ВсеОрганизации",  Организация = Неопределено);
	Запрос.УстановитьПараметр("Товары",          Товары);
	Запрос.УстановитьПараметр("ВсеТовары",       Товары.Количество() = 0);
	Запрос.УстановитьПараметр("Регистратор",     Регистратор);
	Запрос.УстановитьПараметр("ОстатокНаСкладе", Истина);
	Запрос.УстановитьПараметр("Назначения",      Назначения);
	Запрос.УстановитьПараметр("ЕстьОтборНазначений", Назначения.Количество() > 0);
	Запрос.УстановитьПараметр("СвернутьНазначения", Ложь);
	Запрос.УстановитьПараметр("ПустойКлючСвязи", Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"));
	
	Запрос.Текст =
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	Склады.Ссылка КАК Склад
		|ПОМЕСТИТЬ РазрешенныеСклады
		|ИЗ
		|	Справочник.Склады КАК Склады
		|ИНДЕКСИРОВАТЬ ПО
		|	Склад";
	Запрос.Выполнить();
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос.Текст =
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	Таблица.Номенклатура КАК Номенклатура,
		|	Таблица.Характеристика КАК Характеристика,
		|	&ПолеНазначениеОтборТоваров КАК Назначение
		|ПОМЕСТИТЬ ОтборТоваров
		|ИЗ
		|	&Товары КАК Таблица
		|ИНДЕКСИРОВАТЬ ПО
		|	Номенклатура, Характеристика";
	НазначенияЕстьВТоварах = Товары.Колонки.Найти("Назначение") <> Неопределено;
	ПолеНазначениеОтборТоваров = "ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)";
	Если НазначенияЕстьВТоварах Тогда
		ПолеНазначениеОтборТоваров = "Таблица.Назначение";
	КонецЕсли;
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ПолеНазначениеОтборТоваров", ПолеНазначениеОтборТоваров);
	Запрос.Выполнить();
	
	Запрос.Текст =
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	Таблица.Назначение КАК Назначение
		|ПОМЕСТИТЬ НазначенияИзОстатков
		|ИЗ
		|	РегистрНакопления.ЗапасыИПотребности.Остатки(,
		|		Назначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
		|			И (НЕ &ЕстьОтборНазначений ИЛИ Назначение В(&Назначения))) КАК Таблица
		|ИНДЕКСИРОВАТЬ ПО
		|	Назначение
		|;
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	Таблица.Назначение КАК Назначение
		|ПОМЕСТИТЬ ОтборНазначений
		|ИЗ
		|	НазначенияИзОстатков КАК Таблица
		|ГДЕ
		|	(&ВсеОрганизации ИЛИ Таблица.Назначение.Заказ.Организация = &Организация)
		|		И НЕ Таблица.Назначение.ТипНазначения В(
		//++ Устарело_Переработка24
		|			ЗНАЧЕНИЕ(Перечисление.ТипыНазначений.Давальческое21),
		//-- Устарело_Переработка24
		|			ЗНАЧЕНИЕ(Перечисление.ТипыНазначений.ПоставкаПодПринципала))
		|ИНДЕКСИРОВАТЬ ПО
		|	Назначение
		|;
		|УНИЧТОЖИТЬ НазначенияИзОстатков";
	Запрос.Выполнить();
	
	Запрос.Текст = ТекстЗапросаИсточникДанных(НазначенияЕстьВТоварах);
	Запрос.Выполнить();
	
	Запрос.Текст =
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	Таблица.Номенклатура   КАК Номенклатура,
		|	Таблица.Характеристика КАК Характеристика
		|ПОМЕСТИТЬ ОтборТоваровИсточникаДанных
		|ИЗ
		|	ИсточникДанных КАК Таблица
		|ИНДЕКСИРОВАТЬ ПО
		|	Номенклатура, Характеристика";
	Запрос.Выполнить();
	
	Запрос.Текст = ТекстЗапросаСвободныеОстатки();
	Запрос.Выполнить();
	
	ДобавитьВременнуюТаблицуСортировкаСкладов(Запрос, "ИсточникДанных", "ИсточникДанных");
	
	Запрос.Текст =
		"ВЫБРАТЬ
		|	ЗНАЧЕНИЕ(Перечисление.ВидыОперацийКорректировкиНазначения.СнятьРезерв) КАК ВидОперации,
		|	Таблица.Назначение                                                     КАК НазначениеДляИтогов,
		|	Таблица.Номенклатура                                                   КАК Номенклатура,
		|	Таблица.Номенклатура.ЕдиницаИзмерения                                  КАК ЕдиницаИзмерения,
		|	Таблица.Характеристика                                                 КАК Характеристика,
		|	Таблица.Склад                                                          КАК Склад,
		|	Таблица.Назначение                                                     КАК ИсходноеНазначение,
		|	Таблица.Назначение.Заказ                                               КАК ИсходныйЗаказ,
		|	ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)                           КАК НовоеНазначение,
		|	НЕОПРЕДЕЛЕНО                                                           КАК НовыйЗаказ,
		|	ЕСТЬNULL(СвободныеОстатки.Свободно, 0)                                 КАК Свободно,
		|	Таблица.Потребность                                                    КАК Потребность,
		|	Таблица.Запас                                                          КАК Запас,
		|	Таблица.Резерв                                                         КАК Резерв,
		|	ЕСТЬNULL(ТаблицаСортировкиСкладов.ПриоритетСклада, 0)                  КАК СортировкаСклада,
		|	НЕ ТаблицаСкладовОтгрузки.Склад ЕСТЬ NULL                              КАК ЭтоСкладОтгрузки
		|ИЗ
		|	ИсточникДанных КАК Таблица
		|		
		|		ЛЕВОЕ СОЕДИНЕНИЕ СвободныеОстатки КАК СвободныеОстатки
		|		ПО СвободныеОстатки.Склад          = Таблица.Склад
		|		 И СвободныеОстатки.Номенклатура   = Таблица.Номенклатура
		|		 И СвободныеОстатки.Характеристика = Таблица.Характеристика
		|		 И СвободныеОстатки.Свободно > 0
		|		
		|		ЛЕВОЕ СОЕДИНЕНИЕ СортировкаСкладов КАК ТаблицаСортировкиСкладов
		|		ПО ТаблицаСортировкиСкладов.Склад          = Таблица.Склад
		|		 И ТаблицаСортировкиСкладов.Назначение     = Таблица.Назначение
		|		 И ТаблицаСортировкиСкладов.Номенклатура   = Таблица.Номенклатура
		|		 И ТаблицаСортировкиСкладов.Характеристика = Таблица.Характеристика
		|		
		|		ЛЕВОЕ СОЕДИНЕНИЕ СкладыОтгрузки КАК ТаблицаСкладовОтгрузки
		|		ПО ТаблицаСкладовОтгрузки.Склад          = Таблица.Склад
		|		 И ТаблицаСкладовОтгрузки.Номенклатура   = Таблица.Номенклатура
		|		 И ТаблицаСкладовОтгрузки.Характеристика = Таблица.Характеристика
		|		 И ТаблицаСкладовОтгрузки.Назначение     = Таблица.Назначение
		|		
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РазрешенныеСклады КАК РазрешенныеСклады
		|		ПО РазрешенныеСклады.Склад = Таблица.Склад
		|ГДЕ
		|	Таблица.Запас > 0
		|УПОРЯДОЧИТЬ ПО
		|	ИсходноеНазначение,
		|	Номенклатура,
		|	Характеристика,
		|	ЭтоСкладОтгрузки,
		|	СортировкаСклада,
		|	Запас УБЫВ";
	
	ТаблицаТоваров = Запрос.Выполнить().Выгрузить();
	
	
	Тексты = Новый Массив();
	Текст =
		"ВЫБРАТЬ
		|	Таблица.Назначение                        КАК НазначениеДляИтогов,
		|	Таблица.Номенклатура                      КАК Номенклатура,
		|	Таблица.Характеристика                    КАК Характеристика,
		|	Таблица.Склад                             КАК Склад,
		|	Таблица.Запас                             КАК ВНаличии,
		|	Таблица.Потребность - Таблица.КЗаказу     КАК Обеспечено,
		|	Таблица.Потребность                       КАК Потребность,
		|	НЕ ТаблицаСкладовОтгрузки.Склад ЕСТЬ NULL КАК ЭтоСкладОтгрузки
		|ПОМЕСТИТЬ ТаблицаИтогов
		|ИЗ
		|	ИсточникДанных КАК Таблица
		|		
		|		ЛЕВОЕ СОЕДИНЕНИЕ СкладыОтгрузки КАК ТаблицаСкладовОтгрузки
		|		ПО ТаблицаСкладовОтгрузки.Склад          = Таблица.Склад
		|		 И ТаблицаСкладовОтгрузки.Номенклатура   = Таблица.Номенклатура
		|		 И ТаблицаСкладовОтгрузки.Характеристика = Таблица.Характеристика
		|		 И ТаблицаСкладовОтгрузки.Назначение     = Таблица.Назначение
		|ИНДЕКСИРОВАТЬ ПО
		|	Номенклатура, Характеристика, Склад";
	Тексты.Добавить(Текст);
	
	Текст = ВременнаяТаблицаЗаказыНаПеремещение(Истина);
	Тексты.Добавить(Текст);
	
	Текст =
		"ВЫБРАТЬ
		|	ТаблицаИтогов.НазначениеДляИтогов КАК НазначениеДляИтогов,
		|	ТаблицаИтогов.Номенклатура КАК Номенклатура,
		|	ТаблицаИтогов.Характеристика КАК Характеристика,
		|	СУММА(ТаблицаИтогов.ВНаличии) КАК ВНаличии,
		|	СУММА(ТаблицаИтогов.Обеспечено) - МАКСИМУМ(ЕСТЬNULL(ЗаказыНаПеремещение.Количество, 0)) КАК Обеспечено,
		|	СУММА(ТаблицаИтогов.Потребность) - МАКСИМУМ(ЕСТЬNULL(ЗаказыНаПеремещение.Количество, 0)) КАК Потребность
		|ИЗ
		|	ТаблицаИтогов КАК ТаблицаИтогов
		|		
		|		ЛЕВОЕ СОЕДИНЕНИЕ ЗаказыНаПеремещение КАК ЗаказыНаПеремещение
		|		ПО ЗаказыНаПеремещение.Номенклатура = ТаблицаИтогов.Номенклатура
		|		 И ЗаказыНаПеремещение.Характеристика = ТаблицаИтогов.Характеристика
		|		 И ЗаказыНаПеремещение.Назначение = ТаблицаИтогов.НазначениеДляИтогов
		|СГРУППИРОВАТЬ ПО
		|	ТаблицаИтогов.Номенклатура,
		|	ТаблицаИтогов.Характеристика,
		|	ТаблицаИтогов.НазначениеДляИтогов";
		
	Тексты.Добавить(Текст);
	
	Запрос.Текст = СтрСоединить(Тексты, ОбщегоНазначения.РазделительПакетаЗапросов());
	СтруктураВозврата = Новый Структура();
	СтруктураВозврата.Вставить("ТаблицаТоваров", ТаблицаТоваров);
	СтруктураВозврата.Вставить("ТаблицаИтоговСводно", Запрос.Выполнить().Выгрузить());
	СтруктураВозврата.Вставить("ТаблицаИтогов", Запрос.МенеджерВременныхТаблиц.Таблицы["ТаблицаИтогов"].ПолучитьДанные().Выгрузить());
	
	Возврат СтруктураВозврата;
	
КонецФункции

// Возвращает таблицу для заполнения корректировки назначения.
// Параметры:
//  Назначение - СправочникСсылка.Назначения -
//  Источники - Структура -
//  ТолькоСкладОтгрузки - 
//  Организация - СправочникСсылка.СтруктураПредприятия - 
//  Товары - ТаблицаЗначений
//  Регистратор - ДокументСсылка.КорректировкаНазначенияТоваров, Неопределено -
// Возвращаемое значение:
//  Структура -
//   *ТаблицаТоваров - ТаблицаЗначений -
//   *ТаблицаИтогов - ТаблицаЗначений -

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

// Возвращает таблицу для заполнения корректировки назначения.
// Параметры:
//  Назначения - Массив Из СправочникСсылка.Назначения -
//  ТолькоСкладОтгрузки - Булево -
//  Товары - ТаблицаЗначений
//  Регистратор - ДокументСсылка.КорректировкаНазначенияТоваров, Неопределено -
// Возвращаемое значение:
//  Структура -
//   *ТаблицаТоваров - ТаблицаЗначений -
//   *ТаблицаИтогов - ТаблицаЗначений -

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

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

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

#Область ОбслуживаниеОбработкиЗаполненияКорректировкиНазначения

Функция СоздатьЗаполнитьИПровестиДокумент(РеквизитыШапки, Таблица) Экспорт
	
	Результат = Новый Структура("Документ,Проведен,Ошибки");

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

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

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

КонецФункции

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

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

КонецФункции

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

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

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

#Область ОбсуживающиеФормуДокумента

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

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

#Область Прочее

Функция ДопустимыНазначенияБезЗаказа() Экспорт
	
	ДопустимыНазначенияБезЗаказа = ПолучитьФункциональнуюОпцию("ИспользоватьУчетЗатратПоНаправлениямДеятельности");
	
	//++ НЕ УТ
	ДопустимыНазначенияБезЗаказа = ДопустимыНазначенияБезЗаказа
		//++ Устарело_Переработка24
		Или ПолучитьФункциональнуюОпцию("ИспользоватьПроизводствоНаСтороне")
		//-- Устарело_Переработка24
		Или ПолучитьФункциональнуюОпцию("ИспользоватьПроизводствоНаСтороне2_5");
	//-- НЕ УТ
	
	Возврат ДопустимыНазначенияБезЗаказа;
	
КонецФункции

Функция СоздатьКорректировкуНазначенияТоваровНаОснованииЗаказаКлиентаПроверкаТипаНазначения(ОбъектОснование) Экспорт
	
	РезультатПроверки = Новый Структура("ТекстОшибки", Неопределено);
	
	Если ТипЗнч(ОбъектОснование) = Тип("ДокументСсылка.ЗаказКлиента") Тогда
		
		Назначение = Документы.КорректировкаНазначенияТоваров.НазначениеЗаказа(ОбъектОснование);
		
		Если ЗначениеЗаполнено(Назначение) Тогда
			
			НазначениеТипНазначения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Назначение, "ТипНазначения");
			
			Если НазначениеТипНазначения = Перечисления.ТипыНазначений.ПоставкаПодПринципала Тогда
			
				РезультатПроверки.ТекстОшибки = НСтр("ru = 'Для данного типа назначения корректировка недоступна. Необходимо переделать исходные документы.'");
			
			КонецЕсли;
			
		КонецЕсли;
				
	КонецЕсли;
	
	Возврат РезультатПроверки;

КонецФункции

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

#Область СтандартныеПодсистемы
// СтандартныеПодсистемы.ВерсионированиеОбъектов

// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
// Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт

КонецПроцедуры

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

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

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

#Область Проведение

Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт
	
	ИсточникиДанных = Новый Соответствие;
	
	Возврат ИсточникиДанных;
	
КонецФункции

Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка)
	
	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ДанныеДокумента.Дата КАК Период,
	|	ДанныеДокумента.Номер КАК Номер,
	|	ДанныеДокумента.ПометкаУдаления КАК ПометкаУдаления,
	|	ДанныеДокумента.Проведен КАК Проведен,
	|	ДанныеДокумента.Организация КАК Организация,
	|	ДанныеДокумента.Комментарий КАК Комментарий,
	|	ДанныеДокумента.Ссылка КАК Ссылка
	|ИЗ
	|	Документ.КорректировкаНазначенияТоваров КАК ДанныеДокумента
	|ГДЕ
	|	ДанныеДокумента.Ссылка = &Ссылка
	|";
	
	Реквизиты = Запрос.Выполнить().Выбрать();
	Реквизиты.Следующий();
	
	Запрос.УстановитьПараметр("Ссылка", 			   Реквизиты.Ссылка); // Предназначен для использования в процедуре ИнициализироватьВидыЗапасов
	Запрос.УстановитьПараметр("Период", 			   Реквизиты.Период);
	Запрос.УстановитьПараметр("ПометкаУдаления", 	   Реквизиты.ПометкаУдаления);
	Запрос.УстановитьПараметр("Номер", 				   Реквизиты.Номер);
	Запрос.УстановитьПараметр("Проведен", 			   Реквизиты.Проведен);
	Запрос.УстановитьПараметр("Комментарий", 		   Реквизиты.Комментарий);
	Запрос.УстановитьПараметр("Организация", 		   Реквизиты.Организация);
	Запрос.УстановитьПараметр("ХозяйственнаяОперация", Перечисления.ХозяйственныеОперации.КорректировкаОбособленногоУчета);
	Запрос.УстановитьПараметр("ИдентификаторМетаданных", ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(ДокументСсылка)));
	Запрос.УстановитьПараметр("НомерНаПечать",         ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Реквизиты.Номер));
	Запрос.УстановитьПараметр("НастройкаХозяйственнойОперации", Справочники.НастройкиХозяйственныхОпераций.КорректировкаОбособленногоУчета);
	
	РасчетСебестоимостиПрикладныеАлгоритмы.ЗаполнитьПараметрыИнициализации(Запрос, Реквизиты);
	
КонецПроцедуры

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

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

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

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

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

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

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

Функция ТекстЗапросаТаблицаРеестрДокументов(Запрос, ТекстыЗапроса, Регистры)
	
	ИмяРегистра = "РеестрДокументов";
	
	Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
		Возврат "";
	КонецЕсли;
	
	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	&Ссылка                                 КАК Ссылка,
	|	&Период                                 КАК ДатаДокументаИБ,
	|	&Номер                                  КАК НомерДокументаИБ,
	|	&ИдентификаторМетаданных                КАК ТипСсылки,
	|	&Организация                            КАК Организация,
	|	НЕОПРЕДЕЛЕНО                            КАК ХозяйственнаяОперация,
	|	НЕОПРЕДЕЛЕНО                            КАК Партнер,
	|	НЕОПРЕДЕЛЕНО                            КАК Контрагент,
	|	НЕОПРЕДЕЛЕНО                            КАК Договор,
	|	НЕОПРЕДЕЛЕНО                            КАК НаправлениеДеятельности,
	|	НЕОПРЕДЕЛЕНО                            КАК МестоХранения,
	|	НЕОПРЕДЕЛЕНО                            КАК Подразделение,
	|	НЕОПРЕДЕЛЕНО                            КАК Ответственный,
	|	&Комментарий                            КАК Комментарий,
	|	НЕОПРЕДЕЛЕНО                            КАК Валюта,
	|	НЕОПРЕДЕЛЕНО                            КАК Сумма,
	|	НЕОПРЕДЕЛЕНО                            КАК Статус,
	|	&Проведен                               КАК Проведен,
	|	&ПометкаУдаления                        КАК ПометкаУдаления,
	|	ЛОЖЬ                                    КАК ДополнительнаяЗапись,
	|	НЕОПРЕДЕЛЕНО                            КАК Дополнительно,
	|	&Период                                 КАК ДатаПервичногоДокумента,
	|	&НомерНаПечать                          КАК НомерПервичногоДокумента,
	|	&Период                                 КАК ДатаОтраженияВУчете";
	
	ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
	
	Возврат ТекстЗапроса;
	
КонецФункции

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

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

#Область ПартионныйУчет

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

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

Функция СформироватьДополнительныеТаблицыОперацийУчетаЗатратИСебестоимости(Документ, Запрос = Неопределено, ТекстыЗапроса = Неопределено) Экспорт
	
	ДополнительныеТаблицы = Новый Массив;
	ДополнительныеТаблицы.Добавить("ВтВидыЗапасов");
	
	Если Запрос <> Неопределено Тогда
	
		Если НЕ ПроведениеДокументов.ЕстьТаблицаЗапроса(ДополнительныеТаблицы[0], ТекстыЗапроса) Тогда
			ТекстЗапросаВтВидыЗапасов(Запрос, ТекстыЗапроса);
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат ДополнительныеТаблицы;
	
КонецФункции

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

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

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

#Область ЗаполнениеТабличнойЧасти

#Область ЗаполнениеПоОстаткам

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

КонецФункции

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

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

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

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

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

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


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

	ГруппировкиПоТоварам = ОбеспечениеСервер.РазбитьТаблицуПоЗначениюКлюча(ТаблицаИсходная, "Номенклатура, Характеристика", "");
	Для Каждого Группировка Из ГруппировкиПоТоварам Цикл
		
		Таблица = Группировка.Таблица;
		Таблица.Индексы.Добавить("СкладПолучатель");
		
		ОбработкаЗавершена = Ложь;
		Пока Не ОбработкаЗавершена Цикл
			
			ОбработкаЗавершена = Истина;
			Для Каждого СтрокаТаблицы Из Таблица Цикл
				
				НайденнаяСтрока = Таблица.Найти(СтрокаТаблицы.СкладОтправитель, "СкладПолучатель");
				Если НайденнаяСтрока <> Неопределено
						И СтрокаТаблицы.СкладПолучатель <> НайденнаяСтрока.СкладОтправитель Тогда // защита от зацикливания
					
					ОбработкаЗавершена = Ложь;
					СтрокаТаблицы.Уровень = СтрокаТаблицы.Уровень + НайденнаяСтрока.Уровень;
					СтрокаТаблицы.СкладОтправитель = НайденнаяСтрока.СкладОтправитель;
					
				КонецЕсли;
				
			КонецЦикла;
			
		КонецЦикла;
		
	КонецЦикла;
	
	ТаблицаИсходная.Очистить();
	Для Каждого Группировка Из ГруппировкиПоТоварам Цикл
		ОбщегоНазначенияУТ.ДобавитьСтрокиВТаблицу(ТаблицаИсходная, Группировка.Таблица);
	КонецЦикла;

	Запрос.УстановитьПараметр("ТаблицаИерархииСкладов", ТаблицаИсходная);
	Запрос.Текст =
		"ВЫБРАТЬ
		|	Таблица.Номенклатура КАК Номенклатура,
		|	Таблица.Характеристика КАК Характеристика,
		|	Таблица.СкладПолучатель КАК СкладПолучатель,
		|	Таблица.СкладОтправитель КАК СкладОтправитель,
		|	Таблица.Уровень КАК Уровень
		|ПОМЕСТИТЬ ИерархияСкладовВременный
		|ИЗ
		|	&ТаблицаИерархииСкладов КАК Таблица
		|;
		|
		|/////////////////////////////////////////
		|ВЫБРАТЬ
		|	Таблица.Номенклатура КАК Номенклатура,
		|	Таблица.Характеристика КАК Характеристика,
		|	Таблица.СкладПолучатель КАК Склад,
		|	Таблица.СкладОтправитель КАК КорневойИсточник,
		|	Таблица.Уровень + 1 КАК Уровень
		|ПОМЕСТИТЬ ИерархияСкладов
		|ИЗ
		|	ИерархияСкладовВременный КАК Таблица
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	Таблица.Номенклатура КАК Номенклатура,
		|	Таблица.Характеристика КАК Характеристика,
		|	Таблица.СкладОтправитель КАК Склад,
		|	Таблица.СкладОтправитель КАК КорневойИсточник,
		|	1 КАК Уровень
		|ИЗ
		|	ИерархияСкладовВременный КАК Таблица
		|ИНДЕКСИРОВАТЬ ПО
		|	Номенклатура, Характеристика, Склад";
	
	Запрос.Выполнить();

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

КонецПроцедуры

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

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

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


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

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

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

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

//++ Локализация

//++ НЕ УТ
#Область Печать

Функция ПечатнаяФормаКорректировкаНазначенияТоваров(МассивОбъектов, ОбъектыПечати, ПараметрыПечати)
	
	УстановитьПривилегированныйРежим(Истина);
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.АвтоМасштаб = Истина;
	ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
	
	ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_КОРРЕКТИРОВКА_НАЗНАЧЕНИЯ";
	
	ДанныеДляПечати = ДанныеДляПечати(МассивОбъектов, ПараметрыПечати);
	
	ЗаполнитьТабличныйДокументКорректировкаНазначенияТоваров(ТабличныйДокумент, ДанныеДляПечати, ОбъектыПечати);
					
	Возврат ТабличныйДокумент;
	
КонецФункции

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

				Если ВыводитьНДИГК И НДИГКСовпадают Тогда
					ШапкаТаблицы.Параметры.Заполнить(ВыборкаПоНДИГКПолучателя);
					ТабличныйДокумент.Вывести(ШапкаТаблицы);
				КонецЕсли;

				Если ПервыйЗаголовокТаблицы Тогда
					ТабличныйДокумент.Вывести(ЗаголовокТаблицы);
				КонецЕсли;

				ПервыйЗаголовокТаблицы = Ложь;

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

Процедура ЗаполнитьРеквизитыШапки(ДанныеПечати, Макет, ТабличныйДокумент)
	
	// Выводим общие реквизиты шапки
	СведенияОбОрганизации = ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Организация, ДанныеПечати.Дата);
	
	ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
	
	ШтрихкодированиеПечатныхФорм.ВывестиШтрихкодВТабличныйДокумент(
		ТабличныйДокумент,
		Макет,
		ОбластьМакета,
		ДанныеПечати.Ссылка);
	
	ОбластьМакета.Параметры.Заполнить(ДанныеПечати);
	УстановитьПараметр(ОбластьМакета, "ПредставлениеОрганизации", ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОбОрганизации));
	УстановитьПараметр(ОбластьМакета, "ДатаДокумента",            ДанныеПечати.ДатаДокумента);
	УстановитьПараметр(ОбластьМакета, "НомерДокумента",           ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ДанныеПечати.Номер));
	
	ТабличныйДокумент.Вывести(ОбластьМакета);
	
КонецПроцедуры

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

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

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

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

	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстПоляНДИГКПолучателя",
		ВнутреннееТовародвижение.ТекстПоляНДИГК(
			"НДПолучатель"));
	
	Запрос.Текст = ТекстЗапроса;
	
	Запрос.УстановитьПараметр("МассивДокументов", МассивОбъектов);
	
	МассивРезультатов = Запрос.ВыполнитьПакет();
	РезультатПоШапке = МассивРезультатов[0];
	РезультатПоТабличнойЧасти = МассивРезультатов[1];
	
	СтруктураДанныхДляПечати = Новый Структура(
		"РезультатПоШапке, РезультатПоТабличнойЧасти",
		РезультатПоШапке,
		РезультатПоТабличнойЧасти);
	
	Возврат СтруктураДанныхДляПечати;

	
КонецФункции

#КонецОбласти
//-- НЕ УТ

//-- Локализация

#Область ОбновлениеИнформационнойБазы

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

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

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

#КонецЕсли

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