Формирование заказов на сборку (разборку) по плану / Форма / Модуль формы

файл
#Область ОписаниеПеременных

&НаКлиенте
Перем КэшированныеЗначения; //используется механизмом обработки изменения реквизитов ТЧ

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	УстановитьУсловноеОформление();
	
	Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа.
		Возврат;
	КонецЕсли;

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура РежимРасчетаПотребностейПоПлануПриИзменении(Элемент)
	
	РежимРасчетаПотребностейПоПлануПриИзмененииНаСервере();
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПериодНачалоПриИзменении(Элемент)
	
	ПривестиДатыКПериодичностиСценария(ЭтотОбъект, Объект.ПериодНачало, Объект.ПериодОкончание);
	
КонецПроцедуры

&НаКлиенте
Процедура ПериодОкончаниеПриИзменении(Элемент)
	
	ПривестиДатыКПериодичностиСценария(ЭтотОбъект, Объект.ПериодНачало, Объект.ПериодОкончание);
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ФормированиеЗаказовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ФормированиеЗаказовПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ФормированиеЗаказовКоличествоВЗаказахНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ФормированиеЗаказовКоличествоВЗаказахОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ФормированиеЗаказовКоличествоВПланахНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

&НаКлиенте
Процедура ФормированиеЗаказовКоличествоВПланахОчистка(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ФормированиеЗаказовСкладНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	СтрокаТаблицы = Объект.ФормированиеЗаказов.НайтиПоИдентификатору(Элементы.ФормированиеЗаказов.ВыделенныеСтроки[0]);

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

&НаКлиенте
Процедура ФормированиеЗаказовСкладОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	СтрокаТаблицы = Объект.ФормированиеЗаказов.НайтиПоИдентификатору(Элементы.ФормированиеЗаказов.ВыделенныеСтроки[0]);

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтаФорма, Команда);
	
КонецПроцедуры

#Область КомандыТаблицыФормыФормированиеЗаказов

&НаКлиенте
Процедура СнятьФлажки(Команда)
	
	ПереключитьФлажки(Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФлажки(Команда)
	
	ПереключитьФлажки(Истина);
	
КонецПроцедуры

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

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

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

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

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

#Область КомандыПошаговогоМастера

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

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

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

&НаКлиенте
Процедура ЗавершитьФормированиеЗаказов(Команда)
	
	ОчиститьСообщения();
	Объект.ФормированиеЗаказов.Очистить();
	СформированныеЗаказы.Очистить();
	
	Элементы.СтраницыОсновнаяПанель.ТекущаяСтраница = Элементы.СтраницаШаг1;
	УстановитьЗаголовокФормы(Элементы.СтраницыОсновнаяПанель.ТекущаяСтраница);
	УстановитьВидимостьКнопокКоманднойПанели(Элементы.СтраницыОсновнаяПанель.ТекущаяСтраница);
	
КонецПроцедуры

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

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

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

#Область НастройкиОтображенияФормы

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ФормированиеЗаказовСклад.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ФормированиеЗаказов.РедактироватьСклад");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
	Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ФормированиеЗаказовВариантКомплектации.Имя);
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ФормированиеЗаказовСклад.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ОтметкаНезаполненного", Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьЗаголовокФормы(Страница)
	
	Если Страница = Элементы.СтраницаШаг1 Тогда
		
		Элементы.ПодЗаголовок.Заголовок = НСтр("ru = 'Шаг 1 из 3. Отбор планов'");
		
	ИначеЕсли Страница = Элементы.СтраницаШаг2 Тогда
		
		Элементы.ПодЗаголовок.Заголовок = НСтр("ru = 'Шаг 2 из 3. Определение состава и объема заказа'");
		
	ИначеЕсли Страница = Элементы.СтраницаШаг3 Тогда
		
		Элементы.ПодЗаголовок.Заголовок = НСтр("ru = 'Шаг 3 из 3. Уточнение сформированных заказов'");
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьВидимостьЭлементовФормы()
	
	Элементы.ФормированиеЗаказовПеренестиРаспределить.Видимость = Периодичность <> Перечисления.Периодичность.День;
	Элементы.ФормированиеЗаказовКонтекстноеМенюПеренестиРаспределить.Видимость = Периодичность <> Перечисления.Периодичность.День;
	
КонецПроцедуры

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

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

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

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

#Область ПроцедурыРаботыСНастройкамиПользователя

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

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

&НаСервереБезКонтекста
Процедура СохранитьНастройкиНаСервере(Настройки)
	
	КлючОбъекта = "Обработка.ФормированиеЗаказовНаСборкуРазборкуПоПлану";
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(КлючОбъекта, "Настройки", Настройки);
	
КонецПроцедуры

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

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

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

#Область ПроцедурыОбработчикиКомандЗавершение

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

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

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

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

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

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

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

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

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

#Область ПроцедурыПолученияПлановИЗаказов

&НаСервере
Функция СписокПлановПоСтроке(КлючСтроки)

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

&НаСервере
Функция СписокПлановНарастающимИтогомПоСтроке(КлючСтроки)

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

&НаСервере
Функция СписокЗаказовПоСтроке(КлючСтроки)

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

		КлючСтроки.Удалить("Склад");
		КлючСтроки.Удалить("КонецДняДатаОкончанияСборки");
		КлючСтроки.Удалить("НачалоПериодаСборки");
		КлючСтроки.Вставить("РедактироватьСклад", Ложь);
		
		НайденныеСтроки = ТаблицаФормированиеЗаказов.НайтиСтроки(КлючСтроки);
		Для Каждого Строка Из НайденныеСтроки Цикл
			СкладыПоКоторымЕстьПланы.Добавить(Строка.Склад);
		КонецЦикла;
		
	КонецЕсли;
	
	Запрос.УстановитьПараметр("СкладыПоКоторымЕстьПланы", СкладыПоКоторымЕстьПланы);
	Запрос.УстановитьПараметр("ПланированиеПоНазначениям", ПланированиеПоНазначениям);
	
	Выборка = Запрос.Выполнить().Выбрать();
	СписокДокументов = Новый СписокЗначений();
	Пока Выборка.Следующий() Цикл
		
		ДокументПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 (№ %2 от %3)'"), 
				Формат(Выборка.Количество, "ЧДЦ=3"), Выборка.НомерДокумента, 
				Формат(Выборка.ДатаДокумента, "ДЛФ=D"));
		СписокДокументов.Добавить(Выборка.Документ, ДокументПредставление);
		
	КонецЦикла;
	
	Возврат СписокДокументов;
	
КонецФункции

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

&НаКлиенте
Процедура ВыборДокументаПланаИзСписка(РезультатВыбора, ДополнительныеПараметры) Экспорт 

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

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

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

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

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

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

#Область СозданиеУдалениеЗаказов

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОбновитьДанныеКогдаФормаСтанетАктивной()

	ПодключитьОбработчикОжидания("Подключаемый_ОбновитьДанныеКогдаФормаСтанетАктивной", 0.1, Истина);

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

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

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

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

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

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

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

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




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