Ресурсные спецификации / Форма элемента / Модуль формы

файл

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

#Область ОсновноеИзделиеСпецификации

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОсновноеИзделиеУпаковкаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ОсновноеИзделиеПроцентБракаПриИзменении(Элемент)
	
	ОбработатьИзменениеДанныхОсновногоИзделия(ЭтотОбъект);
	
КонецПроцедуры

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

#Область СтруктураПроизводственногоПроцесса

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

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

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

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

&НаКлиенте
Процедура ЕстьПромежуточныйВыпускПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ВариантПромежуточногоВыпускаТоварДругогоКачестваПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ВариантПромежуточногоВыпускаНастраиваетсяВручнуюПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

#Область Этапы

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

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

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

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

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

&НаКлиенте
Процедура ЭтапПланироватьРаботуВидовРабочихЦентровПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапПорядокРаботыВидовРабочихЦентровПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапЕдиницаИзмеренияДлительностиЭтапаПриИзменении(Элемент)
	
	Если ПроизводственныйПроцессЭтап.ЕдиницаИзмеренияДлительностиЭтапа.Пустая() Тогда
		ПроизводственныйПроцессЭтап.ЕдиницаИзмеренияДлительностиЭтапа = ЭтапОсновнаяЕдиницаВремениДлительностиЭтапаУББВ;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ЭтапМаршрутнаяКартаПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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

#Область Операции

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

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

&НаКлиенте
Процедура ОперацияНаименованиеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ОперацияНаименованиеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОперацияРабочийЦентрПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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


#Область Прочее

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

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

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

&НаКлиенте
Процедура СкрытьИнформационнуюПанельНажатие(Элемент)
	
	Элементы.ИнформационнаяПанельСтраницы.ТекущаяСтраница = Элементы.ИнформационнаяПанельСтраницаСкрыть;
	
КонецПроцедуры

&НаКлиенте
Процедура ГиперссылкаНадписьОсновноеИзделиеНажатие(Элемент)
	
	СвернутаГруппаОсновноеИзделие = НЕ СвернутаГруппаОсновноеИзделие;
	
	УстановитьСвойстваСворачиваемойГруппы(
		Элементы.ГруппаОсновноеИзделие,
		Элементы.ГиперссылкаНадписьОсновноеИзделие,
		СвернутаГруппаОсновноеИзделие);
	
КонецПроцедуры

&НаКлиенте
Процедура ГиперссылкаНадписьПараметрыПроизводственногоПроцессаНажатие(Элемент)
	
	СвернутаГруппаПараметрыПроизводственногоПроцесса = НЕ СвернутаГруппаПараметрыПроизводственногоПроцесса;
	
	УстановитьСвойстваСворачиваемойГруппы(
		Элементы.ГруппаПараметрыПроизводственногоПроцесса,
		Элементы.ГиперссылкаНадписьПараметрыПроизводственногоПроцесса,
		СвернутаГруппаПараметрыПроизводственногоПроцесса);
	
КонецПроцедуры

