Загрузка данных


////////////////////////////////////////////////////////////////////////////////
// Модуль "Распределение запасов", содержит процедуры и функции
// чтения и записи в регистр сведений "Распределение запасов".
//
////////////////////////////////////////////////////////////////////////////////

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

Процедура АктуализацияПотребностейПоГраницеОбеспеченияРегламентноеЗадание() Экспорт
	
	ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(
		Метаданные.РегламентныеЗадания.АктуализацияПотребностейПоГраницеОбеспечения);
		
	АктуализацияПотребностейПоГраницеОбеспеченияФоновоеЗадание(Неопределено, Неопределено);
	
КонецПроцедуры

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

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

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

Процедура ЗаписатьРаспределениеЗапасовВТранзакцииПроведения(Запрос) Экспорт
	
	Результат = РаспределениеЗапасовПоТоварам(Запрос, "ТоварыДляРаспределенияЗапасов", Истина,
		"РаспределениеЗапасов,ДоступныеОстаткиТоваров");
	ЗаписатьРезультатРаспределенияЗапасов(Результат);
	
КонецПроцедуры

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

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

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


Процедура ОбновитьИнформациюОДоступностиТоваровДляВнешнихПользователей() Экспорт

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

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

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

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

// Параметры:
//  Запрос - Запрос - запрос, хранящий параметры используемые в списке запросов
//  ТекстыЗапроса - СписокЗначений Из Строка - список текстов запросов и их имен.
//  Документ - ДокументОбъект - записываемый документ.
Процедура ДобавитьТекстЗапросаКонтроль(Запрос, ТекстыЗапроса, Документ) Экспорт
	
	ЕстьКонтрольКачества = ПолучитьФункциональнуюОпцию("ИспользоватьКонтрольКачестваТоваров");
	ЕстьСводныйКонтрольПартий = ЕстьКонтрольКачества И ТипЗнч(Документ) = Тип("ДокументОбъект.КорректировкаНазначенияТоваров");
	
	#Область ВременнаяТаблица_ИзмененияДляКонтроляОбеспечения
	
	// Вычисление изменений по пустой партии.
	
	// 1) Обычный документ расхода:
	
	// ВНаличииРасход (всего) = 5
	// ЗаблокированоВНаличииРасход = 0
	// ВНаличии (всего) = -5
	// ЗаблокированоВНаличии = 0
	
	// 2) Документ расхода по партии:
	
	// ВНаличииРасход (всего) = 5
	// ЗаблокированоВНаличииРасход = 5
	// ВНаличии (всего) = -5
	// ЗаблокированоВНаличии = -5
	
	// 3) Обычный документ прихода:
	
	// ВНаличииРасход (всего) = 0
	// ЗаблокированоВНаличииРасход = 0
	// ВНаличии (всего) = 5
	// ЗаблокированоВНаличии = 0
	
	// 4) Документ прихода по партии:
	
	// ВНаличииРасход (всего) = 0
	// ЗаблокированоВНаличииРасход = 0
	// ВНаличии (всего) = 5
	// ЗаблокированоВНаличии = 5
	
	// Уместна формула: ВНаличииРасход (по пустой партии) = ВНаличииРасход (всего) - ЗаблокированоВНаличииРасход
	// Уместна формула: ВНаличии (по пустой партии) = ВНаличии (всего) - ЗаблокированоВНаличии
	// Согласно этим формулам, в примерах (2) и (4) изменений по аналитикам с пустой партией нет совсем.
	// В примере (1) есть расход по аналитике с пустой партией и есть уменьшение остатка при проведении документа.
	// В примере (4) нет расхода по аналитике с пустой партией и есть увеличение остатка при проведении документа.
	
	// Примеры 5-8, аналогично, отмена проведения (либо уменьшение документа).
	// Значения изменений ресурсов не меняются. Знаки изменений ресурсов меняются на противоположные. Формулы также уместны.
	
	// 9) Документ корректировки с партии на партию:
	
	// ВНаличииРасход (всего) = 0
	// ЗаблокированоВНаличииРасход = 5
	// ВНаличии (всего) = 0
	// ЗаблокированоВНаличии = 0
	
	// 10) Документ корректировки с партии на пустую партию (разблокировка партии, например Акт контроля качества с действием Разблокировать):
	
	// ВНаличииРасход (всего) = 0
	// ЗаблокированоВНаличииРасход = 5
	// ВНаличии (всего) = 0
	// ЗаблокированоВНаличии = -5
	
	// 11) Документ корректировки с пустой партии на не пустую партию (блокировка из складского запаса, например заявка на контроль):
	
	// ВНаличииРасход (всего) = 0
	// ЗаблокированоВНаличииРасход = 5
	// ВНаличии (всего) = 0
	// ЗаблокированоВНаличии = -5
	
	// Неуместна формула: ВНаличииРасход (по пустой партии) = ВНаличииРасход (всего) - ЗаблокированоВНаличииРасход
	// Неуместна формула: ВНаличии (по пустой партии) = ВНаличии (всего) - ЗаблокированоВНаличии
	
	// Примеры 12-14, аналогично, отмена проведения документа корректировки партии (либо уменьшение документа).
	// Значения изменений ресурсов не меняются. Знаки изменений ресурсов меняются на противоположные. Формулы также уместны.
	
	// 15) Документ корректировки с партии на пустую (разблокировка партии) с одновременным расходом из пустой партии по методике не поддерживается.
	// Воспринимается системой как расход по непустой партии и не подлежит контролю по пустой партии (воспринимается как пример (2).
	// 16) Аналогично отмена проведения (либо уменьшение документа).
	
	// 17) Смешанный документ корректировки с партии на пустую партию (2 шт.) и расхода партии (3 шт.):
	
	// ВНаличииРасход (всего) = 3
	// ЗаблокированоВНаличииРасход = 5
	// ВНаличии (всего) = -3
	// ЗаблокированоВНаличии = -5
	
	// 18) Смешанный документ корректировки с партии на партию (2шт.) и расхода партии (3 шт.):
	
	// ВНаличииРасход (всего) = 3
	// ЗаблокированоВНаличииРасход = 5
	// ВНаличии (всего) = -3
	// ЗаблокированоВНаличии = -3
	
	// 19) Смешанный документ корректировки с пустой партии на партию (10шт.) и расхода партии (3 шт.):
	
	// ВНаличииРасход (всего) = 3
	// ЗаблокированоВНаличииРасход = 3
	// ВНаличии (всего) = -3
	// ЗаблокированоВНаличии = 7
	
	// Неуместна формула: ВНаличииРасход (по пустой партии) = ВНаличииРасход (всего) - ЗаблокированоВНаличииРасход
	// Неуместна формула: ВНаличии (по пустой партии) = ВНаличии (всего) - ЗаблокированоВНаличии
	
	// Выработка уместной формулы:
	// Если есть ЗаблокированоВНаличииРасход > 0 - это может быть отгрузка товара партии, а может быть разблокировка товара партии или корректировка на другую партию.
	// Нужно найти изменение ВНаличииРасход > 0.
	// Если ЗаблокированоВНаличииРасход > ВНаличииРасход, то часть отгрузка партии, а остальное - разблокировка или корректировка на другую партию.
	// Таким образом, для пустой партии ВНаличииРасход (>0) нужно уменьшить на Мин(ЗаблокированоВНаличииРасход (>0), ВНаличииРасход (>0))
	// Аналогично для отмены расхода для пустой партии ВНаличииРасход (<0) нужно уменьшить на Макс(ЗаблокированоВНаличииРасход (<0), ВНаличииРасход (<0))
	
	ТекстНабора =
		"ВЫБРАТЬ
		|	Таблица.Номенклатура КАК Номенклатура,
		|	Таблица.Характеристика КАК Характеристика,
		|	Таблица.Склад КАК Склад,
		|	Таблица.Назначение КАК Назначение,
		|	ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
		|	Таблица.ВНаличииМинусЗаблокировано КАК ВНаличии,
		|	Таблица.ПоступитМинусЗаблокировано КАК Поступит,
		|	Таблица.РезервироватьНаСкладе КАК РезервироватьНаСкладе,
		|	Таблица.РезервироватьПоМереПоступления КАК РезервироватьПоМереПоступления,
		|	Таблица.ВНаличииРасходМинусЗаблокировано КАК ВНаличииРасход,
		|	0 КАК ВНаличииПоПартиямСводно,
		|	0 КАК ВНаличииРасходПоПартиямСводно
		|ИЗ
		|	ЗапасыИПотребностиИзменение КАК Таблица";
		
	Если ЕстьКонтрольКачества Тогда
		
		Тексты = Новый Массив();
		Тексты.Добавить(ТекстНабора);
		Текст =
			"ВЫБРАТЬ
			|	Таблица.Номенклатура КАК Номенклатура,
			|	Таблица.Характеристика КАК Характеристика,
			|	Таблица.Склад КАК Склад,
			|	Таблица.Назначение КАК Назначение,
			|	Таблица.Заказ КАК КонтролируемаяПартия,
			|	Таблица.ЗаблокированоВНаличии КАК ВНаличии,
			|	Таблица.ЗаблокированоПоступит КАК Поступит,
			|	Таблица.РезервироватьНаСкладеИзЗаблокированных КАК РезервироватьНаСкладе,
			|	Таблица.РезервироватьПоМереПоступленияИзЗаблокированных КАК РезервироватьПоМереПоступления,
			|	Таблица.ЗаблокированоВНаличииРасход КАК ВНаличииРасход,
			|	0 КАК ВНаличииПоПартиямСводно,
			|	0 КАК ВНаличииРасходПоПартиямСводно
			|ИЗ
			|	ЗапасыИПотребностиИзменение КАК Таблица
			|ГДЕ
			|	Таблица.Заказ <> НЕОПРЕДЕЛЕНО";
		Тексты.Добавить(Текст);
		
		Если ЕстьСводныйКонтрольПартий Тогда
			
			Текст =
				"ВЫБРАТЬ
				|	Таблица.Номенклатура КАК Номенклатура,
				|	Таблица.Характеристика КАК Характеристика,
				|	Таблица.Склад КАК Склад,
				|	Таблица.Назначение КАК Назначение,
				|	ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
				|	0 КАК ВНаличии,
				|	0 КАК Поступит,
				|	0 КАК РезервироватьНаСкладе,
				|	0 КАК РезервироватьПоМереПоступления,
				|	0 КАК ВНаличииРасход,
				|	Таблица.ЗаблокированоВНаличии КАК ВНаличииПоПартиямСводно,
				|	Таблица.ЗаблокированоВНаличииРасход КАК ВНаличииРасходПоПартиямСводно
				|ИЗ
				|	ЗапасыИПотребностиИзменение КАК Таблица
				|ГДЕ
				|	Таблица.Заказ <> НЕОПРЕДЕЛЕНО";
			
			Тексты.Добавить(Текст);
			
		КонецЕсли;
		
		ТекстНабора = СтрСоединить(Тексты, ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());
		
	КонецЕсли;
	
	ТекстЗапроса =
		"ВЫБРАТЬ
		|	Таблица.Номенклатура КАК Номенклатура,
		|	Таблица.Характеристика КАК Характеристика,
		|	Таблица.Склад КАК Склад,
		|	Таблица.Назначение КАК Назначение,
		|	Таблица.КонтролируемаяПартия КАК КонтролируемаяПартия,
		|	СУММА(Таблица.ВНаличииРасход) КАК ВНаличииРасход,
		|	СУММА(Таблица.РезервироватьНаСкладе) КАК РезервироватьНаСкладе,
		|	СУММА(Таблица.РезервироватьПоМереПоступления) КАК РезервироватьПоМереПоступления,
		|	СУММА(Таблица.ВНаличии) КАК ВНаличии,
		|	СУММА(Таблица.Поступит) КАК Поступит,
		|	СУММА(Таблица.ВНаличииПоПартиямСводно) КАК ВНаличииПоПартиямСводно,
		|	СУММА(Таблица.ВНаличииРасходПоПартиямСводно) КАК ВНаличииРасходПоПартиямСводно
		|ПОМЕСТИТЬ ЗапасыИПотребностиИзменениеСгруппированные
		|ИЗ
		|	НаборПереопределяемый КАК Таблица
		|СГРУППИРОВАТЬ ПО
		|	Таблица.Номенклатура,
		|	Таблица.Характеристика,
		|	Таблица.Склад,
		|	Таблица.Назначение,
		|	Таблица.КонтролируемаяПартия
		|ИМЕЮЩИЕ
		|	СУММА(Таблица.ВНаличииРасход) <> 0
		|	ИЛИ СУММА(Таблица.РезервироватьНаСкладе) <> 0
		|	ИЛИ СУММА(Таблица.РезервироватьПоМереПоступления) <> 0
		|	ИЛИ СУММА(Таблица.ВНаличииРасходПоПартиямСводно) <> 0
		|ИНДЕКСИРОВАТЬ ПО
		|	Номенклатура, Характеристика, Склад";
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "НаборПереопределяемый", СтрШаблон("(%1)", ТекстНабора));
	ТекстыЗапроса.Добавить(ТекстЗапроса, "ЗапасыИПотребностиИзменениеСгруппированные");
	
	ТекстЗапроса =
		"ВЫБРАТЬ
		|	Таблица.Номенклатура КАК Номенклатура,
		|	Таблица.Характеристика КАК Характеристика,
		|	Таблица.Склад КАК Склад,
		|	Таблица.Назначение КАК Назначение,
		|	Таблица.КонтролируемаяПартия КАК КонтролируемаяПартия,
		|	Таблица.ВНаличииРасход КАК ВНаличииРасход,
		|	Таблица.РезервироватьНаСкладе КАК РезервироватьНаСкладе,
		|	Таблица.РезервироватьПоМереПоступления КАК РезервироватьПоМереПоступления,
		|	Таблица.ВНаличии КАК ВНаличии,
		|	Таблица.Поступит КАК Поступит,
		|	Таблица.ВНаличииПоПартиямСводно КАК ВНаличииПоПартиямСводно,
		|	Таблица.ВНаличииРасходПоПартиямСводно КАК ВНаличииРасходПоПартиямСводно
		|ПОМЕСТИТЬ ИзмененияДляКонтроляОбеспечения
		|ИЗ
		|	ЗапасыИПотребностиИзменениеСгруппированные КАК Таблица
		|		
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаХарактеристика
		|		ПО НастройкаХарактеристика.Склад          = Таблица.Склад
		|		 И НастройкаХарактеристика.Номенклатура   = Таблица.Номенклатура
		|		 И НастройкаХарактеристика.Характеристика = Таблица.Характеристика
		|		
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаНоменклатура
		|		ПО НастройкаНоменклатура.Склад        = Таблица.Склад
		|		 И НастройкаНоменклатура.Номенклатура = Таблица.Номенклатура
		|		 И НастройкаНоменклатура.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
		|		
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаСклад
		|		ПО НастройкаСклад.Склад          = Таблица.Склад
		|		 И НастройкаСклад.Номенклатура   = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
		|		 И НастройкаСклад.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
		|ГДЕ
		|	ЕСТЬNULL(НастройкаХарактеристика.КонтролироватьСвободныеОстатки,
		|			ЕСТЬNULL(НастройкаНоменклатура.КонтролироватьСвободныеОстатки,
		|				НастройкаСклад.КонтролироватьСвободныеОстатки))
		|		И ВЫРАЗИТЬ(Таблица.Номенклатура КАК Справочник.Номенклатура).ТипНоменклатуры
		|			<> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа)
		|ИНДЕКСИРОВАТЬ ПО
		|	Номенклатура, Характеристика, Склад, Назначение, КонтролируемаяПартия";
	ТекстыЗапроса.Добавить(ТекстЗапроса, "ИзмененияДляКонтроляОбеспечения");
	
	#КонецОбласти
	
	#Область ВременнаяТаблица_РезервыПоЗаказамДляКонтроляОбеспечения
	
	ТекстНабора =
		"ВЫБРАТЬ
		|	Таблица.Номенклатура КАК Номенклатура,
		|	Таблица.Характеристика КАК Характеристика,
		|	Таблица.Склад КАК Склад,
		|	Таблица.Назначение КАК Назначение,
		|	ВЫБОР
		|		КОГДА Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных)
		|			ТОГДА Таблица.ЗаказНаОтгрузку
		|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка)
		|	КОНЕЦ КАК КонтролируемаяПартия,
		|	Таблица.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
		|	Таблица.Количество КАК ПолученныеРезервы
		|ИЗ
		|	РегистрСведений.РаспределениеЗапасов КАК Таблица
		|ГДЕ
		|	(Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступления)
		|			И Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
		|		ИЛИ Таблица.ХарактеристикаПотребности = ЗНАЧЕНИЕ(Перечисление.ХарактеристикиПотребности.РезервироватьПоМереПоступленияИзЗаблокированных)
		|			И Таблица.СостояниеЗапаса В(
		|				ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка),
		|				ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке)))
		|		И ИСТИНА В(
		|			ВЫБРАТЬ ПЕРВЫЕ 1
		|				ИСТИНА КАК ЕстьЗаписи
		|			ИЗ
		|				ЗапасыИПотребностиПередЗаписью КАК Заказы
		|			ГДЕ
		|				Заказы.Номенклатура = Таблица.Номенклатура
		|				 И Заказы.Характеристика = Таблица.Характеристика
		|				 И Заказы.Склад = Таблица.Склад
		|				 И Заказы.Назначение = Таблица.Назначение
		|				 И Заказы.Заказ = Таблица.ЗаказНаОтгрузку)
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ
		|	Таблица.Номенклатура КАК Номенклатура,
		|	Таблица.Характеристика КАК Характеристика,
		|	Таблица.Склад КАК Склад,
		|	Таблица.Назначение КАК Назначение,
		|	ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
		|	Таблица.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
		|	- Таблица.КСнятиюРезерва КАК ПолученныеРезервы
		|ИЗ
		|	РегистрСведений.ЗаданияКРаспределениюЗапасов КАК Таблица
		|ГДЕ
		|	Таблица.КСнятиюРезерва > 0
		|	И ИСТИНА В(
		|		ВЫБРАТЬ ПЕРВЫЕ 1
		|			ИСТИНА КАК ЕстьЗаписи
		|		ИЗ
		|			ЗапасыИПотребностиПередЗаписью КАК Заказы
		|		ГДЕ
		|			Заказы.Номенклатура = Таблица.Номенклатура
		|			 И Заказы.Характеристика = Таблица.Характеристика
		|			 И Заказы.Склад = Таблица.Склад
		|			 И Заказы.Назначение = Таблица.Назначение
		|			 И Заказы.Заказ = Таблица.ЗаказНаОтгрузку)
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ
		|	Таблица.Номенклатура КАК Номенклатура,
		|	Таблица.Характеристика КАК Характеристика,
		|	Таблица.Склад КАК Склад,
		|	Таблица.Назначение КАК Назначение,
		|	Таблица.ЗаказНаОтгрузку КАК КонтролируемаяПартия,
		|	Таблица.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
		|	- Таблица.КСнятиюРезерваИзЗаблокированных КАК ПолученныеРезервы
		|ИЗ
		|	РегистрСведений.ЗаданияКРаспределениюЗапасов КАК Таблица
		|ГДЕ
		|	Таблица.КСнятиюРезерваИзЗаблокированных > 0
		|	И ИСТИНА В(
		|		ВЫБРАТЬ ПЕРВЫЕ 1
		|			ИСТИНА КАК ЕстьЗаписи
		|		ИЗ
		|			ЗапасыИПотребностиПередЗаписью КАК Заказы
		|		ГДЕ
		|			Заказы.Номенклатура = Таблица.Номенклатура
		|			 И Заказы.Характеристика = Таблица.Характеристика
		|			 И Заказы.Склад = Таблица.Склад
		|			 И Заказы.Назначение = Таблица.Назначение
		|			 И Заказы.Заказ = Таблица.ЗаказНаОтгрузку)";
	
	// При отгрузке по заказам измерение Заказ пусто, но можно использовать резервы, которые были у отгружаемых заказов.
	// Эти заказы есть в движениях до записи.
	ТекстЗапроса =
		"ВЫБРАТЬ
		|	Набор.Номенклатура КАК Номенклатура,
		|	Набор.Характеристика КАК Характеристика,
		|	Набор.Склад КАК Склад,
		|	Набор.Назначение КАК Назначение,
		|	Набор.КонтролируемаяПартия КАК КонтролируемаяПартия,
		|	СУММА(Набор.ПолученныеРезервы) КАК ПолученныеРезервы
		|ПОМЕСТИТЬ РезервыПоЗаказамДляКонтроляОбеспечения
		|ИЗ(
		|	ВЫБРАТЬ
		|		НаборПоЗаказам.Номенклатура КАК Номенклатура,
		|		НаборПоЗаказам.Характеристика КАК Характеристика,
		|		НаборПоЗаказам.Склад КАК Склад,
		|		НаборПоЗаказам.Назначение КАК Назначение,
		|		НаборПоЗаказам.КонтролируемаяПартия КАК КонтролируемаяПартия,
		|		НаборПоЗаказам.ЗаказНаОтгрузку КАК ЗаказНаОтгрузку,
		|		СУММА(НаборПоЗаказам.ПолученныеРезервы) КАК ПолученныеРезервы
		|	ИЗ
		|		&Набор КАК НаборПоЗаказам
		|	СГРУППИРОВАТЬ ПО
		|		НаборПоЗаказам.Номенклатура,
		|		НаборПоЗаказам.Характеристика,
		|		НаборПоЗаказам.Склад,
		|		НаборПоЗаказам.Назначение,
		|		НаборПоЗаказам.ЗаказНаОтгрузку,
		|		НаборПоЗаказам.КонтролируемаяПартия
		|ИМЕЮЩИЕ
		|	СУММА(НаборПоЗаказам.ПолученныеРезервы) > 0) КАК Набор
		|СГРУППИРОВАТЬ ПО
		|	Набор.Номенклатура,
		|	Набор.Характеристика,
		|	Набор.Склад,
		|	Набор.Назначение,
		|	Набор.КонтролируемаяПартия
		|ИНДЕКСИРОВАТЬ ПО
		|	Номенклатура, Характеристика, Склад, Назначение, КонтролируемаяПартия";
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&Набор", СтрШаблон("(%1)", ТекстНабора));
	ТекстыЗапроса.Добавить(ТекстЗапроса, "РезервыПоЗаказамДляКонтроляОбеспечения");
	
	#КонецОбласти
	
	#Область ВременнаяТаблица_ИзмененияИРезервыДляКонтроляОбеспечения
	
	ТекстЗапроса =
		"ВЫБРАТЬ
		|	Изменения.Номенклатура КАК Номенклатура,
		|	Изменения.Характеристика КАК Характеристика,
		|	Изменения.Склад КАК Склад,
		|	Изменения.Назначение КАК Назначение,
		|	Изменения.КонтролируемаяПартия КАК КонтролируемаяПартия,
			// Увеличение Отгрузить.
		|	Изменения.ВНаличииРасход КАК Отгрузить,
			// Увеличение Отгрузить или РезервироватьНаСкладе, непокрытое увеличением наличия и собственными резервами, распределенными на заказ.
		|	ВЫБОР
		|		КОГДА Изменения.РезервироватьНаСкладе
		|					+ Изменения.ВНаличииРасход
		|					- ЕСТЬNULL(Резервы.ПолученныеРезервы, 0) < 0
		|				ИЛИ Изменения.РезервироватьНаСкладе
		|					- Изменения.ВНаличии
		|					- ЕСТЬNULL(Резервы.ПолученныеРезервы, 0) < 0
		|			ТОГДА 0
		|		КОГДА Изменения.РезервироватьНаСкладе
		|					+ Изменения.ВНаличииРасход
		|					- ЕСТЬNULL(Резервы.ПолученныеРезервы, 0)
		|				< Изменения.РезервироватьНаСкладе
		|					- Изменения.ВНаличии
		|					- ЕСТЬNULL(Резервы.ПолученныеРезервы, 0)
		|			ТОГДА
		|				Изменения.РезервироватьНаСкладе
		|					+ Изменения.ВНаличииРасход
		|					- ЕСТЬNULL(Резервы.ПолученныеРезервы, 0)
		|		ИНАЧЕ
		|			Изменения.РезервироватьНаСкладе
		|				- Изменения.ВНаличии
		|				- ЕСТЬNULL(Резервы.ПолученныеРезервы, 0)
		|	КОНЕЦ КАК ЗапросСвободногоОстаткаНаСкладе,
			// Увеличение Отгрузить, РезервироватьНаСкладе или РезервироватьПоМереПоступления, непокрытое увеличением наличия или ожидаемого поступления.
		|	ВЫБОР
		|		КОГДА Изменения.РезервироватьНаСкладе
		|					+ Изменения.РезервироватьПоМереПоступления
		|					+ Изменения.ВНаличииРасход
		|					- Изменения.Поступит < 0
		|				ИЛИ Изменения.РезервироватьНаСкладе
		|					+ Изменения.РезервироватьПоМереПоступления
		|					- Изменения.ВНаличии
		|					- Изменения.Поступит < 0
		|			ТОГДА 0
		|		КОГДА Изменения.РезервироватьНаСкладе
		|					+ Изменения.РезервироватьПоМереПоступления
		|					+ Изменения.ВНаличииРасход
		|					- Изменения.Поступит
		|				< Изменения.РезервироватьНаСкладе
		|					+ Изменения.РезервироватьПоМереПоступления
		|					- Изменения.ВНаличии
		|					- Изменения.Поступит
		|			ТОГДА
		|				Изменения.РезервироватьНаСкладе
		|					+ Изменения.РезервироватьПоМереПоступления
		|					+ Изменения.ВНаличииРасход
		|					- Изменения.Поступит
		|		ИНАЧЕ
		|			Изменения.РезервироватьНаСкладе
		|				+ Изменения.РезервироватьПоМереПоступления
		|				- Изменения.ВНаличии
		|				- Изменения.Поступит
		|	КОНЕЦ КАК ЗапросСвободногоОстаткаВсего,
			// Увеличение Отгрузить по партиям сводно.
		|	ВЫБОР
		|		КОГДА Изменения.ВНаличииРасходПоПартиямСводно < 0 ИЛИ - Изменения.ВНаличииПоПартиямСводно < 0
		|			ТОГДА 0
		|		КОГДА Изменения.ВНаличииРасходПоПартиямСводно < - Изменения.ВНаличииПоПартиямСводно
		|			ТОГДА Изменения.ВНаличииРасходПоПартиямСводно
		|		ИНАЧЕ - Изменения.ВНаличииПоПартиямСводно
		|	КОНЕЦ КАК ОтгрузитьПоПартиямСводно
		|ПОМЕСТИТЬ ИзмененияИРезервыДляКонтроляОбеспечения
		|ИЗ
		|	ИзмененияДляКонтроляОбеспечения КАК Изменения
		|		ЛЕВОЕ СОЕДИНЕНИЕ РезервыПоЗаказамДляКонтроляОбеспечения КАК Резервы
		|		ПО Резервы.Номенклатура = Изменения.Номенклатура
		|		 И Резервы.Характеристика = Изменения.Характеристика
		|		 И Резервы.Склад = Изменения.Склад
		|		 И Резервы.Назначение = Изменения.Назначение
		|		 И Резервы.КонтролируемаяПартия = Изменения.КонтролируемаяПартия
		|ГДЕ
		|	Изменения.ВНаличииРасход > 0
		|		ИЛИ НЕ &КонтролироватьТолькоФактическийОстаток
		|			И Изменения.РезервироватьНаСкладе
		|				+ Изменения.ВНаличииРасход
		|				- ЕСТЬNULL(Резервы.ПолученныеРезервы, 0) > 0
		|			И Изменения.РезервироватьНаСкладе
		|				- Изменения.ВНаличии
		|				- ЕСТЬNULL(Резервы.ПолученныеРезервы, 0) > 0
		|		ИЛИ НЕ &КонтролироватьТолькоФактическийОстаток
		|			И &КонтролироватьЗапасыТоваровПодлежащихРезервированиюПоМереПоступления
		|			И Изменения.РезервироватьНаСкладе
		|				+ Изменения.РезервироватьПоМереПоступления
		|				+ Изменения.ВНаличииРасход
		|				- Изменения.Поступит > 0
		|			И Изменения.РезервироватьНаСкладе
		|				+ Изменения.РезервироватьПоМереПоступления
		|				- Изменения.ВНаличии
		|				- Изменения.Поступит > 0
		|		ИЛИ НЕ &КонтролироватьТолькоФактическийОстаток
		|			И Изменения.ВНаличииРасходПоПартиямСводно > 0
		|			И - Изменения.ВНаличииПоПартиямСводно > 0
		|ИНДЕКСИРОВАТЬ ПО
		|	Номенклатура, Характеристика, Склад, Назначение, КонтролируемаяПартия";
	ТекстыЗапроса.Добавить(ТекстЗапроса, "ИзмененияИРезервыДляКонтроляОбеспечения");
	
	#КонецОбласти
	
	#Область ВременнаяТаблица_АналитикиЗапасыИПотребностиДляКонтроляОбеспечения
	
	ИмяТаблицыАналитик = "ИзмененияИРезервыДляКонтроляОбеспечения";
	Если ЕстьКонтрольКачества Тогда
		
		ИмяТаблицыАналитик = "АналитикиЗапасыИПотребностиДляКонтроляОбеспечения";
		
		ТекстЗапроса =
			"ВЫБРАТЬ
			|	Таблица.Номенклатура КАК Номенклатура,
			|	Таблица.Характеристика КАК Характеристика,
			|	Таблица.Склад КАК Склад,
			|	Таблица.Назначение КАК Назначение
			|ПОМЕСТИТЬ АналитикиЗапасыИПотребностиДляКонтроляОбеспечения
			|ИЗ
			|	ИзмененияИРезервыДляКонтроляОбеспечения КАК Таблица
			|ГДЕ
			|	Таблица.КонтролируемаяПартия = ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка)
			|ИНДЕКСИРОВАТЬ ПО
			|	Номенклатура, Характеристика, Склад, Назначение";
		ТекстыЗапроса.Добавить(ТекстЗапроса, "АналитикиЗапасыИПотребностиДляКонтроляОбеспечения");
		
		ТекстЗапроса =
			"ВЫБРАТЬ
			|	Таблица.Номенклатура КАК Номенклатура,
			|	Таблица.Характеристика КАК Характеристика,
			|	Таблица.Склад КАК Склад,
			|	Таблица.Назначение КАК Назначение,
			|	Таблица.КонтролируемаяПартия КАК КонтролируемаяПартия
			|ПОМЕСТИТЬ АналитикиЗапасыИПотребностиДляКонтроляОбеспеченияКонтролируемыхПартий
			|ИЗ
			|	ИзмененияИРезервыДляКонтроляОбеспечения КАК Таблица
			|ГДЕ
			|	Таблица.КонтролируемаяПартия <> ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка)
			|ИНДЕКСИРОВАТЬ ПО
			|	Номенклатура, Характеристика, Склад, Назначение, КонтролируемаяПартия";
		ТекстыЗапроса.Добавить(ТекстЗапроса, "АналитикиЗапасыИПотребностиДляКонтроляОбеспеченияКонтролируемыхПартий");
		
	КонецЕсли;
	
	#КонецОбласти
	
	#Область ВременнаяТаблица_ОшибкиКонтроляДляКонтроляОбеспечения
	
	ТекстНабора =
		"ВЫБРАТЬ
		|	ИзмененияДляКонтроля.Номенклатура КАК Номенклатура,
		|	ИзмененияДляКонтроля.Характеристика КАК Характеристика,
		|	ИзмененияДляКонтроля.Склад КАК Склад,
		|	ИзмененияДляКонтроля.Назначение КАК Назначение,
		|	ИзмененияДляКонтроля.КонтролируемаяПартия КАК КонтролируемаяПартия,
		|	ЛОЖЬ ЕстьРезервироватьПоМереПоступления,
		|	
		|	ИзмененияДляКонтроля.Отгрузить КАК Отгрузить,
		|	ИзмененияДляКонтроля.ЗапросСвободногоОстаткаНаСкладе КАК ЗапросСвободногоОстаткаНаСкладе,
		|	ИзмененияДляКонтроля.ЗапросСвободногоОстаткаВсего КАК ЗапросСвободногоОстаткаВсего,
		|	ИзмененияДляКонтроля.ОтгрузитьПоПартиямСводно КАК ОтгрузитьПоПартиямСводно,
		|	
		|	0 КАК КонтрольФактическогоОстаткаНаСкладе,
		|	0 КАК КонтрольОтгрузкиИзСобственногоРезерва,
		|	0 КАК КонтрольСвободногоОстаткаНаСкладе,
		|	0 КАК КонтрольСвободногоОстаткаВсего,
		|	0 КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
		|ИЗ
		|	ИзмененияИРезервыДляКонтроляОбеспечения КАК ИзмененияДляКонтроля
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ
		|	Остатки.Номенклатура КАК Номенклатура,
		|	Остатки.Характеристика КАК Характеристика,
		|	Остатки.Склад КАК Склад,
		|	Остатки.Назначение КАК Назначение,
		|	ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
		|	Остатки.РезервироватьПоМереПоступленияОстаток > 0
		|		ИЛИ Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток > 0 КАК ЕстьРезервироватьПоМереПоступления,
		|	
		|	0 КАК Отгрузить,
		|	0 КАК ЗапросСвободногоОстаткаНаСкладе,
		|	0 КАК ЗапросСвободногоОстаткаВсего,
		|	0 КАК ОтгрузитьПоПартиямСводно,
		|
		|	Остатки.ВНаличииОстаток
		|		- Остатки.ЗаблокированоВНаличииОстаток КАК КонтрольФактическогоОстаткаНаСкладе,
		|	
		|	Остатки.ВНаличииОстаток
		|		- Остатки.ЗаблокированоВНаличииОстаток
		|		- Остатки.РезервироватьНаСкладеОстаток КАК КонтрольОтгрузкиИзСобственногоРезерва,
		|	
		|	Остатки.ВНаличииОстаток
		|		- Остатки.ЗаблокированоВНаличииОстаток
		|		- Остатки.РезервироватьНаСкладеОстаток
		|		- Остатки.РезервироватьПоМереПоступленияОстаток КАК КонтрольСвободногоОстаткаНаСкладе,
		|	
		|	Остатки.ВНаличииОстаток
		|		+ Остатки.ПоступитОстаток
		|		- Остатки.РезервироватьНаСкладеОстаток
		|		- Остатки.РезервироватьПоМереПоступленияОстаток
		|		- Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток
		|		- Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольСвободногоОстаткаВсего,
		|	
		|	Остатки.ВНаличииОстаток
		|		- Остатки.ЗаблокированоВНаличииОстаток
		|		- Остатки.РезервироватьНаСкладеОстаток
		|		- Остатки.РезервироватьПоМереПоступленияОстаток КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
		|ИЗ
		|	РегистрНакопления.ЗапасыИПотребности.Остатки(,
		|		(Номенклатура, Характеристика, Склад, Назначение) В(
		|			ВЫБРАТЬ
		|				Таблица.Номенклатура КАК Номенклатура,
		|				Таблица.Характеристика КАК Характеристика,
		|				Таблица.Склад КАК Склад,
		|				Таблица.Назначение КАК Назначение
		|			ИЗ
		|				&Аналитики КАК Таблица)) КАК Остатки
		|
		|ОБЪЕДИНИТЬ ВСЕ
		|
		|ВЫБРАТЬ
		|	Остатки.Номенклатура КАК Номенклатура,
		|	Остатки.Характеристика КАК Характеристика,
		|	Остатки.Склад КАК Склад,
		|	Остатки.Назначение КАК Назначение,
		|	ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
		|	ЛОЖЬ ЕстьРезервироватьПоМереПоступления,
		|	
		|	0 КАК Отгрузить,
		|	0 КАК ЗапросСвободногоОстаткаНаСкладе,
		|	0 КАК ЗапросСвободногоОстаткаВсего,
		|	0 КАК ОтгрузитьПоПартиямСводно,
		|	
		// для ПараметрыСеанса.ПроводитьБезКонтроляРезервовТоваровПоЗаказам нужно отгружать из резервов других заказов, но не своего.
		|	- Остатки.РезервироватьНаСкладеОстаток КАК КонтрольФактическогоОстаткаНаСкладе,
		|	0 КАК КонтрольОтгрузкиИзСобственногоРезерва,
		|	Остатки.РезервироватьПоМереПоступленияОстаток КАК КонтрольСвободногоОстаткаНаСкладе,
		|	0 КАК КонтрольСвободногоОстаткаВсего,
		|	0 КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
		|ИЗ
		|	РегистрНакопления.ЗапасыИПотребности.Остатки(,
		|		(Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
		|			ВЫБРАТЬ
		|				Таблица.Номенклатура КАК Номенклатура,
		|				Таблица.Характеристика КАК Характеристика,
		|				Таблица.Склад КАК Склад,
		|				Таблица.Назначение КАК Назначение,
		|				Таблица.Заказ КАК Заказ
		|			ИЗ
		|				ЗапасыИПотребностиЗатронутыеЗаказы КАК Таблица)
		|		И (Номенклатура, Характеристика, Склад, Назначение) В(
		|			ВЫБРАТЬ
		|				Таблица.Номенклатура КАК Номенклатура,
		|				Таблица.Характеристика КАК Характеристика,
		|				Таблица.Склад КАК Склад,
		|				Таблица.Назначение КАК Назначение
		|			ИЗ
		|				&Аналитики КАК Таблица)) КАК Остатки";
	ТекстНабора = СтрЗаменить(ТекстНабора, "&Аналитики", ИмяТаблицыАналитик);
	
	Если ЕстьКонтрольКачества Тогда
		
		Тексты = Новый Массив();
		Тексты.Добавить(ТекстНабора);
		
		Текст =
			"ВЫБРАТЬ
			|	Остатки.Номенклатура КАК Номенклатура,
			|	Остатки.Характеристика КАК Характеристика,
			|	Остатки.Склад КАК Склад,
			|	Остатки.Назначение КАК Назначение,
			|	Остатки.Заказ КАК КонтролируемаяПартия,
			|	Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток > 0 КАК ЕстьРезервироватьПоМереПоступления,
			|	
			|	0 КАК Отгрузить,
			|	0 КАК ЗапросСвободногоОстаткаНаСкладе,
			|	0 КАК ЗапросСвободногоОстаткаВсего,
			|	0 КАК ОтгрузитьПоПартиямСводно,
			|	
			|	Остатки.ЗаблокированоВНаличииОстаток КАК КонтрольФактическогоОстаткаНаСкладе,
			|	
			|	Остатки.ЗаблокированоВНаличииОстаток
			|		- Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток КАК КонтрольОтгрузкиИзСобственногоРезерва,
			|	
			|	Остатки.ЗаблокированоВНаличииОстаток
			|		- Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток
			|		- Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольСвободногоОстаткаНаСкладе,
			|	
			|	Остатки.ЗаблокированоВНаличииОстаток
			|		+ Остатки.ЗаблокированоПоступитОстаток
			|		- Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток
			|		- Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольСвободногоОстаткаВсего,
			|	
			|	0 КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
			|ИЗ
			|	РегистрНакопления.ЗапасыИПотребности.Остатки(,
			|		(Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
			|			ВЫБРАТЬ
			|				Таблица.Номенклатура КАК Номенклатура,
			|				Таблица.Характеристика КАК Характеристика,
			|				Таблица.Склад КАК Склад,
			|				Таблица.Назначение КАК Назначение,
			|				Таблица.КонтролируемаяПартия КАК Заказ
			|			ИЗ
			|				АналитикиЗапасыИПотребностиДляКонтроляОбеспеченияКонтролируемыхПартий КАК Таблица)) КАК Остатки
			|
			|ОБЪЕДИНИТЬ ВСЕ
			|
			|ВЫБРАТЬ
			|	Остатки.Номенклатура КАК Номенклатура,
			|	Остатки.Характеристика КАК Характеристика,
			|	Остатки.Склад КАК Склад,
			|	Остатки.Назначение КАК Назначение,
			|	Остатки.Заказ КАК КонтролируемаяПартия,
			|	ЛОЖЬ ЕстьРезервироватьПоМереПоступления,
			|	
			|	0 КАК Отгрузить,
			|	0 КАК ЗапросСвободногоОстаткаНаСкладе,
			|	0 КАК ЗапросСвободногоОстаткаВсего,
			|	0 КАК ОтгрузитьПоПартиямСводно,
			|	
			// для ПараметрыСеанса.ПроводитьБезКонтроляРезервовТоваровПоЗаказам нужно отгружать из резервов других заказов, но не своего.
			|	- Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток КАК КонтрольФактическогоОстаткаНаСкладе,
			|	0 КАК КонтрольОтгрузкиИзСобственногоРезерва,
			|	Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольСвободногоОстаткаНаСкладе,
			|	0 КАК КонтрольСвободногоОстаткаВсего,
			|	0 КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
			|ИЗ
			|	РегистрНакопления.ЗапасыИПотребности.Остатки(,
			|		(Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
			|			ВЫБРАТЬ
			|				Таблица.Номенклатура КАК Номенклатура,
			|				Таблица.Характеристика КАК Характеристика,
			|				Таблица.Склад КАК Склад,
			|				Таблица.Назначение КАК Назначение,
			|				Таблица.Заказ КАК Заказ
			|			ИЗ
			|				ЗапасыИПотребностиЗатронутыеЗаказы КАК Таблица)
			|		И (Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
			|			ВЫБРАТЬ
			|				Таблица.Номенклатура КАК Номенклатура,
			|				Таблица.Характеристика КАК Характеристика,
			|				Таблица.Склад КАК Склад,
			|				Таблица.Назначение КАК Назначение,
			|				Таблица.КонтролируемаяПартия КАК Заказ
			|			ИЗ
			|				АналитикиЗапасыИПотребностиДляКонтроляОбеспеченияКонтролируемыхПартий КАК Таблица)) КАК Остатки";
		Тексты.Добавить(Текст);
		
		Если ЕстьСводныйКонтрольПартий Тогда
			
			// Излишки партий, подлежащие разблокировке, доступные для резервирования по пустой партии.
			Текст =
				"ВЫБРАТЬ
				|	ВложенныйЗапрос.Номенклатура КАК Номенклатура,
				|	ВложенныйЗапрос.Характеристика КАК Характеристика,
				|	ВложенныйЗапрос.Склад КАК Склад,
				|	ВложенныйЗапрос.Назначение КАК Назначение,
				|	ЗНАЧЕНИЕ(Справочник.КонтролируемыеПартии.ПустаяСсылка) КАК КонтролируемаяПартия,
				|	ЛОЖЬ ЕстьРезервироватьПоМереПоступления,
				|
				|	0 КАК Отгрузить,
				|	0 КАК ЗапросСвободногоОстаткаНаСкладе,
				|	0 КАК ЗапросСвободногоОстаткаВсего,
				|	0 КАК ОтгрузитьПоПартиямСводно,
				|	
				|	0 КАК КонтрольФактическогоОстаткаНаСкладе,
				|	0 КАК КонтрольОтгрузкиИзСобственногоРезерва,
				|	0 КАК КонтрольСвободногоОстаткаНаСкладе,
				|	0 КАК КонтрольСвободногоОстаткаВсего,
				|	ВЫБОР
				|		КОГДА СУММА(ВложенныйЗапрос.КонтрольРезервированияНаСкладе) < 0 ИЛИ СУММА(ВложенныйЗапрос.КРазблокировкеОстаток) < 0
				|			ТОГДА 0
				|		КОГДА СУММА(ВложенныйЗапрос.КРазблокировкеОстаток) < СУММА(ВложенныйЗапрос.КонтрольРезервированияНаСкладе)
				|			ТОГДА СУММА(ВложенныйЗапрос.КРазблокировкеОстаток)
				|		ИНАЧЕ СУММА(ВложенныйЗапрос.КонтрольРезервированияНаСкладе)
				|	КОНЕЦ КАК КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
				|ИЗ(
				|	ВЫБРАТЬ
				|		Остатки.Номенклатура КАК Номенклатура,
				|		Остатки.Характеристика КАК Характеристика,
				|		Остатки.Склад КАК Склад,
				|		Остатки.Назначение КАК Назначение,
				|		Остатки.Заказ КАК КонтролируемаяПартия,
				|		Остатки.КРазблокировкеОстаток КАК КРазблокировкеОстаток,
				|		Остатки.ЗаблокированоВНаличииОстаток
				|			- Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток
				|			- Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольРезервированияНаСкладе
				|	ИЗ
				|		РегистрНакопления.ЗапасыИПотребности.Остатки(,
				|			(Номенклатура, Характеристика, Склад, Назначение) В(
				|				ВЫБРАТЬ
				|					Таблица.Номенклатура КАК Номенклатура,
				|					Таблица.Характеристика КАК Характеристика,
				|					Таблица.Склад КАК Склад,
				|					Таблица.Назначение КАК Назначение
				|				ИЗ
				|					АналитикиЗапасыИПотребностиДляКонтроляОбеспечения КАК Таблица)) КАК Остатки
				|	
				|	ОБЪЕДИНИТЬ ВСЕ
				|	
				|	ВЫБРАТЬ
				|		Остатки.Номенклатура КАК Номенклатура,
				|		Остатки.Характеристика КАК Характеристика,
				|		Остатки.Склад КАК Склад,
				|		Остатки.Назначение КАК Назначение,
				|		Остатки.Заказ КАК КонтролируемаяПартия,
				|		0 КАК КРазблокировкеОстаток,
				|		Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток КАК КонтрольРезервированияНаСкладе
				|ИЗ
				|	РегистрНакопления.ЗапасыИПотребности.Остатки(,
				|		(Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
				|			ВЫБРАТЬ
				|				Таблица.Номенклатура КАК Номенклатура,
				|				Таблица.Характеристика КАК Характеристика,
				|				Таблица.Склад КАК Склад,
				|				Таблица.Назначение КАК Назначение,
				|				Таблица.Заказ КАК Заказ
				|			ИЗ
				|				ЗапасыИПотребностиЗатронутыеЗаказы КАК Таблица)
				|		И (Номенклатура, Характеристика, Склад, Назначение) В(
				|			ВЫБРАТЬ
				|				Таблица.Номенклатура КАК Номенклатура,
				|				Таблица.Характеристика КАК Характеристика,
				|				Таблица.Склад КАК Склад,
				|				Таблица.Назначение КАК Назначение
				|			ИЗ
				|				АналитикиЗапасыИПотребностиДляКонтроляОбеспечения КАК Таблица)) КАК Остатки) КАК ВложенныйЗапрос
				|СГРУППИРОВАТЬ ПО
				|	ВложенныйЗапрос.Номенклатура,
				|	ВложенныйЗапрос.Характеристика,
				|	ВложенныйЗапрос.Склад,
				|	ВложенныйЗапрос.КонтролируемаяПартия,
				|	ВложенныйЗапрос.Назначение
				|ИМЕЮЩИЕ
				|	СУММА(ВложенныйЗапрос.КонтрольРезервированияНаСкладе) > 0";
			Тексты.Добавить(Текст);
			
		КонецЕсли;
		
		ТекстНабора = СтрСоединить(Тексты, ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());
		
	КонецЕсли;
	
	ТекстЗапроса =
		"ВЫБРАТЬ
		|	Набор.Номенклатура КАК Номенклатура,
		|	Набор.Характеристика КАК Характеристика,
		|	Набор.Склад КАК Склад,
		|	Набор.Назначение КАК Назначение,
		|	Набор.КонтролируемаяПартия КАК КонтролируемаяПартия,
		|	&КонтролироватьЗапасыТоваровПодлежащихРезервированиюПоМереПоступления
		|		И МАКСИМУМ(Набор.ЕстьРезервироватьПоМереПоступления) КАК НуженКонтрольСвободногоОстаткаВсего,
		|	СУММА(Набор.Отгрузить) КАК Отгрузить,
		|	СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе) КАК ЗапросСвободногоОстаткаНаСкладе,
		|	СУММА(Набор.ЗапросСвободногоОстаткаВсего) КАК ЗапросСвободногоОстаткаВсего,
		|	СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) КАК КонтрольФактическогоОстаткаНаСкладе,
		|	СУММА(Набор.КонтрольСвободногоОстаткаНаСкладе) КАК КонтрольСвободногоОстаткаНаСкладе,
		|	СУММА(Набор.КонтрольСвободногоОстаткаВсего) КАК КонтрольСвободногоОстаткаВсего,
		|	ВЫБОР
		|		КОГДА СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) > 0
		|			ТОГДА 0
		|		КОГДА -СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) > СУММА(Набор.Отгрузить)
		|			ТОГДА СУММА(Набор.Отгрузить)
		|		ИНАЧЕ -СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе)
		|	КОНЕЦ КАК НедостаточноФактическогоОстаткаНаСкладеДляОтгрузить,
		|	ВЫБОР
		|		КОГДА СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) > 0
		|			ТОГДА 0
		|		КОГДА -СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) > СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе)
		|			ТОГДА СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе)
		|		ИНАЧЕ -СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе)
		|	КОНЕЦ КАК НедостаточноФактическогоОстаткаНаСкладе,
		|	ВЫБОР
		|		КОГДА СУММА(Набор.КонтрольОтгрузкиИзСобственногоРезерва) > 0
		|			ТОГДА 0
		|		КОГДА -СУММА(Набор.КонтрольОтгрузкиИзСобственногоРезерва) > СУММА(Набор.Отгрузить)
		|			ТОГДА СУММА(Набор.Отгрузить)
		|		ИНАЧЕ -СУММА(Набор.КонтрольОтгрузкиИзСобственногоРезерва)
		|	КОНЕЦ КАК НедостаточноСвободногоОстаткаНаСкладеДляОтгрузить,
		|	ВЫБОР
		|		КОГДА СУММА(Набор.КонтрольСвободногоОстаткаНаСкладе) > 0
		|			ТОГДА 0
		|		КОГДА -СУММА(Набор.КонтрольСвободногоОстаткаНаСкладе) > СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе)
		|			ТОГДА СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе)
		|		ИНАЧЕ -СУММА(Набор.КонтрольСвободногоОстаткаНаСкладе)
		|	КОНЕЦ КАК НедостаточноСвободногоОстаткаНаСкладе,
		|	ВЫБОР
		|		КОГДА СУММА(Набор.КонтрольСвободногоОстаткаВсего) > 0
		|			ТОГДА 0
		|		КОГДА -СУММА(Набор.КонтрольСвободногоОстаткаВсего) > СУММА(Набор.ЗапросСвободногоОстаткаВсего)
		|			ТОГДА СУММА(Набор.ЗапросСвободногоОстаткаВсего)
		|		ИНАЧЕ -СУММА(Набор.КонтрольСвободногоОстаткаВсего)
		|	КОНЕЦ КАК НедостаточноСвободногоОстаткаВсего,
		|	ВЫБОР
		|		КОГДА СУММА(Набор.КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления) > 0
		|			ТОГДА 0
		|		КОГДА -СУММА(Набор.КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления) > СУММА(Набор.ОтгрузитьПоПартиямСводно)
		|			ТОГДА СУММА(Набор.ОтгрузитьПоПартиямСводно)
		|		ИНАЧЕ -СУММА(Набор.КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления)
		|	КОНЕЦ КАК НедостаточноСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
		|ПОМЕСТИТЬ ОшибкиКонтроляДляКонтроляОбеспечения
		|ИЗ
		|	НаборПереопределяемый КАК Набор
		|СГРУППИРОВАТЬ ПО
		|	Набор.Номенклатура,
		|	Набор.Характеристика,
		|	Набор.Склад,
		|	Набор.Назначение,
		|	Набор.КонтролируемаяПартия
		|ИМЕЮЩИЕ
		|		СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) < 0
		|				И СУММА(Набор.Отгрузить) > 0
		|				И &КонтролироватьТолькоФактическийОстаток
		|		ИЛИ СУММА(Набор.КонтрольФактическогоОстаткаНаСкладе) < 0
		|				И СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе) > 0
		|				И &КонтролироватьТолькоФактическийОстаток
		|		ИЛИ СУММА(Набор.КонтрольОтгрузкиИзСобственногоРезерва) < 0
		|				И СУММА(Набор.Отгрузить) > 0
		|				И НЕ &КонтролироватьТолькоФактическийОстаток
		|		ИЛИ СУММА(Набор.КонтрольСвободногоОстаткаНаСкладе) < 0
		|				И СУММА(Набор.ЗапросСвободногоОстаткаНаСкладе) > 0
		|				И НЕ &КонтролироватьТолькоФактическийОстаток
		|		ИЛИ СУММА(Набор.КонтрольСвободногоОстаткаВсего) < 0
		|				И СУММА(Набор.ЗапросСвободногоОстаткаВсего) > 0
		|				И МАКСИМУМ(Набор.ЕстьРезервироватьПоМереПоступления)
		|				И НЕ &КонтролироватьТолькоФактическийОстаток
		|				И &КонтролироватьЗапасыТоваровПодлежащихРезервированиюПоМереПоступления
		|		ИЛИ СУММА(Набор.КонтрольСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления) < 0
		|				И СУММА(Набор.ОтгрузитьПоПартиямСводно) > 0
		|				И НЕ &КонтролироватьТолькоФактическийОстаток";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "НаборПереопределяемый", СтрШаблон("(%1)", ТекстНабора));
	ТекстыЗапроса.Добавить(ТекстЗапроса, "ОшибкиКонтроляДляКонтроляОбеспечения");
	
	#КонецОбласти
	
	#Область ОбеспечениеРезультатыКонтроля
	
	ТекстЗапроса =
		"ВЫБРАТЬ
		|	ОшибкиКонтроля.Номенклатура КАК Номенклатура,
		|	ОшибкиКонтроля.Характеристика КАК Характеристика,
		|	ОшибкиКонтроля.Склад КАК Склад,
		|	ОшибкиКонтроля.Назначение КАК Назначение,
		|	ОшибкиКонтроля.КонтролируемаяПартия КАК КонтролируемаяПартия,
		|	ОшибкиКонтроля.НуженКонтрольСвободногоОстаткаВсего КАК НуженКонтрольСвободногоОстаткаВсего,
		|	&КонтролироватьТолькоФактическийОстаток КАК КонтролироватьТолькоФактическийОстаток,
		|	ВЫРАЗИТЬ(ОшибкиКонтроля.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения КАК ЕдиницаИзмерения,
		|	
		// Конкурирующие контроли, сообщение выдается на большую величину.
		|	ВЫБОР
		|		КОГДА ОшибкиКонтроля.НедостаточноФактическогоОстаткаНаСкладеДляОтгрузить > ОшибкиКонтроля.НедостаточноФактическогоОстаткаНаСкладе
		|			ТОГДА ОшибкиКонтроля.НедостаточноФактическогоОстаткаНаСкладеДляОтгрузить
		|		ИНАЧЕ ОшибкиКонтроля.НедостаточноФактическогоОстаткаНаСкладе
		|	КОНЕЦ КАК КоличествоФактическийОстаток,
		|	
		// Конкурирующие контроли, сообщение выдается на большую величину.
		|	ВЫБОР
		|		КОГДА ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляОтгрузить > ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладе
		|				И ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляОтгрузить > ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
		|			ТОГДА ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляОтгрузить
		|		КОГДА ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладе > ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
		|			ТОГДА ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладе
		|		ИНАЧЕ ОшибкиКонтроля.НедостаточноСвободногоОстаткаНаСкладеДляРезервироватьПоМереПоступления
		|	КОНЕЦ КАК КоличествоСвободныйОстатокНаСкладе,
		|	
		|	ОшибкиКонтроля.НедостаточноСвободногоОстаткаВсего КАК КоличествоСвободныйОстатокВсего
		|ИЗ
		|	ОшибкиКонтроляДляКонтроляОбеспечения КАК ОшибкиКонтроля";
	ТекстыЗапроса.Добавить(ТекстЗапроса, "ОбеспечениеРезультатыКонтроля");
	
	#КонецОбласти
	
	ТипДокумента = ТипЗнч(Документ.Ссылка);
	
	ЭтоДокументИсключение =
		ТипДокумента = Тип("ДокументСсылка.ВозвратТоваровОтКлиента")
			Или ТипДокумента = Тип("ДокументСсылка.ЗаявкаНаКонтрольКачестваТоваров")
			Или ТипДокумента = Тип("ДокументСсылка.КорректировкаРеализации")
			
			Или ТипДокумента = Тип("ДокументСсылка.ПоступлениеТоваровОтКлиента")
			Или ТипДокумента = Тип("ДокументСсылка.ПоступлениеТоваровОтХранителя")
				И Не Документ.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ПоступлениеОтПереработчика2_5;
		
	Если Не Запрос.Параметры.Свойство("МерныеТипыЕдиницИзмерений") Тогда
		Запрос.УстановитьПараметр("МерныеТипыЕдиницИзмерений",
			Справочники.УпаковкиЕдиницыИзмерения.МерныеТипыЕдиницИзмерений());
	КонецЕсли;
	
	#Область ОбеспечениеРезультатыКонтроляПревышенияОбособленногоОбеспечения
	
	КонтролироватьПревышениеОбособленногоОбеспечения = Не ЭтоДокументИсключение;
	
	Если КонтролироватьПревышениеОбособленногоОбеспечения Тогда
		
		ТекстЗапроса =
			"ВЫБРАТЬ
			|	ИзмененияДвижений.Номенклатура КАК Номенклатура,
			|	ИзмененияДвижений.Характеристика КАК Характеристика,
			|	ИзмененияДвижений.Склад КАК Склад,
			|	ИзмененияДвижений.Назначение КАК Назначение,
			|	МАКСИМУМ(ИзмененияДвижений.ВНаличииПриход > 0) КАК ЭтоУвеличениеПрихода
			|ПОМЕСТИТЬ АналитикиДляКонтроляПревышенияОбособленногоОбеспечения
			|ИЗ
			|	ЗапасыИПотребностиИзменение КАК ИзмененияДвижений
			|		
			|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаХарактеристика
			|		ПО НастройкаХарактеристика.Склад          = ИзмененияДвижений.Склад
			|		 И НастройкаХарактеристика.Номенклатура   = ИзмененияДвижений.Номенклатура
			|		 И НастройкаХарактеристика.Характеристика = ИзмененияДвижений.Характеристика
			|		
			|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаНоменклатура
			|		ПО НастройкаНоменклатура.Склад        = ИзмененияДвижений.Склад
			|		 И НастройкаНоменклатура.Номенклатура = ИзмененияДвижений.Номенклатура
			|		 И НастройкаНоменклатура.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
			|		
			|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаСклад
			|		ПО НастройкаСклад.Склад          = ИзмененияДвижений.Склад
			|		 И НастройкаСклад.Номенклатура   = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
			|		 И НастройкаСклад.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
			|		
			|ГДЕ
			|	ИзмененияДвижений.КонтролироватьПревышениеОбособленногоОбеспечения
			|		И (ЕСТЬNULL(НастройкаХарактеристика.КонтролироватьСвободныеОстатки,
			|				ЕСТЬNULL(НастройкаНоменклатура.КонтролироватьСвободныеОстатки,
			|					НастройкаСклад.КонтролироватьСвободныеОстатки))
			|			ИЛИ ВЫРАЗИТЬ(ИзмененияДвижений.Номенклатура КАК Справочник.Номенклатура).ТипНоменклатуры
			|					= ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Работа))
			|СГРУППИРОВАТЬ ПО
			|	ИзмененияДвижений.Номенклатура,
			|	ИзмененияДвижений.Характеристика,
			|	ИзмененияДвижений.Склад,
			|	ИзмененияДвижений.Назначение
			|ИМЕЮЩИЕ
			|	СУММА(ИзмененияДвижений.ВНаличииПриход) > 0
			|		ИЛИ СУММА(ИзмененияДвижений.Поступит) > 0
			|		ИЛИ НЕ &КонтролироватьПодтвержденныйГрафикПоступления
			|			И СУММА(ИзмененияДвижений.Заказано) > 0
			|		ИЛИ СУММА(ИзмененияДвижений.ВНаличииРасход
			|					+ ИзмененияДвижений.РезервироватьНаСкладе
			|					+ ИзмененияДвижений.РезервироватьПоМереПоступления
			|					+ ИзмененияДвижений.РезервироватьНаСкладеИзЗаблокированных
			|					+ ИзмененияДвижений.РезервироватьПоМереПоступленияИзЗаблокированных
			|					+ ИзмененияДвижений.ОтложитьРезервирование
			|					+ ИзмененияДвижений.КОбеспечению) < 0
			|ИНДЕКСИРОВАТЬ ПО
			|	Номенклатура, Характеристика, Склад, Назначение";
		ТекстыЗапроса.Добавить(ТекстЗапроса, "АналитикиДляКонтроляПревышенияОбособленногоОбеспечения");
		
		ТекстЗапроса =
			"ВЫБРАТЬ
			|	Остатки.Номенклатура КАК Номенклатура,
			|	Остатки.Характеристика КАК Характеристика,
			|	Остатки.Склад КАК Склад,
			|	Остатки.Назначение КАК Назначение,
			|	Остатки.ВНаличииОстаток КАК ВНаличииОстаток,
			|	ВЫБОР
			|		КОГДА &КонтролироватьПодтвержденныйГрафикПоступления
			|			ТОГДА Остатки.ПоступитОстаток
			|		ИНАЧЕ Остатки.ЗаказаноОстаток
			|	КОНЕЦ КАК ЗаказаноОстаток,
			|	Остатки.РезервироватьНаСкладеОстаток
			|		+ Остатки.РезервироватьПоМереПоступленияОстаток
			|		+ Остатки.РезервироватьНаСкладеИзЗаблокированныхОстаток
			|		+ Остатки.РезервироватьПоМереПоступленияИзЗаблокированныхОстаток
			|		+ Остатки.ОтложитьРезервированиеОстаток
			|		+ Остатки.КОбеспечениюОстаток КАК ВсеПотребностиОстаток
			|ПОМЕСТИТЬ ЗапасыИПотребностиДляКонтроляОбособленногоОбеспечения
			|ИЗ
			|	РегистрНакопления.ЗапасыИПотребности.Остатки(,
			|		(Номенклатура, Характеристика, Склад, Назначение) В(
			|			ВЫБРАТЬ
			|				Аналитики.Номенклатура КАК Номенклатура,
			|				Аналитики.Характеристика КАК Характеристика,
			|				Аналитики.Склад КАК Склад,
			|				Аналитики.Назначение КАК Назначение
			|			ИЗ
			|				АналитикиДляКонтроляПревышенияОбособленногоОбеспечения КАК Аналитики)) КАК Остатки
			|ИНДЕКСИРОВАТЬ ПО
			|	Номенклатура, Характеристика, Склад, Назначение";
		ТекстыЗапроса.Добавить(ТекстЗапроса, "ЗапасыИПотребностиДляКонтроляОбособленногоОбеспечения");
		
		ТекстЗапроса =
			"ВЫБРАТЬ
			|	Остатки.Номенклатура КАК Номенклатура,
			|	Остатки.Характеристика КАК Характеристика,
			|	Остатки.Склад КАК Склад,
			|	Остатки.Назначение КАК Назначение,
			|	ВЫРАЗИТЬ(Остатки.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения КАК ЕдиницаИзмерения,
			|	ВЫБОР
			|		КОГДА Аналитики.ЭтоУвеличениеПрихода
			|				И Остатки.ВНаличииОстаток - Остатки.ВсеПотребностиОстаток
			|					> ВЫБОР
			|						КОГДА НЕ ВЫРАЗИТЬ(Остатки.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения.ТипИзмеряемойВеличины
			|									В (&МерныеТипыЕдиницИзмерений)
			|							ТОГДА 0
			|						ИНАЧЕ Остатки.ВсеПотребностиОстаток * ДопустимоеОтклонение.Значение / 100
			|					КОНЕЦ
			|			ТОГДА ИСТИНА
			|		ИНАЧЕ ЛОЖЬ
			|	КОНЕЦ КАК ОшибкаНаличиеБольшеПотребности,
			|	Остатки.ВНаличииОстаток - Остатки.ВсеПотребностиОстаток КАК ВеличинаНаличиеБольшеПотребности,
			|	Остатки.ВНаличииОстаток + Остатки.ЗаказаноОстаток - Остатки.ВсеПотребностиОстаток КАК ВеличинаЗаказатьМеньшеНуля
			|ИЗ
			|	ЗапасыИПотребностиДляКонтроляОбособленногоОбеспечения КАК Остатки
			|		
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ АналитикиДляКонтроляПревышенияОбособленногоОбеспечения КАК Аналитики
			|		ПО Аналитики.Номенклатура = Остатки.Номенклатура
			|		 И Аналитики.Характеристика = Остатки.Характеристика
			|		 И Аналитики.Склад = Остатки.Склад
			|		 И Аналитики.Назначение = Остатки.Назначение
			|		
			|		ЛЕВОЕ СОЕДИНЕНИЕ Константа.ДопустимоеОтклонениеОтгрузкиПриемкиМерныхТоваров КАК ДопустимоеОтклонение
			|		ПО ИСТИНА
			|ГДЕ
			|	Остатки.ВНаличииОстаток + Остатки.ЗаказаноОстаток - Остатки.ВсеПотребностиОстаток
			|		> ВЫБОР
			|			КОГДА НЕ ВЫРАЗИТЬ(Остатки.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения.ТипИзмеряемойВеличины
			|						В (&МерныеТипыЕдиницИзмерений)
			|				ТОГДА 0
			|			ИНАЧЕ
			|				Остатки.ВсеПотребностиОстаток * ДопустимоеОтклонение.Значение / 100
			|		КОНЕЦ";
		ТекстыЗапроса.Добавить(ТекстЗапроса, "ОбеспечениеРезультатыКонтроляПревышенияОбособленногоОбеспечения");
		
	КонецЕсли;
	
	#КонецОбласти
	
	#Область ОбеспечениеРезультатыКонтроляЗапасаКонтролируемойПартииНаСкладе
	
	Если ЕстьКонтрольКачества Тогда
		
		ТекстЗапроса =
			"ВЫБРАТЬ
			|	ИзмененияДвижений.Номенклатура КАК Номенклатура,
			|	ИзмененияДвижений.Характеристика КАК Характеристика,
			|	ИзмененияДвижений.Склад КАК Склад,
			|	ИзмененияДвижений.Назначение КАК Назначение,
			|	ИзмененияДвижений.Заказ КАК Заказ,
			|	СУММА(ИзмененияДвижений.ЗаблокированоВНаличииРасход) КАК УменьшениеВНаличииПоДокументу
			|ПОМЕСТИТЬ АналитикиДляКонтроляЗапасаКонтролируемойПартииНаСкладе
			|ИЗ
			|	ЗапасыИПотребностиИзменение КАК ИзмененияДвижений
			|		
			|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаХарактеристика
			|		ПО НастройкаХарактеристика.Склад          = ИзмененияДвижений.Склад
			|		 И НастройкаХарактеристика.Номенклатура   = ИзмененияДвижений.Номенклатура
			|		 И НастройкаХарактеристика.Характеристика = ИзмененияДвижений.Характеристика
			|		
			|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаНоменклатура
			|		ПО НастройкаНоменклатура.Склад        = ИзмененияДвижений.Склад
			|		 И НастройкаНоменклатура.Номенклатура = ИзмененияДвижений.Номенклатура
			|		 И НастройкаНоменклатура.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
			|		
			|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкаКонтроляОбеспечения КАК НастройкаСклад
			|		ПО НастройкаСклад.Склад          = ИзмененияДвижений.Склад
			|		 И НастройкаСклад.Номенклатура   = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
			|		 И НастройкаСклад.Характеристика = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
			|		
			|ГДЕ
			|	ЕСТЬNULL(НастройкаХарактеристика.КонтролироватьСвободныеОстатки,
			|			ЕСТЬNULL(НастройкаНоменклатура.КонтролироватьСвободныеОстатки,
			|				НастройкаСклад.КонтролироватьСвободныеОстатки))
			|		И ИзмененияДвижений.ЗаблокированоВНаличииРасход <> 0
			|СГРУППИРОВАТЬ ПО
			|	ИзмененияДвижений.Номенклатура,
			|	ИзмененияДвижений.Характеристика,
			|	ИзмененияДвижений.Склад,
			|	ИзмененияДвижений.Назначение,
			|	ИзмененияДвижений.Заказ
			|ИМЕЮЩИЕ
			|	СУММА(ИзмененияДвижений.ЗаблокированоВНаличииРасход) < 0
			|ИНДЕКСИРОВАТЬ ПО
			|	Номенклатура, Характеристика, Склад, Назначение, Заказ";
		ТекстыЗапроса.Добавить(ТекстЗапроса, "АналитикиДляКонтроляЗапасаКонтролируемойПартииНаСкладе");
		
		ТекстЗапроса =
			"ВЫБРАТЬ
			|	Обороты.Номенклатура КАК Номенклатура,
			|	Обороты.Характеристика КАК Характеристика,
			|	Обороты.Склад КАК Склад,
			|	Обороты.Назначение КАК Назначение,
			|	Обороты.Заказ КАК Заказ,
			|	- Обороты.ЗаблокированоВНаличииОборот КАК ВНаличииМеньшеНуля,
			|	Обороты.ЗаблокированоВНаличииПриход КАК ВНаличииПриход
			|ПОМЕСТИТЬ ЗапасыИПотребностиДляКонтроляЗапасаКонтролируемойПартииНаСкладе
			|ИЗ
			|	РегистрНакопления.ЗапасыИПотребности.Обороты(, , Авто,
			|		(Номенклатура, Характеристика, Склад, Назначение, Заказ) В(
			|			ВЫБРАТЬ
			|				Аналитики.Номенклатура КАК Номенклатура,
			|				Аналитики.Характеристика КАК Характеристика,
			|				Аналитики.Склад КАК Склад,
			|				Аналитики.Назначение КАК Назначение,
			|				Аналитики.Заказ КАК Заказ
			|			ИЗ
			|				АналитикиДляКонтроляЗапасаКонтролируемойПартииНаСкладе КАК Аналитики)) КАК Обороты
			|ГДЕ
			|	Обороты.ЗаблокированоВНаличииОборот < 0
			|ИНДЕКСИРОВАТЬ ПО
			|	Номенклатура, Характеристика, Склад, Назначение";
		ТекстыЗапроса.Добавить(ТекстЗапроса, "ЗапасыИПотребностиДляКонтроляЗапасаКонтролируемойПартииНаСкладе");
		
		ТекстЗапроса =
			"ВЫБРАТЬ
			|	Обороты.Номенклатура КАК Номенклатура,
			|	Обороты.Характеристика КАК Характеристика,
			|	Обороты.Склад КАК Склад,
			|	Обороты.Назначение КАК Назначение,
			|	Обороты.Заказ КАК КонтролируемаяПартия,
			|	ВЫРАЗИТЬ(Обороты.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения КАК ЕдиницаИзмерения,
			|	ВЫБОР
			|		КОГДА Обороты.ВНаличииМеньшеНуля > Аналитики.УменьшениеВНаличииПоДокументу
			|			ТОГДА Аналитики.УменьшениеВНаличииПоДокументу
			|		ИНАЧЕ Обороты.ВНаличииМеньшеНуля
			|	КОНЕЦ КАК Количество
			|ИЗ
			|	ЗапасыИПотребностиДляКонтроляЗапасаКонтролируемойПартииНаСкладе КАК Обороты
			|		
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ АналитикиДляКонтроляЗапасаКонтролируемойПартииНаСкладе КАК Аналитики
			|		ПО Аналитики.Номенклатура = Обороты.Номенклатура
			|		 И Аналитики.Характеристика = Обороты.Характеристика
			|		 И Аналитики.Склад = Обороты.Склад
			|		 И Аналитики.Назначение = Обороты.Назначение
			|		 И Аналитики.Заказ = Обороты.Заказ
			|		
			|		ЛЕВОЕ СОЕДИНЕНИЕ Константа.ДопустимоеОтклонениеОтгрузкиПриемкиМерныхТоваров КАК ДопустимоеОтклонение
			|		ПО ИСТИНА
			|ГДЕ
			|	Обороты.ВНаличииМеньшеНуля >
			|	ВЫБОР
			|		КОГДА НЕ ВЫРАЗИТЬ(Обороты.Номенклатура КАК Справочник.Номенклатура).ЕдиницаИзмерения.ТипИзмеряемойВеличины
			|					В (&МерныеТипыЕдиницИзмерений)
			|			ТОГДА 0
			|		ИНАЧЕ
			|			Обороты.ВНаличииПриход * ДопустимоеОтклонение.Значение / 100
			|	КОНЕЦ";
		ТекстыЗапроса.Добавить(ТекстЗапроса, "ОбеспечениеРезультатыКонтроляЗапасаКонтролируемойПартииНаСкладе");
		
	КонецЕсли;
	
	#КонецОбласти
	
КонецПроцедуры

Процедура СообщитьОбОшибкахПроведения(Объект, Отказ, РезультатыКонтроля) Экспорт
	
	ОтключитьКонтроль = ПараметрыСеанса.ПроводитьБезКонтроляРезервовТоваровПоЗаказам;
	
	Для Каждого ОшибкаКонтроля Из РезультатыКонтроля Цикл
		
		ЕдиницаИзмерения = ОшибкаКонтроля.ЕдиницаИзмерения;
		
		Количество = ОшибкаКонтроля.КоличествоФактическийОстаток;
		Если Количество > 0 И ОтключитьКонтроль Или ОшибкаКонтроля.КонтролироватьТолькоФактическийОстаток Тогда
			
			ТекстНазначениеХарактеристика = НСтр("ru = 'Для отгрузки / резервирования товара %1, %2 на складе %3 по назначению %4 недостаточно остатка в наличии в количестве %5 %6.'");
			ТекстНазначение = НСтр("ru = 'Для отгрузки / резервирования обособленного товара %1 на складе %2 по назначению %3 недостаточно остатка в наличии количестве %4 %5'");
			ТекстБезНазначенияХарактеристика = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1, %2 на складе %3 недостаточно остатка в наличии в количестве %4 %5.'");
			ТекстБезНазначения = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1 на складе %2 недостаточно остатка в наличии в количестве %3 %4'");
			
			ТекстНазначениеХарактеристикаПартия = НСтр("ru = 'Для отгрузки / резервирования товара %1, %2 контролируемой партии %3 на складе %4 по назначению %5 недостаточно остатка в наличии в количестве %6 %7.'");
			ТекстНазначениеПартия = НСтр("ru = 'Для отгрузки / резервирования обособленного товара %1 контролируемой партии %2 на складе %3 по назначению %4 недостаточно остатка в наличии количестве %5 %6'");
			ТекстБезНазначенияХарактеристикаПартия = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1, %2 контролируемой партии %3 на складе %4 недостаточно остатка в наличии в количестве %5 %6.'");
			ТекстБезНазначенияПартия = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1 контролируемой партии %2 на складе %3 недостаточно остатка в наличии в количестве %4 %5'");
			
			Если ЗначениеЗаполнено(ОшибкаКонтроля.Назначение) Тогда
				
				Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристикаПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристика,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				Иначе
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстНазначениеПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстНазначение,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				КонецЕсли;
				
			Иначе
				
				Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристикаПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристика,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				Иначе
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстБезНазначенияПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстБезНазначения,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЕсли;
			
			ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Отказ);
			
		КонецЕсли;
		
		Если ОшибкаКонтроля.КонтролироватьТолькоФактическийОстаток Тогда
			Продолжить;
		КонецЕсли;
		
		Количество = ОшибкаКонтроля.КоличествоСвободныйОстатокНаСкладе;
		Если Количество > 0 Тогда
			
			ТекстНазначениеХарактеристика = НСтр("ru = 'Для отгрузки / резервирования товара %1, %2 на складе %3 по назначению %4 недостаточно свободного остатка в количестве %5 %6.'");
			ТекстНазначение = НСтр("ru = 'Для отгрузки / резервирования обособленного товара %1 на складе %2 по назначению %3 недостаточно свободного остатка в количестве %4 %5'");
			ТекстБезНазначенияХарактеристика = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1, %2 на складе %3 недостаточно свободного остатка в количестве %4 %5.'");
			ТекстБезНазначения = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1 на складе %2 недостаточно свободного остатка в количестве %3 %4'");
			
			ТекстНазначениеХарактеристикаПартия = НСтр("ru = 'Для отгрузки / резервирования товара %1, %2 контролируемой партии %3 на складе %4 по назначению %5 недостаточно свободного остатка в количестве %6 %7.'");
			ТекстНазначениеПартия = НСтр("ru = 'Для отгрузки / резервирования обособленного товара %1 контролируемой партии %2 на складе %3 по назначению %4 недостаточно свободного остатка количестве %5 %6'");
			ТекстБезНазначенияХарактеристикаПартия = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1, %2 контролируемой партии %3 на складе %4 недостаточно свободного остатка в количестве %5 %6.'");
			ТекстБезНазначенияПартия = НСтр("ru = 'Для отгрузки / резервирования необособленного товара %1 контролируемой партии %2 на складе %3 недостаточно свободного остатка в количестве %4 %5'");
			
			Если ЗначениеЗаполнено(ОшибкаКонтроля.Назначение) Тогда
				
				Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристикаПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристика,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				Иначе
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстНазначениеПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстНазначение,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				КонецЕсли;
				
			Иначе
				
				Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристикаПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристика,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				Иначе
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстБезНазначенияПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстБезНазначения,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЕсли;
			
			Если ОтключитьКонтроль Тогда
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Неопределено);
			Иначе
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Отказ);
			КонецЕсли;
			
		КонецЕсли;
		
		Количество = ОшибкаКонтроля.КоличествоСвободныйОстатокВсего;
		
		Если ОшибкаКонтроля.НуженКонтрольСвободногоОстаткаВсего И Количество > 0 Тогда
			
			ТекстНазначениеХарактеристика = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1, %2 в наличии и в ожидаемых поступлениях на склад %3 по назначению %4 в количестве %5 %6.'");
			ТекстНазначение = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1 в наличии и в ожидаемых поступлениях на склад %2 по назначению %3 в количестве %4 %5'");
			ТекстБезНазначенияХарактеристика = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1, %2 в наличии и в ожидаемых поступлениях на склад %3 в количестве %4 %5.'");
			ТекстБезНазначения = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1 в наличии и в ожидаемых поступлениях на склад %2 в количестве %3 %4'");
			
			ТекстНазначениеХарактеристикаПартия = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1, %2 контролируемой партии %3 в наличии и в ожидаемых поступлениях на склад %4 по назначению %5 в количестве %6 %7.'");
			ТекстНазначениеПартия = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1 контролируемой партии %2 в наличии и в ожидаемых поступлениях на склад %3 по назначению %4 в количестве %5 %6'");
			ТекстБезНазначенияХарактеристикаПартия = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1, %2 контролируемой партии %3 в наличии и в ожидаемых поступлениях на склад %4 в количестве %5 %6.'");
			ТекстБезНазначенияПартия = НСтр("ru = 'Для обеспечения заказов недостаточно запасов товара %1 контролируемой партии %3 в наличии и в ожидаемых поступлениях на склад %4 в количестве %5 %6'");
			
			Если ЗначениеЗаполнено(ОшибкаКонтроля.Назначение) Тогда
				
				Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристикаПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристика,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				Иначе
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстНазначениеПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстНазначение,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Склад,
							ОшибкаКонтроля.Назначение,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				КонецЕсли;
				
			Иначе
				
				Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристикаПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстБезНазначенияХарактеристика,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Характеристика,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				Иначе
					
					Если ЗначениеЗаполнено(ОшибкаКонтроля.КонтролируемаяПартия) Тогда
						ТекстСообщения = СтрШаблон(ТекстБезНазначенияПартия,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.КонтролируемаяПартия,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					Иначе
						ТекстСообщения = СтрШаблон(ТекстБезНазначения,
							ОшибкаКонтроля.Номенклатура,
							ОшибкаКонтроля.Склад,
							Количество,
							ЕдиницаИзмерения);
					КонецЕсли;
					
				КонецЕсли;
				
			КонецЕсли;
			
			Если ОтключитьКонтроль Тогда
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Неопределено);
			Иначе
				ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Отказ);
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Процедура СообщитьОбОшибкахПроведенияПревышениеОбособленногоОбеспечения(Объект, Отказ, РезультатыКонтроля) Экспорт
	
	Для Каждого ОшибкаКонтроля Из РезультатыКонтроля Цикл
		
		ТекстНазначениеХарактеристика = "";
		ТекстНазначение = "";
		Количество = 0;
		ЕдиницаИзмерения = ОшибкаКонтроля.ЕдиницаИзмерения;
		
		Если ОшибкаКонтроля.ОшибкаНаличиеБольшеПотребности Тогда
			Количество = ОшибкаКонтроля.ВеличинаНаличиеБольшеПотребности;
			Если ТипЗнч(ОшибкаКонтроля.Склад) = Тип("СправочникСсылка.Склады") Тогда
				ТекстНазначениеХарактеристика = НСтр("ru = 'Номенклатура: %1, Характеристика: %2, Склад: %3, Назначение: %4. 
					|Приходуется для обеспечения больше чем требуется на %5 %6.'");
				ТекстНазначение = НСтр("ru = 'Номенклатура: %1, Склад: %2, Назначение: %3. 
					|Приходуется для обеспечения больше чем требуется на %4 %5.'");
			Иначе
				ТекстНазначениеХарактеристика = НСтр("ru = 'Номенклатура: %1, Характеристика: %2, Подразделение: %3, Назначение: %4. 
					|Приходуется для обеспечения больше чем требуется на %5 %6.'");
				ТекстНазначение = НСтр("ru = 'Номенклатура: %1, Подразделение: %2, Назначение: %3. 
					|Приходуется для обеспечения больше чем требуется на %4 %5.'");
			КонецЕсли;
		Иначе
			Количество = ОшибкаКонтроля.ВеличинаЗаказатьМеньшеНуля;
			Если ТипЗнч(ОшибкаКонтроля.Склад) = Тип("СправочникСсылка.Склады") Тогда
				ТекстНазначениеХарактеристика = НСтр("ru = 'Номенклатура: %1, Характеристика: %2, Склад: %3, Назначение: %4. 
					|Заказано для обеспечения больше чем требуется на %5 %6.'");
				ТекстНазначение = НСтр("ru = 'Номенклатура: %1, Склад: %2, Назначение: %3. 
					|Заказано для обеспечения больше чем требуется на %4 %5.'");
			Иначе
				ТекстНазначениеХарактеристика = НСтр("ru = 'Номенклатура: %1, Характеристика: %2, Подразделение: %3, Назначение: %4. 
					|Заказано для обеспечения больше чем требуется на %5 %6.'");
				ТекстНазначение = НСтр("ru = 'Номенклатура: %1, Подразделение: %2, Назначение: %3. 
					|Заказано для обеспечения больше чем требуется на %4 %5.'");
			КонецЕсли;
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
			ТекстСообщения = СтрШаблон(ТекстНазначениеХарактеристика,
				ОшибкаКонтроля.Номенклатура,
				ОшибкаКонтроля.Характеристика,
				ОшибкаКонтроля.Склад,
				ОшибкаКонтроля.Назначение,
				Количество,
				ЕдиницаИзмерения);
		Иначе
			ТекстСообщения = СтрШаблон(ТекстНазначение,
				ОшибкаКонтроля.Номенклатура,
				ОшибкаКонтроля.Склад,
				ОшибкаКонтроля.Назначение,
				Количество,
				ЕдиницаИзмерения);
		КонецЕсли;
		
		ОбщегоНазначения.СообщитьПользователю(ТекстСообщения, Объект, Неопределено, Неопределено, Отказ);
		
	КонецЦикла;
	
КонецПроцедуры

Процедура СообщитьОбОшибкахПроведенияЗапасКонтролируемойПартииНаСкладе(Объект, Отказ, РезультатыКонтроля) Экспорт
	
	Для Каждого ОшибкаКонтроля Из РезультатыКонтроля Цикл
		
		Номенклатура = ОшибкаКонтроля.Номенклатура;
		Характеристика = ОшибкаКонтроля.Характеристика;
		КонтролируемаяПартия = ОшибкаКонтроля.КонтролируемаяПартия;
		Склад = ОшибкаКонтроля.Склад;
		Назначение = ОшибкаКонтроля.Назначение;
		Количество = ОшибкаКонтроля.Количество;
		ЕдиницаИзмерения = ОшибкаКонтроля.ЕдиницаИзмерения;
		
		Если ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) И ЗначениеЗаполнено(ОшибкаКонтроля.Назначение) Тогда
		
			Текст = НСтр("ru = 'Недостаточно товара %1 c характеристикой %2 контролируемой партии %3 на складе %4 по назначению %5 в количестве %6 %7.'");
			Текст = СтрШаблон(Текст,
				Номенклатура,
				Характеристика,
				КонтролируемаяПартия,
				Склад,
				Назначение,
				Количество,
				ЕдиницаИзмерения);
				
		ИначеЕсли ЗначениеЗаполнено(ОшибкаКонтроля.Характеристика) Тогда
			
			Текст = НСтр("ru = 'Недостаточно товара %1 c характеристикой %2 контролируемой партии %3 на складе %4 в количестве %5 %6.'");
			Текст = СтрШаблон(Текст,
				Номенклатура,
				Характеристика,
				КонтролируемаяПартия,
				Склад,
				Количество,
				ЕдиницаИзмерения);
				
		ИначеЕсли ЗначениеЗаполнено(ОшибкаКонтроля.Назначение) Тогда
			
			Текст = НСтр("ru = 'Недостаточно товара %1 контролируемой партии %2 на складе %3 по назначению %4 в количестве %5 %6.'");
			Текст = СтрШаблон(Текст,
				Номенклатура,
				КонтролируемаяПартия,
				Склад,
				Назначение,
				Количество,
				ЕдиницаИзмерения);
				
		Иначе
			
			Текст = НСтр("ru = 'Недостаточно товара %1 контролируемой партии %2 на складе %3 в количестве %4 %5.'");
			Текст = СтрШаблон(Текст,
				Номенклатура,
				КонтролируемаяПартия,
				Склад,
				Количество,
				ЕдиницаИзмерения);
				
		КонецЕсли;
		
		ОбщегоНазначения.СообщитьПользователю(Текст, Объект, Неопределено, Неопределено, Отказ);
		
	КонецЦикла;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////////////////////////////
// Обслуживание регистров состояний заказов.

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

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

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

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

Функция БлокироватьРаспределениеЗапасов() Экспорт
	ПараметрЗапускаПриложения = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска");
	Возврат СтрНайти(ПараметрЗапускаПриложения, "БлокироватьРаспределениеЗапасов") > 0;
КонецФункции

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

		|	ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличии)
		|		И НЕ(
		|			Таблица.ЗаказНаПоступление = НЕОПРЕДЕЛЕНО
		|			И Таблица.ДатаПоступления = ДАТАВРЕМЯ(1, 1, 1)
		|			И Таблица.ДатаДоступности = ДАТАВРЕМЯ(1, 1, 1))
		|	ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииОжидаетсяРазблокировка)
		|		И НЕ(
		|			Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
		|			И Таблица.ДатаПоступления = ДАТАВРЕМЯ(1, 1, 1)
		|			И Таблица.ДатаДоступности <> ДАТАВРЕМЯ(1, 1, 1))
		|	ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ВНаличииНеПодлежитРазблокировке)
		|		И НЕ(
		|			Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
		|			И Таблица.ДатаПоступления = ДАТАВРЕМЯ(1, 1, 1)
		|			И Таблица.ДатаДоступности = ДАТАВРЕМЯ(1, 1, 1))
		|	ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлению)
		|		И НЕ(
		|			Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
		|			И Таблица.ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1)
		|			И Таблица.ДатаДоступности <> ДАТАВРЕМЯ(1, 1, 1))
		|	ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюСБлокировкой)
		|		И НЕ(
		|			Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
		|			И Таблица.ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1)
		|			И Таблица.ДатаДоступности <> ДАТАВРЕМЯ(1, 1, 1))
		|	ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.ОжидаетсяКПоступлениюНеПодлежитРазблокировке)
		|		И НЕ(
		|			Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
		|			И Таблица.ДатаПоступления <> ДАТАВРЕМЯ(1, 1, 1)
		|			И Таблица.ДатаДоступности = ДАТАВРЕМЯ(1, 1, 1))
		|	ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НаСогласованииПоставки)
		|		И НЕ(
		|			Таблица.ЗаказНаПоступление <> НЕОПРЕДЕЛЕНО
		|			И Таблица.ДатаПоступления = ДАТАВРЕМЯ(1, 1, 1)
		|			И Таблица.ДатаДоступности = ДАТАВРЕМЯ(1, 1, 1))
		|	ИЛИ Таблица.СостояниеЗапаса = ЗНАЧЕНИЕ(Перечисление.СостоянияЗапаса.НеОбеспечен)
		|		И НЕ(
		|			Таблица.ЗаказНаПоступление = НЕОПРЕДЕЛЕНО
		|			И Таблица.ДатаПоступления = ДАТАВРЕМЯ(1, 1, 1)
		|			И Таблица.ДатаДоступности = ДАТАВРЕМЯ(1, 1, 1))

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

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

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

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

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

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

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

