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

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

&НаКлиенте
Перем КэшированныеЗначения;

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

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

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

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

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

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

&НаКлиенте
Процедура УчитыватьПрошлыеЗаказыПриИзменении(Элемент)
	
	УчитыватьПрошлыеЗаказыПриИзмененииНаСервере();
	
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура ПолуфабрикатыИМатериалыВыбранПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.ПолуфабрикатыИМатериалы.ТекущиеДанные;
	
	Если ТекущиеДанные.Выбран = 2 Тогда
		ТекущиеДанные.Выбран = 0;
	КонецЕсли;
	
	ВыбранПриИзмененииНаСервере(ТекущиеДанные.ПолучитьИдентификатор());
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПолуфабрикатыИМатериалыПриИзменении(Элемент)
	
	ОбновитьМатериалы = Истина;
	ОбновитьЗаказы = Истина;
	
	Если ЗаказыСформированы Тогда
		УдалитьСформированныеДокументы();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура МатериалыПриИзменении(Элемент)
	
	ОбновитьЗаказы = Истина;
	Если ЗаказыСформированы Тогда
		УдалитьСформированныеДокументы();
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура МатериалыНачалоОтгрузкиПриИзменении(Элемент)
	
	ТекущиеДанные = Элементы.Материалы.ТекущиеДанные;
	
	Если ТекущиеДанные.НачалоОтгрузки < НачалоТекущегоДня Тогда
		ТекущиеДанные.НачалоОтгрузки = НачалоТекущегоДня;
	КонецЕсли;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ВыбратьСтроки(Команда)
	
	Строки = ПолуфабрикатыИМатериалы.ПолучитьЭлементы();
	Если Строки.Количество() > 0 Тогда
		ОбновитьМатериалы = Истина;
		ВыбратьИсключитьВыделенныеСтроки(1);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ИсключитьСтроки(Команда)
	
	Строки = ПолуфабрикатыИМатериалы.ПолучитьЭлементы();
	Если Строки.Количество() > 0 Тогда
		ОбновитьМатериалы = Истина;
		ВыбратьИсключитьВыделенныеСтроки(0);
	КонецЕсли;
	
КонецПроцедуры

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

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

	ИмяТекущейСтраницы = НоваяСтраница.Имя
	
КонецПроцедуры

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

&НаКлиенте
Процедура МатериалыОтметитьКЗаказу(Команда)
	
	ВыделенныеСтроки = Элементы.Материалы.ВыделенныеСтроки;
	ОтметитьМатериалыКЗаказу(Истина, ВыделенныеСтроки);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОбновитьМатериалы(Команда)
	
	ЗаполнитьМатериалыНаСервере();
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьДокументы(Команда)
	УдалитьДокументыНаСервере();
КонецПроцедуры

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

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

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	
	// Отключение видимости служебной строки.
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыИМатериалыВыбран.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыИМатериалыНомерКартинки.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыИМатериалыНоменклатура.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыИМатериалыХарактеристика.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыИМатериалыКоличествоУпаковок.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыИМатериалыУпаковка.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыИМатериалыНоменклатураЕдиницаИзмерения.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыИМатериалыПодразделение.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыИМатериалыПроизводитсяВПроцессе.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыИМатериалыСпецификация.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ПолуфабрикатыИМатериалыГруппаНоменклатура.Имя);

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

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

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

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Текст", НСтр("ru = '<не используется>'"));
	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ЦветНедоступногоТекста);
	#КонецОбласти
	
КонецПроцедуры

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

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

#Область ПостроениеИОбслуживаниеДерева

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

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

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

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

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

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

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

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

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

#Область ЗаполнениеСлужебныхРеквизитовДерева

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

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

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

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

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

#Область ОбслуживаниеСпискаМатериалов

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

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

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

		
	КонецЦикла;
	
	ОбновитьЗаказы = Истина;
	
	Если ЗаказыСформированы Тогда
		УдалитьСформированныеДокументы();
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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