&НаКлиенте
Процедура ГиперссылкаНадписьПараметрыНазначенияНажатие(Элемент)
	
	СвернутаГруппаПараметрыНазначения = НЕ СвернутаГруппаПараметрыНазначения;
	
	УстановитьСвойстваСворачиваемойГруппы(
		Элементы.ГруппаПараметрыНазначения,
		Элементы.ГиперссылкаНадписьПараметрыНазначения,
		СвернутаГруппаПараметрыНазначения);
	
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ПродукцияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	ОбработатьВыборПоляВТаблице("Продукция", Поле, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПродукцияПриАктивизацииСтроки(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ПродукцияПередУдалением(Элемент, Отказ)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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

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

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

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

&НаКлиенте
Процедура ПродукцияХарактеристикаПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.Продукция.ТекущаяСтрока;
	
	ПродукцияХарактеристикаПриИзмененииНаСервере(ТекущаяСтрока, КэшированныеЗначения);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ВыходныеИзделияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	ОбработатьВыборПоляВТаблице("ВыходныеИзделия", Поле, СтандартнаяОбработка);
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ВыходныеИзделияПередУдалением(Элемент, Отказ)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ВозвратныеОтходыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	ОбработатьВыборПоляВТаблице("ВозвратныеОтходы", Поле, СтандартнаяОбработка);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ВозвратныеОтходыХарактеристикаПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.ВозвратныеОтходы.ТекущиеДанные;
	
	УправлениеДаннымиОбИзделияхКлиентСервер.ПриИзмененииХарактеристикиВСтрокеСАвтовыбором(ТекущаяСтрока, Объект);
	
КонецПроцедуры

&НаКлиенте
Процедура ВозвратныеОтходыПередУдалением(Элемент, Отказ)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

&НаКлиенте
Процедура ВозвратныеОтходыПослеУдаления(Элемент)
	
	РассчитатьКоличествоВыходныеПобочныеИзделия(ЭтотОбъект);
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ВозвратныеОтходыЭлементПроизводственногоПроцессаОткрытие(Элемент, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	ИмяТЧ = "ВозвратныеОтходы";
	ПроизводственныйПроцессОткрытьФормуЭлемента(Элементы[ИмяТЧ].ТекущиеДанные);
	
КонецПроцедуры

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

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

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

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

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

	ОбработатьВыборПоляВТаблице("МатериалыИУслуги", Поле, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура МатериалыИУслугиПередУдалением(Элемент, Отказ)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

&НаКлиенте
Процедура МатериалыИУслугиОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	ОбработкаВыбораПодборНаСервере(ВыбранноеЗначение);
	
КонецПроцедуры

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

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

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

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

	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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

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

	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура МатериалыИУслугиПроизвестиПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ТрудозатратыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	ОбработатьВыборПоляВТаблице("Трудозатраты", Поле, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ТрудозатратыПередУдалением(Элемент, Отказ)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

&НаКлиенте
Процедура ПромежуточныйВыпускПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ПромежуточныйВыпускПередУдалением(Элемент, Отказ)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ПромежуточныйВыпускВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ПромежуточныйВыпускЭлементПроизводственногоПроцессаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ПромежуточныйВыпускЭлементПроизводственногоПроцессаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ПромежуточныйВыпускЭлементПроизводственногоПроцессаОчистка(Элемент, СтандартнаяОбработка)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ПромежуточныйВыпускЭлементПроизводственногоПроцессаОткрытие(Элемент, СтандартнаяОбработка)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ПромежуточныйВыпускЭлементПроизводственногоПроцессаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ПромежуточныйВыпускЭлементПроизводственногоПроцессаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ЭтапВидыРабочихЦентровПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, ЭтоГруппа, Параметр)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапВидыРабочихЦентровПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапВидыРабочихЦентровПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапВидыРабочихЦентровПередУдалением(Элемент, Отказ)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапВидыРабочихЦентровПослеУдаления(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапВидыРабочихЦентровВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапВидыРабочихЦентровИспользоватьПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапВидыРабочихЦентровВидРабочегоЦентраПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапВидыРабочихЦентровВариантНаладкиПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапВидыРабочихЦентровВремяРаботыПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапВидыРабочихЦентровЕдиницаИзмеренияПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОперацияДопРеквизитыЗначениеМинПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ОперацияДопРеквизитыЗначениеМаксПриИзменении(Элемент)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

// СтандартныеПодсистемы.РаботаСФайлами
&НаКлиенте
Процедура Подключаемый_КомандаПанелиПрисоединенныхФайлов(Команда)
	 РаботаСФайламиКлиент.КомандаУправленияПрисоединеннымиФайлами(ЭтотОбъект, Команда);
КонецПроцедуры
// Конец СтандартныеПодсистемы.РаботаСФайлами

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

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

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

#Область Основное

&НаКлиенте
Процедура ФормаЗаписать(Команда)
	
	ЗаписатьСпецификацию();
	
КонецПроцедуры

&НаКлиенте
Процедура ФормаЗаписатьИЗакрыть(Команда)
	
	Если ЗаписатьСпецификацию() Тогда
		Закрыть();
	КонецЕсли;
	
КонецПроцедуры

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

&НаКлиенте
Процедура КомандаОткрытьСпецификацииИзделия(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаЗаполнитьПоМаршрутнымКартамЭтапов(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

&НаКлиенте
Процедура КомандаУстановитьСтатусДействует(Команда)
	
	УстановитьНовыйСтатусИЗаписать(ПредопределенноеЗначение("Перечисление.СтатусыСпецификаций.Действует"));
	
КонецПроцедуры

&НаКлиенте
Процедура КомандаУстановитьСтатусЗакрыта(Команда)
	
	УстановитьНовыйСтатусИЗаписать(ПредопределенноеЗначение("Перечисление.СтатусыСпецификаций.Закрыта"));
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура Продукция_НастроитьПодборНоменклатуры(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

&НаКлиенте
Процедура УточнениеПримененияНоменклатура(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура УточнениеПримененияХарактеристика(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

#Область Этапы

&НаКлиенте
Процедура ЭтапРассчитатьКоэффициентМаршрутнойКарты(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ЭтапДобавитьАльтернативныйВидРЦ(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

&НаКлиенте
Процедура ЭтапЗаполнитьВидыРабочихЦентров(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

#Область Операции

&НаКлиенте
Процедура ОперацияРассчитатьКоэффициентТехнологическогоПроцесса(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

#Область Продукция

&НаКлиенте
Процедура Продукция_ВставитьСтроки(Команда)
	
	ПолучитьСтрокиИзБуфераОбмена("Продукция", "ВыходныеИзделия");
	
КонецПроцедуры

&НаКлиенте
Процедура Продукция_СкопироватьСтроки(Команда)
	
	СкопироватьСтрокиТЧ("Продукция", "ВыходныеИзделия");
	
КонецПроцедуры

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

#Область ВыходныеИзделия

&НаКлиенте
Процедура ВыходныеИзделия_НастроитьПодборНоменклатуры(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ВыходныеИзделия_НастройкаОтбораПоСвойствамИРасчетаПоФормулам(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ВыходныеИзделия_ЗаполнитьЭтап(Команда)
	
	ЗаполнитьЭтапВСтроках("ВыходныеИзделия");
	
КонецПроцедуры

&НаКлиенте
Процедура ВыходныеИзделия_ВставитьСтроки(Команда)
	
	ПолучитьСтрокиИзБуфераОбмена("ВыходныеИзделия");
	
КонецПроцедуры

&НаКлиенте
Процедура ВыходныеИзделия_СкопироватьСтроки(Команда)
	
	СкопироватьСтрокиТЧ("ВыходныеИзделия");
	
КонецПроцедуры

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

#Область ВозвратныеОтходы

&НаКлиенте
Процедура ВозвратныеОтходы_НастроитьПодборНоменклатуры(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

&НаКлиенте
Процедура ВозвратныеОтходы_ЗаполнитьЭтап(Команда)
	
	ЗаполнитьЭтапВСтроках("ВозвратныеОтходы");
	
КонецПроцедуры

&НаКлиенте
Процедура ВозвратныеОтходы_ЗаполнитьСтатьюКалькуляции(Команда)
	
	ЗаполнитьСтатьюКалькуляцииВСтроках("ВозвратныеОтходы");
	
КонецПроцедуры

&НаКлиенте
Процедура ВозвратныеОтходы_ВставитьСтроки(Команда)
	
	ПолучитьСтрокиИзБуфераОбмена("ВозвратныеОтходы");
	
КонецПроцедуры

&НаКлиенте
Процедура ВозвратныеОтходы_СкопироватьСтроки(Команда)
	
	СкопироватьСтрокиТЧ("ВозвратныеОтходы");
	
КонецПроцедуры

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

#Область МатериалыИУслуги

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

&НаКлиенте
Процедура ВвестиРазрешениеНаЗамену(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура МатериалыИУслуги_НастроитьПодборНоменклатуры(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура МатериалыИУслуги_НастройкаОтбораПоСвойствамИРасчетаПоФормулам(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

	ОткрытьФорму("Обработка.ПодборТоваровВДокументЗакупки.Форма",
			ПараметрыФормы,
			Элементы.МатериалыИУслуги,
			УникальныйИдентификатор,,,,
			РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаКлиенте
Процедура МатериалыИУслуги_ВставитьСтроки(Команда)
	
	ПолучитьСтрокиИзБуфераОбмена("МатериалыИУслуги");
	
КонецПроцедуры

&НаКлиенте
Процедура МатериалыИУслуги_СкопироватьСтроки(Команда)
	
	СкопироватьСтрокиТЧ("МатериалыИУслуги");

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

&НаКлиенте
Процедура МатериалыИУслуги_ЗаполнитьЭтап(Команда)
	
	ЗаполнитьЭтапВСтроках("МатериалыИУслуги");
	
КонецПроцедуры

&НаКлиенте
Процедура МатериалыИУслуги_ЗаполнитьСтатьюКалькуляции(Команда)
	
	ЗаполнитьСтатьюКалькуляцииВСтроках("МатериалыИУслуги");
	
КонецПроцедуры

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

#Область Трудозатраты

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

&НаКлиенте
Процедура Трудозатраты_ЗаполнитьЭтап(Команда)
	
	ЗаполнитьЭтапВСтроках("Трудозатраты");
	
КонецПроцедуры

&НаКлиенте
Процедура Трудозатраты_ЗаполнитьСтатьюКалькуляции(Команда)
	
	ЗаполнитьСтатьюКалькуляцииВСтроках("Трудозатраты");
	
КонецПроцедуры

&НаКлиенте
Процедура Трудозатраты_ВставитьСтроки(Команда)
	
	ПолучитьСтрокиИзБуфераОбмена("Трудозатраты");
	
КонецПроцедуры

&НаКлиенте
Процедура Трудозатраты_СкопироватьСтроки(Команда)
	
	СкопироватьСтрокиТЧ("Трудозатраты");
	
КонецПроцедуры

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

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


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

&НаКлиенте
Процедура ПроизводственныйПроцессРазвернуть(Команда)
	
	ПроизводственныйПроцессСвертка(Ложь)
	
КонецПроцедуры

&НаКлиенте
Процедура ПроизводственныйПроцессПереместитьВверх(Команда)
	
	ПроизводственныйПроцессПереместитьЭлемент(Элементы.ПроизводственныйПроцесс.ТекущиеДанные, -1);
	
КонецПроцедуры

&НаКлиенте
Процедура ПроизводственныйПроцессПереместитьВниз(Команда)
	
	ПроизводственныйПроцессПереместитьЭлемент(Элементы.ПроизводственныйПроцесс.ТекущиеДанные, 1);
	
КонецПроцедуры

&НаКлиенте
Процедура ПроизводственныйПроцессДобавитьЭтап(Команда)
	
	ПроизводственныйПроцессНачатьДобавлениеЭтапа();
	
КонецПроцедуры

&НаКлиенте
Процедура ПроизводственныйПроцессДобавитьОперацию(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ПроизводственныйПроцессДобавитьГруппуОпераций(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

&НаКлиенте
Процедура ПроизводственныйПроцессДобавитьТиповой(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

&НаКлиенте
Процедура ПроизводственныйПроцессСвойстваРазвернуть(Команда)
	
	ПроизводственныйПроцессСвойстваСвертка(Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ПроизводственныйПроцессДополнительныеСведения(Команда)
	
	ПроизводственныйПроцессРедактироватьДопСведения();
	
КонецПроцедуры

&НаКлиенте
Процедура ПроизводственныйПроцессВыделитьВТехнологическийПроцесс(Команда)
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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

#Область УниверсальныеМеханизмы

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

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

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

#Область ЗагрузкаДанныхИзФайла

&НаКлиенте
Процедура МатериалыИУслугиЗагрузитьИзФайла(Команда)
	
	ЗагрузитьИзФайла("МатериалыИУслуги", НСтр("ru = 'Материалы и услуги'"));
	
КонецПроцедуры

&НаКлиенте
Процедура ТрудозатратыЗагрузитьИзФайла(Команда)
	
	ЗагрузитьИзФайла("Трудозатраты", НСтр("ru = 'Трудозатраты'"));
	
КонецПроцедуры

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

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

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

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

#Область УниверсальныеМеханизмы

// СтандартныеПодсистемы.Свойства

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

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

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

// Конец СтандартныеПодсистемы.Свойства

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

#Область РаботаСБуферомОбмена

&НаКлиенте
Процедура СкопироватьСтрокиТЧ(Знач ИмяТЧ, Знач ПутьКДанным = "")

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ПроизводственныйПроцессПриАктивизацииЭлемента()
	
	ПроизводственныйПроцессАктивизацияЭлемента = Истина;
	
	ТекущаяСтрока = Элементы.ПроизводственныйПроцесс.ТекущаяСтрока;
	
	ПроизводственныйПроцессПриАктивизацииЭлементаНаСервере();
	
	Если Элементы.ПроизводственныйПроцесс.ТекущаяСтрока <> ТекущаяСтрока Тогда
		Элементы.ПроизводственныйПроцесс.ТекущаяСтрока = ТекущаяСтрока;
	КонецЕсли;
	
	ПроизводственныйПроцессАктивизацияЭлемента = Ложь;
	
КонецПроцедуры

&НаСервере
Процедура ПроизводственныйПроцессПриАктивизацииЭлементаНаСервере()
	
	КэшЭлементов = ПроизводственныйПроцессПолучитьКэшЭлементов();
	
	ПроизводственныйПроцессЗакэшироватьТекущийЭлемент(КэшЭлементов);
	
	ПроизводственныйПроцессИнициализироватьНовыйЭлемент(КэшЭлементов);
	
	ПроизводственныйПроцессСохранитьКэшЭлементов(КэшЭлементов);
	
КонецПроцедуры

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

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

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

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


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

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

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

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

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


&НаКлиентеНаСервереБезКонтекста
Функция ПроизводственныйПроцессПолучитьНовыйНомер(КоллекцияЭлементов)
	
	НовыйНомер = 1;
	
	Если КоллекцияЭлементов.Количество() > 0 Тогда
		НовыйНомер = КоллекцияЭлементов[КоллекцияЭлементов.Количество()-1].Номер + 1;
	КонецЕсли;
	
	Возврат НовыйНомер;
	
КонецФункции

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

&НаСервере
Процедура ОбновитьРеквизитМногоэтапныйПроизводственныйПроцесс()
	
	МногоэтапныйПроизводственныйПроцесс = ?(ПроизводственныйПроцессКэш.ЭтапКоличество > 1, Истина, Ложь);
	
	Если МногоэтапныйПроизводственныйПроцесс <> Объект.МногоэтапныйПроизводственныйПроцесс Тогда
		
		Объект.МногоэтапныйПроизводственныйПроцесс = МногоэтапныйПроизводственныйПроцесс;
		ПриИзмененииСтруктурыПроизводственногоПроцесса();
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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


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

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

&НаКлиентеНаСервереБезКонтекста
Функция ПроизводственныйПроцессСтрокаВыделена(Форма, ДанныеСтроки, ВыделенныеСтроки)
	
	ИдентификаторСтроки = ДанныеСтроки.ПолучитьИдентификатор();
	Если ВыделенныеСтроки.Найти(ИдентификаторСтроки) <> Неопределено Тогда
		Возврат Истина;
	КонецЕсли;
	
	ДанныеСтрокиРодителя = ДанныеСтроки.ПолучитьРодителя();
	Если ДанныеСтрокиРодителя <> Неопределено Тогда
		Возврат ПроизводственныйПроцессСтрокаВыделена(Форма, ДанныеСтрокиРодителя, ВыделенныеСтроки); // Булево
	Иначе
		Возврат Ложь;
	КонецЕсли;
	
КонецФункции


#Область ОбработкаВыбораЭлементов

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ПредставлениеЭлементаПроизводтвенногоПроцесса(Форма, ДанныеСтроки, АвтоПодбор = Ложь)
	
	Результат = "";
	Шаблон    = ?(АвтоПодбор, "%2 (%1)", "%1 / %2");
	
	Если ТипЗнч(ДанныеСтроки) = Тип("ДанныеФормыЭлементКоллекции") Тогда
		
		Если ЗначениеЗаполнено(ДанныеСтроки.ЭтапРедактирование) Тогда
			Результат = ДанныеСтроки.ЭтапРедактированиеПредставление;
		КонецЕсли;
		
	Иначе
		
		Если ДанныеСтроки.ВидЭлемента = "Этап" Тогда
			
			Результат = ДанныеСтроки.Наименование;
			
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

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

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

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

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

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

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

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

#Область Кэш

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

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

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

&НаСервере
Процедура ПроизводственныйПроцессОчиститьКэшЭлементов()
	
	ПроизводственныйПроцессКэш.АдресДополнительныхДанных = ПоместитьВоВременноеХранилище(Новый Соответствие, УникальныйИдентификатор);
	
КонецПроцедуры

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ПроизводственныйПроцессПолучитьПараметрыПодразделения(Форма, Подразделение)
	
	ПараметрыПодразделений = Форма.ПроизводственныйПроцессКэш.ПараметрыПодразделений; // Соответствие
	ПараметрыПодразделения = ПараметрыПодразделений.Получить(Подразделение);
	
	Если ПараметрыПодразделения = Неопределено Тогда
		
		ПараметрыПодразделения = ПроизводственныйПроцессПолучитьПараметрыПодразделенияНаСервере(Подразделение);
		ПараметрыПодразделений.Вставить(Подразделение, ПараметрыПодразделения);
		
		Форма.ПроизводственныйПроцессКэш.ПараметрыПодразделений = ПараметрыПодразделений;
		
	КонецЕсли;
	
	Возврат ПараметрыПодразделения;
	
КонецФункции

&НаСервереБезКонтекста
Функция ПроизводственныйПроцессПолучитьПараметрыПодразделенияНаСервере(Подразделение)
	
	Возврат ПроизводствоСервер.ПараметрыПроизводственногоПодразделения(Подразделение);
	
КонецФункции

&НаКлиенте
Процедура ОбновитьПараметрыПроизводственногоПодразделения(Подразделение)
	
	ПараметрыПодразделения = ПроизводственныйПроцессКэш.ПараметрыПодразделений.Получить(Подразделение);
	Если ПараметрыПодразделения <> Неопределено Тогда
		ПроизводственныйПроцессКэш.ПараметрыПодразделений.Удалить(Подразделение);
		ПроизводственныйПроцессПолучитьПараметрыПодразделения(ЭтотОбъект, Подразделение);
	КонецЕсли;
	
КонецПроцедуры

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

&НаСервере
Функция ПроизводственныйПроцессДесериализовать(ОбъектСериализованный)
	
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.УстановитьСтроку(ОбъектСериализованный);
	Возврат ПрочитатьXML(ЧтениеXML);
	
КонецФункции

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

#Область ДополнительныеРеквизитыИСведения

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

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

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

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

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

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

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

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

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

#Область РедактированиеДереваЭлементов

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

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ПроизводственныйПроцессСкорректироватьПозициюСтроки(Форма, ДанныеСтроки)
	
	РодительЭлемента       = ПроизводственныйПроцессПолучитьРодителя(Форма, ДанныеСтроки);
	КоллекцияЭлементов     = РодительЭлемента.ПолучитьЭлементы();
	КоличествоЭлементов    = КоллекцияЭлементов.Количество();
	ИндексТекущегоЭлемента = КоллекцияЭлементов.Индекс(ДанныеСтроки);
	
	Пока ИндексТекущегоЭлемента > 0
		И (КоллекцияЭлементов[ИндексТекущегоЭлемента-1].Номер > ДанныеСтроки.Номер
			ИЛИ (КоллекцияЭлементов[ИндексТекущегоЭлемента-1].Номер = ДанныеСтроки.Номер
				И ПроизводственныйПроцессСравнитьСсылки(КоллекцияЭлементов[ИндексТекущегоЭлемента-1].Ссылка, ДанныеСтроки.Ссылка) > 0)) Цикл
		КоллекцияЭлементов.Сдвинуть(ИндексТекущегоЭлемента,-1);
		ИндексТекущегоЭлемента = ИндексТекущегоЭлемента - 1;
	КонецЦикла;
	
	Пока ИндексТекущегоЭлемента < (КоличествоЭлементов - 1)
		И (КоллекцияЭлементов[ИндексТекущегоЭлемента+1].Номер < ДанныеСтроки.Номер
			ИЛИ (КоллекцияЭлементов[ИндексТекущегоЭлемента+1].Номер = ДанныеСтроки.Номер
				И ПроизводственныйПроцессСравнитьСсылки(КоллекцияЭлементов[ИндексТекущегоЭлемента+1].Ссылка, ДанныеСтроки.Ссылка) < 0)) Цикл
		КоллекцияЭлементов.Сдвинуть(ИндексТекущегоЭлемента,1);
		ИндексТекущегоЭлемента = ИндексТекущегоЭлемента + 1;
	КонецЦикла;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПроизводственныйПроцессСравнитьСсылки(Ссылка1, Ссылка2)
	
	СравнениеСсылок = Новый СравнениеЗначений();
	Возврат СравнениеСсылок.Сравнить(Ссылка1, Ссылка2);
	
КонецФункции

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

&НаСервере
Процедура ПроизводственныйПроцессСкорректироватьСчетчикЭлементов(ВидЭлемента, Изменение)
	
	ОписаниеСвойствЭлементов = ПроизводственныйПроцессКэш.ОписаниеСвойствЭлементов; // Соответствие
	СвойстваЭлементов = ОписаниеСвойствЭлементов.Получить(ВидЭлемента);
	
	ПроизводственныйПроцессКэш[СвойстваЭлементов.Счетчик] =
		ПроизводственныйПроцессКэш[СвойстваЭлементов.Счетчик] + Изменение;
	
	Если ВидЭлемента = "Этап" Тогда
		
		ОбновитьРеквизитМногоэтапныйПроизводственныйПроцесс();
	
	КонецЕсли;
	
КонецПроцедуры

// Получает родителя заданной строки дерева
// 
// Параметры:
// 	Форма - ФормаКлиентскогоПриложения
// 	ДанныеСтроки - ДанныеФормыЭлементДерева
// Возвращаемое значение:
// 	ДанныеФормыЭлементДерева - родитель заданной строки
&НаКлиентеНаСервереБезКонтекста
Функция ПроизводственныйПроцессПолучитьРодителя(Форма, ДанныеСтроки)
	
	РодительЭлемента = ДанныеСтроки.ПолучитьРодителя();
	Если РодительЭлемента = Неопределено Тогда
		РодительЭлемента = Форма.ПроизводственныйПроцесс;
	КонецЕсли;
	
	Возврат РодительЭлемента;
	
КонецФункции

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

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

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

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

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

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

&НаСервере
Процедура ПроизводственныйПроцессОчистить()
	
	ПроизводственныйПроцесс.ПолучитьЭлементы().Очистить();
	
	ПроизводственныйПроцессОчиститьКэшЭлементов();
	
	ПроизводственныйПроцессКэш.ЭтапКоличество            = 0;
	ПроизводственныйПроцессКэш.ОперацияКоличество        = 0;
	ПроизводственныйПроцессКэш.ЕстьМногооперационныйЭтап = Ложь;
	
КонецПроцедуры

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


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

#Область РедактированиеСвойствЭтапа

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

&НаКлиенте
Процедура РассчитатьДлительностьЭтапа()
	
	
	Возврат; // пустой обработчик
	
КонецПроцедуры

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

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

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


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

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

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

&НаКлиенте
Процедура ЗаполнитьПодразделениеЭтаповЗавершение(Подразделение, ИдентификаторыСтрок) Экспорт
	
	Если ЗначениеЗаполнено(Подразделение) Тогда
		
		ЗаполнитьПодразделениеЭтаповЗавершениеНаСервере(Подразделение, ИдентификаторыСтрок);
		
	КонецЕсли;
	
КонецПроцедуры

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


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


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

#Область СпособыРаспределенияЗатрат

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

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

#Область Основное

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

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

#Область ОсновноеИзделие

&НаКлиентеНаСервереБезКонтекста
Функция ИспользуетсяРежимРедактированияОсновногоИзделия(Форма)
	
		Возврат Ложь;
	
КонецФункции

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция СписокРеквизитовОсновноеИзделиеСпецификации()
	
	СтруктураВозврата = Новый Структура;
	СтруктураВозврата.Вставить("ВидНоменклатуры",    "ОсновноеИзделиеВидНоменклатуры");
	СтруктураВозврата.Вставить("Номенклатура",       "ОсновноеИзделиеНоменклатура");
	СтруктураВозврата.Вставить("Характеристика",     "ОсновноеИзделиеХарактеристика");
	СтруктураВозврата.Вставить("Упаковка",           "ОсновноеИзделиеУпаковка");
	СтруктураВозврата.Вставить("КоличествоУпаковок", "ОсновноеИзделиеКоличествоУпаковок");
	Возврат СтруктураВозврата;

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


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

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

&НаСервере
Процедура ОбновитьИнформациюПоОсновномуИзделиюСпецификации()
	
	Если Не ИспользуетсяРежимРедактированияОсновногоИзделия(ЭтотОбъект) Тогда
		Возврат;
	КонецЕсли;
	
	
КонецПроцедуры

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

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

&НаКлиентеНаСервереБезКонтекста
Функция ЭтоТехнологическийНабор(Форма)
	
	Результат = Ложь;
	
	Возврат Результат;
	
КонецФункции



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

#Область Продукция

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

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

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

&НаСервере
Процедура ПродукцияТребуетсяУказыватьСерииПриИзмененииНаСервере(Идентификатор)

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


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

#Область ВыходныеИзделия

&НаКлиенте
Процедура ПриИзмененииНоменклатурыВСтрокеВыходныхИзделий(ТекущиеДанные)
	
	УправлениеДаннымиОбИзделияхКлиентСервер.ПриИзмененииНоменклатурыВСтрокеСАвтовыбором(ТекущиеДанные, Объект);
	УправлениеДаннымиОбИзделияхКлиентСервер.ПриИзмененииХарактеристикиВСтрокеСАвтовыбором(ТекущиеДанные, Объект);
	
	ОчиститьНастройкуОбработатьПоСпецификации(ТекущиеДанные);
	
КонецПроцедуры

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

#Область МатериалыИУслуги

&НаСервере
Процедура МатериалыИУслугиТребуетсяУказыватьСерииПриИзмененииНаСервере()

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

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

#Область СпособПолученияМатериала


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

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

#Область СтатьяКалькуляции

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

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

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

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

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

#Область Прочее

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

&НаКлиенте
Процедура ПриИзмененииНоменклатурыВСтрокеМатериалов(ТекущиеДанные)
	
	УправлениеДаннымиОбИзделияхКлиентСервер.ПриИзмененииНоменклатурыВСтрокеСАвтовыбором(
		ТекущиеДанные,
		Объект);
		
	УправлениеДаннымиОбИзделияхКлиентСервер.ПриИзмененииХарактеристикиВСтрокеСАвтовыбором(
		ТекущиеДанные,
		Объект);

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

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

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

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

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

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

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


#Область ИнформационнаяПанель

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

&НаКлиенте
Процедура НачатьОбновлениеИнформационнойПанелиКлиент()
	
	
	СброситьИнформационнуюПанель(ЭтотОбъект);
	
КонецПроцедуры

&НаСервере
Процедура НачатьОбновлениеИнформационнойПанели()
	
	СброситьИнформационнуюПанель(ЭтотОбъект);
	
	
КонецПроцедуры


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


#Область ЗагрузкаДанныхИзФайла

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

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

&НаКлиенте
Функция ОписаниеКолонокМакетаДляЗагрузкиНоменклатуры(ИмяТЧ);
	
	КолонкиМакета = Новый Массив;
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("Штрихкод", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(200)), НСтр("ru = 'Штрихкод'"), 10);
	Колонка.Позиция = 1;
	Колонка.Родитель = "Номенклатура";
	КолонкиМакета.Добавить(Колонка);
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("Артикул", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(50)), НСтр("ru = 'Артикул'"), 10);
	Колонка.Позиция = 2;
	Колонка.Родитель = "Номенклатура";
	КолонкиМакета.Добавить(Колонка);
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("КодНоменклатуры", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(11)), НСтр("ru = 'Код номенклатуры'"), 15);
	Колонка.Позиция = 3;
	Колонка.Родитель = "Номенклатура";
	КолонкиМакета.Добавить(Колонка);
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("Номенклатура", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)), НСтр("ru = 'Номенклатура'"), 15);
	Колонка.Позиция = 4;
	КолонкиМакета.Добавить(Колонка);
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("Характеристика", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)), НСтр("ru = 'Характеристика'"), 15);
	Колонка.Позиция = 5;
	КолонкиМакета.Добавить(Колонка);
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("КоличествоУпаковок", Новый ОписаниеТипов("Число",, Новый КвалификаторыЧисла(15, 3)), НСтр("ru = 'Количество'"), 10);
	Колонка.Позиция = 6;
	КолонкиМакета.Добавить(Колонка);
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("КодУпаковки", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(4)), НСтр("ru = 'Код упаковки'"), 12);
	Колонка.Позиция = 7;
	Колонка.Родитель = "Упаковка";
	КолонкиМакета.Добавить(Колонка);
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("Упаковка", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(50)), НСтр("ru = 'Упаковка'"), 10);
	Колонка.Позиция = 8;
	КолонкиМакета.Добавить(Колонка);
	
	Позиция = 8;
	
	Если Объект.МногоэтапныйПроизводственныйПроцесс Тогда
		Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("НомерЭтапа", Новый ОписаниеТипов("Число",, Новый КвалификаторыЧисла(5, 0)), НСтр("ru = 'Номер этапа'"), 10);
		Колонка.Позиция = Позиция + 1;
		Колонка.Родитель = "Этап";
		КолонкиМакета.Добавить(Колонка);
		
		Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("Этап", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)), НСтр("ru = 'Этап'"), 15);
		Колонка.Позиция = Позиция + 2;
		КолонкиМакета.Добавить(Колонка);
		
		Позиция = Позиция + 2;
	КонецЕсли;
	
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("СтатьяКалькуляции", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)), НСтр("ru = 'Статья калькуляции'"), 17);
	Колонка.Позиция = Позиция + 1;
	КолонкиМакета.Добавить(Колонка);
	
	Позиция = Позиция + 1;
	
	Если ИмяТЧ = "МатериалыИУслуги" Тогда
		Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("ПрименениеМатериала", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(0)), НСтр("ru = 'Применение материала'"), 20);
		Колонка.Позиция = Позиция + 1;
		КолонкиМакета.Добавить(Колонка);
	Иначе
		Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("ОписаниеИзделия", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(0)), НСтр("ru = 'Описание изделия'"), 20);
		Колонка.Позиция = Позиция + 1;
		КолонкиМакета.Добавить(Колонка);
	КонецЕсли;
	
	Возврат КолонкиМакета;
	
КонецФункции

&НаКлиенте
Функция ОписаниеКолонокМакетаДляЗагрузкиТрудозатрат();
	
	КолонкиМакета = Новый Массив;
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("КодВидаРабот", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(11)), НСтр("ru = 'Код вида работ'"), 15);
	Колонка.Позиция = 1;
	Колонка.Родитель = "ВидРабот";
	КолонкиМакета.Добавить(Колонка);
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("ВидРабот", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)), НСтр("ru = 'Вид работ'"), 15);
	Колонка.Позиция = 2;
	КолонкиМакета.Добавить(Колонка);
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("Количество", Новый ОписаниеТипов("Число",, Новый КвалификаторыЧисла(15, 3)), НСтр("ru = 'Количество'"), 10);
	Колонка.Позиция = 3;
	КолонкиМакета.Добавить(Колонка);
	
	Позиция = 3;
	
	Если Объект.МногоэтапныйПроизводственныйПроцесс Тогда
		Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("НомерЭтапа", Новый ОписаниеТипов("Число",, Новый КвалификаторыЧисла(5, 0)), НСтр("ru = 'Номер этапа'"), 10);
		Колонка.Позиция = Позиция + 1;
		Колонка.Родитель = "Этап";
		КолонкиМакета.Добавить(Колонка);
		
		Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("Этап", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)), НСтр("ru = 'Этап'"), 15);
		Колонка.Позиция = Позиция + 2;
		КолонкиМакета.Добавить(Колонка);
		
		Позиция = Позиция + 2;
	КонецЕсли;
	
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("СтатьяКалькуляции", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(150)), НСтр("ru = 'Статья калькуляции'"), 17);
	Колонка.Позиция = Позиция + 1;
	КолонкиМакета.Добавить(Колонка);
	
	Колонка = ЗагрузкаДанныхИзФайлаКлиентСервер.ОписаниеКолонкиМакета("НазначениеРабот", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(0)), НСтр("ru = 'Назначение работ'"), 20);
	Колонка.Позиция = Позиция + 2;
	КолонкиМакета.Добавить(Колонка);
	
	Возврат КолонкиМакета;
	
КонецФункции

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

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

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

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

#Область Прочее

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

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

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

	// Стандартное оформление номенклатуры
	#Область СтандартноеОформление
	ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения();
	ПараметрыУсловногоОформления.ИмяПоляЕдиницаИзмерения = "ПродукцияНоменклатураЕдиницаИзмерения";
	ПараметрыУсловногоОформления.ПутьКПолюУпаковка = "Объект.ВыходныеИзделия.Упаковка";
	НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтотОбъект, ПараметрыУсловногоОформления);
	
	ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения();
	ПараметрыУсловногоОформления.ИмяПоляЕдиницаИзмерения = "ВыходныеИзделияНоменклатураЕдиницаИзмерения";
	ПараметрыУсловногоОформления.ПутьКПолюУпаковка = "Объект.ВыходныеИзделия.Упаковка";
	НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтотОбъект, ПараметрыУсловногоОформления);

	ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения();
	ПараметрыУсловногоОформления.ИмяПоляЕдиницаИзмерения = "ВозвратныеОтходыНоменклатураЕдиницаИзмерения";
	ПараметрыУсловногоОформления.ПутьКПолюУпаковка = "Объект.ВозвратныеОтходы.Упаковка";
	НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтотОбъект, ПараметрыУсловногоОформления);

	ПараметрыУсловногоОформления = НоменклатураСервер.НовыеПараметрыУсловногоОформленияЕдиницИзмерения();
	ПараметрыУсловногоОформления.ИмяПоляЕдиницаИзмерения = "МатериалыИУслугиНоменклатураЕдиницаИзмерения";
	ПараметрыУсловногоОформления.ПутьКПолюУпаковка = "Объект.МатериалыИУслуги.Упаковка";
	НоменклатураСервер.УстановитьУсловноеОформлениеЕдиницИзмерения(ЭтотОбъект, ПараметрыУсловногоОформления);
	
	УстановитьУсловноеОформлениеТабличныхЧастейСАвтовыбором();
	
	#КонецОбласти
	
	// Жирный шрифт для первой строки изделий
	#Область ЖирнымПерваяСтрока
	
	Элемент = УсловноеОформление.Элементы.Добавить();

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Шрифт", ШрифтыСтиля.ВажнаяНадписьШрифт);
	
	#КонецОбласти

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

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

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

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

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

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	//
	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.МатериалыИУслугиТребуетсяУказыватьСерии.Имя);

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

	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	#КонецОбласти
	
	#Область СтатьяКалькуляции
	
	
	Элемент = УсловноеОформление.Элементы.Добавить();

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

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