Процедура ДобавитьИндекс(Текст, Поля)
	
	ТекстыСИндексированием = Новый Массив();
	ТекстыСИндексированием.Добавить(Текст);
	Текст =
		"ИНДЕКСИРОВАТЬ ПО
		|	Поля"; //@Query-part
	ТекстыСИндексированием.Добавить(СтрЗаменить(Текст, "Поля", Поля));
	Текст = СтрСоединить(ТекстыСИндексированием, Символы.ПС);
	
КонецПроцедуры

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

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

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

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

Функция РаспределениеЗапасовПоТоварам(Запрос, ИмяТаблицыТовары, ВсеТовары, ИменаРегистров, ИмяТаблицыРеестрДокументов = Неопределено, ИмяТаблицыКорректировки = Неопределено)
	
	ВременныеТаблицыДанныхРегистров(Запрос, ИмяТаблицыТовары, ИменаРегистров, ИмяТаблицыРеестрДокументов, ИмяТаблицыКорректировки);
	Если СтрНайти(ИменаРегистров, "РаспределениеЗапасов") > 0 Тогда
		ДобавитьВременнуюТаблицуЗапасыЗаблокированные(Запрос);
	КонецЕсли;
	Результат = РезультатРаспределенияЗапасов(Запрос, ИмяТаблицыТовары, ВсеТовары, ИменаРегистров); // Структура
	Возврат Результат;
	
КонецФункции

Процедура СообщитьОНеудачнойОбработкеНоменклатуры(ИнформацияОбОшибке, ТекстСообщения)
	
	ТекстСообщения = НСтр("ru = 'Задание распределения запасов завершилось неудачно по причине: %Причина%'");
	ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Причина%", ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
	СобытиеЖурнала = НСтр("ru = 'Распределение запасов'", ОбщегоНазначения.КодОсновногоЯзыка());
	ЗаписьЖурналаРегистрации(СобытиеЖурнала,
	УровеньЖурналаРегистрации.Ошибка, Метаданные.РегистрыСведений.РаспределениеЗапасов,, ТекстСообщения);
	
КонецПроцедуры

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