Корректировка по ордеру на товары / Модуль менеджера

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

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

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

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

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

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

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

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

		Возврат КомандаСоздатьНаОсновании;
	КонецЕсли;

	Возврат Неопределено;
КонецФункции

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

// Заполняет список команд печати.
//
// Параметры:
//   КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	ИсточникиДанных = Новый Соответствие;

	Возврат ИсточникиДанных; 

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

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

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

	Возврат ТекстЗапроса;
	
КонецФункции

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

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

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

	Возврат ТекстЗапроса;
	
КонецФункции

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

	Возврат ТекстЗапроса;
	
КонецФункции

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

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

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

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

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

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

#КонецЕсли

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