&НаСервере
Процедура УстановитьУсловноеОформлениеТабличныхЧастейСАвтовыбором()
	

	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтотОбъект,
		"ПродукцияХарактеристика",
		"Объект.ВыходныеИзделия.ХарактеристикиИспользуются");

	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтотОбъект,
		"ВыходныеИзделияХарактеристика",
		"Объект.ВыходныеИзделия.ХарактеристикиИспользуются");
	
	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтотОбъект,
		"ВозвратныеОтходыХарактеристика",
		"Объект.ВозвратныеОтходы.ХарактеристикиИспользуются");
	
	НоменклатураСервер.УстановитьУсловноеОформлениеХарактеристикНоменклатуры(ЭтотОбъект,
		"МатериалыИУслугиХарактеристика",
		"Объект.МатериалыИУслуги.ХарактеристикиИспользуются");
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура НастроитьЭлементыФормы()
	
	УправлениеПредприятием = Ложь;
	
#Область УП_КА_21_22

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

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

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


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

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

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

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

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

// Конструктор структуры данных первого/последнего этапа спецификации
// 
// Возвращаемое значение:
// 	Структура - данные этапа:
//		* Ссылка  - СправочникСсылка.ЭтапыПроизводства - ссылка на этап
//		* Наименование - Строка - наименование этапа
//		* Подразделение - СправочникСсылка.СтруктураПредприятия - подразделение этапа
//		* ПроизводствоНаСтороне - Булево - признак производства на стороне
//
&НаКлиентеНаСервереБезКонтекста
Функция ДанныеЭтапаКонструктор()
	
	Результат = Новый Структура;
	
	Результат.Вставить("ЭтоПервыйЭтап",         Ложь);
	Результат.Вставить("Ссылка",                ПредопределенноеЗначение("Справочник.ЭтапыПроизводства.ПустаяСсылка"));
	Результат.Вставить("Наименование",          "");
	Результат.Вставить("Подразделение",         ПредопределенноеЗначение("Справочник.СтруктураПредприятия.ПустаяСсылка"));
	Результат.Вставить("ПроизводствоНаСтороне", Ложь);
	
	Возврат Результат;
	
