Заполнение корректировки назначения / Форма объекта / Модуль формы

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

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

	ЦветОтрицательногоЧисла = ЦветаСтиля.ЦветОтрицательногоЧисла;
	ЦветТекстаПоля = ЦветаСтиля.ЦветТекстаПоля;

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

	Элементы.ТолькоЗаказыОрганизации.Заголовок = СтрЗаменить(
		НСтр("ru = 'Только заказы организации ""%1""'"), "%1", Организация);

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ДалееНаКлиенте(Истина);
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовФормы

&НаКлиенте
Процедура ТумблерСнятьРезервыПриИзменении(Элемент)
	СнятьРезервы(Неопределено);
КонецПроцедуры

&НаКлиенте
Процедура ТолькоЗаказыОрганизацииПриИзменении(Элемент)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.ЗамерВремени("Обработка.ЗаполнениеКорректировкиНазначения.ФормаОбъекта.Элемент.ТолькоЗаказыОрганизации.ПриИзменении");
	
	ТолькоЗаказыОрганизацииПриИзмененииСервер();
	
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаТовары

&НаКлиенте
Процедура ТаблицаТоварыСтрокаВыбранаПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.ТаблицаТовары.ТекущиеДанные;
	
	Если ТекущаяСтрока.ИндексСтраницы = 0 Тогда
		ПересчитатьКоличествоДляИндексСтраницы1 = Истина;
	КонецЕсли;
	
	ПерезаполнитьКоличествоВТаблицеИтогов();
	РассчитатьИтогиПоЗаказу();
	ЗаполнитьТребуетсяШагПоПомещениямЯчейкамВСтроке(ТекущаяСтрока);
	ДалееНаКлиенте(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаТоварыКоличествоПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.ТаблицаТовары.ТекущиеДанные;
	ТекущаяСтрока.Отметка = ТекущаяСтрока.Количество > 0;
	
	Если ТекущаяСтрока.ИндексСтраницы = 0 Тогда
		ПересчитатьКоличествоДляИндексСтраницы1 = Истина;
	КонецЕсли;
	
	ПерезаполнитьКоличествоВТаблицеИтогов();
	РассчитатьИтогиПоЗаказу();
	ЗаполнитьТребуетсяШагПоПомещениямЯчейкамВСтроке(ТекущаяСтрока);
	ДалееНаКлиенте(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.ЗамерВремени("Обработка.ЗаполнениеКорректировкиНазначения.ФормаОбъекта.Элемент.ТаблицаТовары.ПриАктивизацииСтроки");
	
	ПодключитьОбработчикОжидания("Подключаемый_ПриАктивизацииСтроки", 0.1, Истина);
	
КонецПроцедуры

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

#Область ОбработчикиСобытийЭлементовДереваПомещенияИЯчейки

&НаКлиенте
Процедура ДеревоПомещенияЯчейкиКоличествоВетвьПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.ДеревоПомещенияЯчейки.ТекущиеДанные;
	
	СтруктураПересчетаЕдиниц = Новый Структура();
	СтруктураПересчетаЕдиниц.Вставить("ПересчитатьКоличествоЕдиниц");
	
	ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураПересчетаЕдиниц, Неопределено);
	
	ТекущаяСтрока.Отметка = ТекущаяСтрока.Количество > 0;
	
КонецПроцедуры

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

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ВидОперацииПереключательПриИзменении(Элемент)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.ЗамерВремени("Обработка.ЗаполнениеКорректировкиНазначения.ФормаОбъекта.Элемент.ВидОперацииПереключатель.ПриИзменении");
	
	ВидОперацииПереключательПриИзмененииНаСервере();
	ДалееНаКлиенте(Истина);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ВыбратьСтроки(Команда)
	
	ОтметитьСтроки(Истина);
	РассчитатьИтогиПоЗаказу();
	ДалееНаКлиенте(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ИсключитьСтроки(Команда)
	
	ОтметитьСтроки(Ложь);
	РассчитатьИтогиПоЗаказу();
	ДалееНаКлиенте(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура СнятьРезервы(Команда)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.ЗамерВремени("Обработка.ЗаполнениеКорректировкиНазначения.ФормаОбъекта.Команда.СнятьВсеРезервы");
	
	СнятьРезервыСервер();
	РассчитатьИтогиПоЗаказу();
	ДалееНаКлиенте(Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ФильтрОтметкаПриИзменении(Элемент)
	
	Если ФильтрОтметка Тогда
		СтруктураОтбора = Новый Структура("Отметка", ФильтрОтметка);
	Иначе
		СтруктураОтбора = Новый Структура();
	КонецЕсли;
	УстановитьОтборСтрокТаблицаТовары(Элементы, СтруктураОтбора);
	
КонецПроцедуры

&НаКлиенте
Процедура Далее(Команда)
	
	// &ЗамерПроизводительности
	ОценкаПроизводительностиКлиент.ЗамерВремени("Обработка.ЗаполнениеКорректировкиНазначения.ФормаОбъекта.Команда.Далее");
	
	ОчиститьСообщения();
	ДалееНаКлиенте(Ложь);
	ДалееНаКлиенте(Истина);
	
КонецПроцедуры

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

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

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

#Область УправлениеВидимостью

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

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

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

&НаСервере
Функция НаименованиеШагаУказаниеСерийПомещенийЯчеекПоФункциональнымОпциям()
	
	Текст = "";
	Если ПолучитьФункциональнуюОпцию("ИспользоватьСерииНоменклатуры") Тогда
		
		Если ПолучитьФункциональнуюОпцию("ИспользоватьАдресноеХранение") Тогда
				Текст = НСтр("ru = 'Указание серий / помещений / ячеек'");
		ИначеЕсли ПолучитьФункциональнуюОпцию("ИспользоватьСкладскиеПомещения") Тогда
				Текст = НСтр("ru = 'Указание серий / помещений'");
		Иначе
				Текст = НСтр("ru = 'Указание серий'");
		КонецЕсли;
		
	ИначеЕсли ПолучитьФункциональнуюОпцию("ИспользоватьАдресноеХранение") Тогда
		Текст = НСтр("ru = 'Указание помещений / ячеек'");
	Иначе
		Текст = НСтр("ru = 'Указание помещений'");
	КонецЕсли;
	
	Возврат Текст;
	
КонецФункции

&НаСервере
Процедура НастроитьЭлементыФормыПоВидуОперации()

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

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

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

&НаСервере
Процедура НастроитьЭлементыПоШагуМногихНазначений()
	
	Если НесколькоНазначений Тогда
		
		Если Элементы.ТаблицаТовары.ОтборСтрок.ИндексСтраницы = 0 Тогда
			
			Видимость = ВидОперации = Перечисления.ВидыОперацийКорректировкиНазначения.РезервироватьИКорректировать;
			Элементы.ТаблицаТоварыИсходныйЗаказРезервирование.Видимость = Видимость И Не МогутБытьНазначенияБезЗаказа;
			Элементы.ТаблицаТоварыИсходноеНазначениеРезервирование.Видимость = Видимость И МогутБытьНазначенияБезЗаказа;
			Элементы.ТаблицаТоварыНовыйЗаказ.Видимость = Ложь;
			Элементы.ТаблицаТоварыНовоеНазначение.Видимость = Ложь;
			Элементы.ТаблицаТоварыВНаличииСтрока.Видимость = Ложь;
			Элементы.ТаблицаТоварыПотребностьСтрока.Видимость = Ложь;
			Элементы.ТаблицаТоварыОбеспеченоСтрока.Видимость = Ложь;
			Элементы.ГруппаЗаказ.Видимость = Истина;
			Элементы.ГруппаШапкаНесколькоНазначений.Видимость = Истина;
			Элементы.ГруппаПереключателиНесколькоНазначений.Видимость = Истина;
			Элементы.ГруппаСтраницыПодвалНесколькоНазначений.ТекущаяСтраница =
				Элементы.ГруппаСтраницаПодвалНесколькоНазначенийНеИспользуется;
			Элементы.ТаблицаТоварыСклад.Видимость = Истина;
			
			Элементы.ТаблицаТоварыВНаличии.Видимость = Истина;
			Элементы.ТаблицаТоварыВРезерве.Видимость = Истина;
			Элементы.ТаблицаТоварыКартинкаИзлишекИсточника.Видимость = Истина;
			Элементы.ТаблицаТоварыПотребность.Видимость = Истина;
			Элементы.ГруппаИнформацияПоИсточникамОбеспечения.Видимость = ИспользоватьНесколькоСкладов;
			
		Иначе
			
			Элементы.ТаблицаТоварыИсходныйЗаказРезервирование.Видимость = Ложь;
			Элементы.ТаблицаТоварыИсходноеНазначениеРезервирование.Видимость = Ложь;
			Элементы.ТаблицаТоварыНовыйЗаказ.Видимость = Не МогутБытьНазначенияБезЗаказа;
			Элементы.ТаблицаТоварыНовоеНазначение.Видимость = МогутБытьНазначенияБезЗаказа;
			Элементы.ТаблицаТоварыВНаличииСтрока.Видимость = Истина;
			Элементы.ТаблицаТоварыПотребностьСтрока.Видимость = Истина;
			Элементы.ТаблицаТоварыОбеспеченоСтрока.Видимость = Истина;
			Элементы.ГруппаЗаказ.Видимость = Ложь;
			Элементы.ГруппаШапкаНесколькоНазначений.Видимость = Ложь;
			Элементы.ГруппаПереключателиНесколькоНазначений.Видимость = Ложь;
			Элементы.ГруппаСтраницыПодвалНесколькоНазначений.ТекущаяСтраница =
				Элементы.ГруппаСтраницаПодвалНесколькоНазначений;
			Элементы.ТаблицаТоварыСклад.Видимость = Ложь;
			
			Элементы.ТаблицаТоварыВНаличии.Видимость = Ложь;
			Элементы.ТаблицаТоварыВРезерве.Видимость = Ложь;
			Элементы.ТаблицаТоварыКартинкаИзлишекИсточника.Видимость = Ложь;
			Элементы.ТаблицаТоварыПотребность.Видимость = Ложь;
			Элементы.ГруппаИнформацияПоИсточникамОбеспечения.Видимость = Ложь;
			
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

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

#Область КомандыФормыНаСервере

&НаСервере
Процедура ТолькоЗаказыОрганизацииПриИзмененииСервер()
	НастроитьЭлементыФормыПоВидуОперации();
	ЗаполнитьТаблицу();
КонецПроцедуры

&НаСервере
Процедура ВидОперацииПереключательПриИзмененииНаСервере()
	
	ВидОперации = ?(ВидОперацииПереключатель, ПредопределенноеЗначение("Перечисление.ВидыОперацийКорректировкиНазначения.РезервироватьИКорректировать"), 
		ПредопределенноеЗначение("Перечисление.ВидыОперацийКорректировкиНазначения.Резервировать"));
	
	ЗаполнитьТаблицу();
	НастроитьЭлементыФормыПоВидуОперации();
	
КонецПроцедуры

&НаСервере
Процедура РежимПриИзмененииНаСервере()
	
	ЗаполнитьТаблицу();
	
КонецПроцедуры

&НаСервере
Процедура ОтметитьСтроки(Значение)

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

	Если ПараметрыОтбора.ИндексСтраницы = 0 Тогда
		ПересчитатьКоличествоДляИндексСтраницы1 = Истина;
	КонецЕсли;
	
	ПерезаполнитьКоличествоВТаблицеИтогов();
	ЗаполнитьТребуетсяШагПоПомещениямЯчейкам();

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

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

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

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

#Область ПереходМеждуШагами

&НаКлиенте
Процедура ДалееНаКлиенте(ТолькоНастройкаКнопок)
	
	НесколькоДокументов = НесколькоНазначений
		И (ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийКорректировкиНазначения.Резервировать")
			Или ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийКорректировкиНазначения.РезервироватьИКорректировать"));
	
	Если Не ТолькоНастройкаКнопок Тогда
		ОчиститьСообщения();
	КонецЕсли;
	
	Если ИспользуетсяШагВстречнойКорректировки Тогда // встречная корректировка
		
		Если Элементы.Шаги.ТекущаяСтраница = Элементы.ШагПоСкладам
			И Элементы.ТаблицаТовары.ОтборСтрок.ИндексСтраницы = 0 Тогда // Шаг 1.
			
			Если ТолькоНастройкаКнопок Тогда
				Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаПередатьПоВстречнойКорректировке;
				НастроитьКнопкиШагов("Отмена", "Далее");
				Возврат;
			КонецЕсли;
			
			ДалееКВстречнойКорректировке();
			
		ИначеЕсли Элементы.Шаги.ТекущаяСтраница = Элементы.ШагПоСкладам
			И Элементы.ТаблицаТовары.ОтборСтрок.ИндексСтраницы = 1 Тогда // Шаг 2.
			
			Если ТолькоНастройкаКнопок Тогда
				Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаРаспределитьИзПодНазначенияПоВстречнойКорректировке;
			КонецЕсли;
			
			Если ТаблицаТовары.Итог("ТребуетсяШагПоПомещениямЯчейкам") > 0 Тогда
				
				Если ТолькоНастройкаКнопок Тогда
					НастроитьКнопкиШагов("Назад", "Далее");
					Возврат;
				КонецЕсли;
				ДалееКПомещениямИЯчейкам();
				
			Иначе
				
				Если ТолькоНастройкаКнопок Тогда
					НастроитьКнопкиШагов("Назад", "Создать");
					Возврат;
				КонецЕсли;
				ДалееКСозданиюДокумента();
				
			КонецЕсли;
			
		ИначеЕсли Элементы.Шаги.ТекущаяСтраница = Элементы.ШагПоПомещениямЯчейкам Тогда // Шаг 3.
			
			Если ТолькоНастройкаКнопок Тогда
				Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаУказаниеСерийПомещенийЯчеек;
				НастроитьКнопкиШагов("Назад", "Создать");
				Возврат;
			КонецЕсли;
			
			ДалееКСозданиюДокументаИзПомещенийИЯчеек();
			
		ИначеЕсли Элементы.Шаги.ТекущаяСтраница = Элементы.ШагСозданныеДокументы Тогда
			
			Если ТолькоНастройкаКнопок Тогда
				Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаСозданныеДокументы;
				НастроитьКнопкиШагов("Назад", "Закрыть");
				Возврат;
			КонецЕсли;
			
			Закрыть();
			
		КонецЕсли;
		
	ИначеЕсли НесколькоДокументов Тогда // резервирование с двумя шагами
		
		Если Элементы.Шаги.ТекущаяСтраница = Элементы.ШагПоСкладам
			И Элементы.ТаблицаТовары.ОтборСтрок.ИндексСтраницы = 0 Тогда // Шаг 1
			
			Если ТолькоНастройкаКнопок Тогда
				Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаКРезервированиюПоЗаказуВсего;
				НастроитьКнопкиШагов("Отмена", "Далее");
				Возврат;
			КонецЕсли;
			
			ДалееКМногимНазначениям();
			
		ИначеЕсли Элементы.Шаги.ТекущаяСтраница = Элементы.ШагПоСкладам
			И Элементы.ТаблицаТовары.ОтборСтрок.ИндексСтраницы = 1 Тогда // Шаг 2
			
			Если ТолькоНастройкаКнопок Тогда
				Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаРезервыПоНазначениямЗаказаУточнение;
			КонецЕсли;
			
			Если ТаблицаТовары.Итог("ТребуетсяШагПоПомещениямЯчейкам") > 0 Тогда
				
				Если ТолькоНастройкаКнопок Тогда
					НастроитьКнопкиШагов("Назад", "Далее");
					Возврат;
				КонецЕсли;
				
				ДалееКПомещениямИЯчейкам();
				
			Иначе
				
				Если ТолькоНастройкаКнопок Тогда
					НастроитьКнопкиШагов("Назад", "СоздатьНесколько");
					Возврат;
				КонецЕсли;
				
				ДалееКСозданиюДокументов();
				
			КонецЕсли;
			
		ИначеЕсли Элементы.Шаги.ТекущаяСтраница = Элементы.ШагПоПомещениямЯчейкам Тогда // Шаг 3
			
			Если ТолькоНастройкаКнопок Тогда
				Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаУказаниеСерийПомещенийЯчеек;
				НастроитьКнопкиШагов("Назад", "СоздатьНесколько");
				Возврат;
			КонецЕсли;
			
			ДалееКСозданиюДокументовИзПомещенийИЯчеек();
			
		ИначеЕсли Элементы.Шаги.ТекущаяСтраница = Элементы.ШагСозданныеДокументы Тогда
		
			Если ТолькоНастройкаКнопок Тогда
				Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаСозданныеДокументы;
				НастроитьКнопкиШагов("Назад", "Закрыть");
				Возврат;
			КонецЕсли;
			
			Закрыть();
		
		КонецЕсли;
		
	ИначеЕсли Параметры.Мастер Тогда // обычное резервирование или снятие резерва, вызванное из заказа
		
		Если Элементы.Шаги.ТекущаяСтраница = Элементы.ШагПоСкладам Тогда // Шаг 1.
			
			Если ТолькоНастройкаКнопок Тогда
				Если ВидОперации = ВидОперацииВстречнаяКорректировка Тогда
					Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаПередатьПоВстречнойКорректировке;
				ИначеЕсли ВидОперации = ВидОперацииРезервировать Или ВидОперации = ВидОперацииРезервироватьИКорректировать Тогда
					Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаКРезервированию;
				Иначе
					Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаКСнятиюРезерва;
				КонецЕсли;
			КонецЕсли;
			
			Если ТаблицаТовары.Итог("ТребуетсяШагПоПомещениямЯчейкам") > 0 Тогда
				
				Если ТолькоНастройкаКнопок Тогда
					НастроитьКнопкиШагов("Отмена", "Далее");
					Возврат;
				КонецЕсли;
				
				ДалееКПомещениямИЯчейкам();
				
			Иначе
				
				Если ТолькоНастройкаКнопок Тогда
					НастроитьКнопкиШагов("Отмена", "Создать");
					Возврат;
				КонецЕсли;
				
				ДалееКСозданиюДокумента();
				
			КонецЕсли;
			
		ИначеЕсли Элементы.Шаги.ТекущаяСтраница = Элементы.ШагПоПомещениямЯчейкам Тогда // Шаг 2.
		
			Если ТолькоНастройкаКнопок Тогда
				Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаУказаниеСерийПомещенийЯчеек;
				НастроитьКнопкиШагов("Назад", "Создать");
				Возврат;
			КонецЕсли;
			
			ДалееКСозданиюДокументаИзПомещенийИЯчеек();
			
		ИначеЕсли Элементы.Шаги.ТекущаяСтраница = Элементы.ШагСозданныеДокументы Тогда
			
			Если ТолькоНастройкаКнопок Тогда
				Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаСозданныеДокументы;
				НастроитьКнопкиШагов("Назад", "Закрыть");
				Возврат;
			КонецЕсли;
			
			Закрыть();
			
		КонецЕсли;
		
	Иначе // обычное резервирование или снятие резерва по команде заполнить из документа Корректировка назначения товаров
		
		Если Элементы.Шаги.ТекущаяСтраница = Элементы.ШагПоСкладам Тогда // Шаг 1.
			
			Если ТолькоНастройкаКнопок Тогда
				Если ВидОперации = ВидОперацииРезервировать Или ВидОперации = ВидОперацииРезервироватьИКорректировать Тогда
					Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаКРезервированию;
				Иначе
					Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаКСнятиюРезерва;
				КонецЕсли;
			КонецЕсли;
			
			Если ТаблицаТовары.Итог("ТребуетсяШагПоПомещениямЯчейкам") > 0 Тогда
				
				Если ТолькоНастройкаКнопок Тогда
					НастроитьКнопкиШагов("Отмена", "Далее");
					Возврат;
				КонецЕсли;
				
				ДалееКПомещениямИЯчейкам();
				
			Иначе
				
				Если ТолькоНастройкаКнопок Тогда
					НастроитьКнопкиШагов("Отмена", "Перенести");
					Возврат;
				КонецЕсли;
				
					ДалееКПереносуВДокумент();
				
			КонецЕсли;
			
		ИначеЕсли Элементы.Шаги.ТекущаяСтраница = Элементы.ШагПоПомещениямЯчейкам Тогда // Шаг 2.
		
			Если ТолькоНастройкаКнопок Тогда
				Элементы.СтраницыНаименованиеШага.ТекущаяСтраница = Элементы.СтраницаНаименованиеШагаУказаниеСерийПомещенийЯчеек;
				НастроитьКнопкиШагов("Назад", "Перенести");
				Возврат;
			КонецЕсли;
			
			ДалееКПереносуВДокументИзПомещенийИЯчеек();
			
		КонецЕсли;
		
	КонецЕсли;

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

&НаКлиенте
Процедура НастроитьКнопкиШагов(КодНазад, КодДалее)
	
	КомандаОтмена = Элементы.Отмена;
	КомандаДалее = Элементы.Далее;
	
	Если КодНазад = "Отмена" Тогда
		КомандаОтмена.Заголовок = НСтр("ru = 'Отмена'");
	ИначеЕсли КодНазад = "Назад" Тогда
		КомандаОтмена.Заголовок = НСтр("ru = '< Назад'");
	КонецЕсли;
		 
	Если КодДалее = "Далее" Тогда
		КомандаДалее.Заголовок = НСтр("ru = 'Далее >'");
		Элементы.ТекстБудетСозданаКорректировка.Видимость = Ложь;
	ИначеЕсли КодДалее = "Создать" Тогда
		КомандаДалее.Заголовок = НСтр("ru = 'Создать документ'");
		Элементы.ТекстБудетСозданаКорректировка.Видимость = Истина;
	ИначеЕсли КодДалее = "СоздатьНесколько" Тогда
		КомандаДалее.Заголовок = НСтр("ru = 'Создать документы'");
	ИначеЕсли КодДалее = "Перенести" Тогда
		КомандаДалее.Заголовок = НСтр("ru = 'Перенести в документ'");
		Элементы.ТекстБудетСозданаКорректировка.Видимость = Ложь;
	ИначеЕсли КодДалее = "Закрыть" Тогда
		КомандаДалее.Заголовок = НСтр("ru = 'Закрыть'");
		Элементы.ТекстБудетСозданаКорректировка.Видимость = Ложь;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДалееКВстречнойКорректировке()

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

&НаКлиенте
Процедура ДалееКМногимНазначениям()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Функция ДалееКПомещениямИЯчейкамСервер(Ошибка)

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ЗаполнитьТребуетсяШагПоПомещениямЯчейкам()
	
	Для Каждого Строка Из ТаблицаТовары Цикл
		ЗаполнитьТребуетсяШагПоПомещениямЯчейкамВСтроке(Строка);
	КонецЦикла; 
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьТребуетсяШагПоПомещениямЯчейкамВСтроке(Строка)

	Строка.ТребуетсяШагПоПомещениямЯчейкам = ?(
		(Строка.ИспользованиеПомещенийЯчеек Или Строка.ИспользованиеСерий)
			И Строка.Отметка И Строка.Количество > 0, 1, 0);

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

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

&НаСервере
Функция ЕстьВыбранныеСтрокиТовары()
	
	Результат = Ложь;
	Для Каждого Строка Из ТаблицаТовары Цикл
		Если Строка.ИндексСтраницы = 0 И Строка.Отметка И Строка.Количество > 0 Тогда
			Результат = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;
	
КонецФункции

&НаКлиенте
Процедура ОтменаЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	ОтветНаВопрос = РезультатВопроса;
	Если ОтветНаВопрос = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;
	
	Закрыть();
	
КонецПроцедуры

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

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

#Область ЗаполнениеТаблиц

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

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

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

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

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

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

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

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

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

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

#Область ИтогиПоТаблицеТовары

&НаКлиенте
Процедура Подключаемый_ПриАктивизацииСтроки()
	
	РассчитатьИтогиПоЗаказу();
	
КонецПроцедуры

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

&НаСервере
Процедура ПривязатьСтрокиТаблицыКТаблицеИтогов(Таблица, Итоги, ГруппировкаСтрок, ИмяКолонки)
	
	ПараметрыОтбораТоваров = Новый Структура(ГруппировкаСтрок);
	Для Каждого Строка Из Итоги Цикл
		ЗаполнитьЗначенияСвойств(ПараметрыОтбораТоваров, Строка);
		НайденныеСтрокиТоваров = Таблица.НайтиСтроки(ПараметрыОтбораТоваров);
		ИдентификаторСтрокиИтогов = Строка.ПолучитьИдентификатор();
		Для Каждого СтрокаТоваров Из НайденныеСтрокиТоваров Цикл
			СтрокаТоваров[ИмяКолонки] = ИдентификаторСтрокиИтогов;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры

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

&НаСервере
Процедура ЗаполнитьКартинкуИзлишекИсточника()
	
	Для Каждого Строка Из ТаблицаТовары Цикл
		Если Строка.ВидОперации = Перечисления.ВидыОперацийКорректировкиНазначения.Резервировать Тогда
			СтрокаИтоговИсточника = ИтогиИсточниковОбеспечения.НайтиПоИдентификатору(Строка.ИдентификаторСтрокиИтоговИсточника);
			Строка.КартинкаИзлишекИсточника = ?(СтрокаИтоговИсточника.Запас > СтрокаИтоговИсточника.Потребность, 0, 1);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

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

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

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

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

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

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

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