КонецФункции

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

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

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

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

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

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

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

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


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

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

&НаСервере
Функция СтруктураДействийДляЗаполненияСлужебныхРеквизитов()
	
	СтруктураДействий = Новый Структура;
	СтруктураДействий.Вставить("ЗаполнитьПризнакХарактеристикиИспользуются", Новый Структура("Номенклатура", "ХарактеристикиИспользуются"));
	СтруктураДействий.Вставить("ЗаполнитьПризнакАртикул", Новый Структура("Номенклатура", "Артикул"));
	СтруктураДействий.Вставить("ЗаполнитьПризнакСерииИспользуются", Новый Структура("Номенклатура", "СерииИспользуются"));
	
	Возврат СтруктураДействий;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура УстановитьКлючСохраненияПоложенияОкна()
	
	МассивПризнаков = Новый Массив;
	МассивПризнаков.Добавить(ИспользуетсяПроизводство21);
	МассивПризнаков.Добавить(ИспользуетсяПроизводство22);
	МассивПризнаков.Добавить(ИспользоватьПолуфабрикатыПроизводимыеНаЭтапе);
	
	КлючСохраненияПоложенияОкна = СтрШаблон("%1_%2", ИмяФормы, СтрСоединить(МассивПризнаков));
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

	Если РезультатЗакрытия = Истина Тогда
		
		УстановитьНовыйСтатусИЗаписать(ПредопределенноеЗначение("Перечисление.СтатусыСпецификаций.ВРазработке"));
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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


&НаКлиенте
Процедура ОбработатьВыборПоляВТаблице(ИмяТаблицы, Поле, СтандартнаяОбработка)

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

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

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


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

&НаКлиенте
Процедура ОчиститьНастройкуОбработатьПоСпецификации(ТекущиеДанные)
	
	Если ТекущиеДанные.ОбработатьПоСпецификации Тогда
		ТекущиеДанные.ОбработатьПоСпецификации = Ложь;
		ТекущиеДанные.Спецификация = Неопределено;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьСвойстваСворачиваемойГруппы(ЭлементГруппа, КартинкаГруппы, ГруппаСвернута)

	ЭлементГруппа.Видимость = НЕ ГруппаСвернута;
	
	Если ГруппаСвернута Тогда
		КартинкаГруппы.Картинка = БиблиотекаКартинок.СтрелкаВправо;
	Иначе
		КартинкаГруппы.Картинка = БиблиотекаКартинок.СтрелкаВниз;
	КонецЕсли; 

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

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

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

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

&НаКлиенте
Процедура ЗаполнитьСтатьюКалькуляцииВСтрокахЗавершение(РезультатЗакрытия, ИмяТЧ) Экспорт

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

// СтандартныеПодсистемы.Свойства

&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
	УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры

// Конец СтандартныеПодсистемы.Свойства

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

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

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