Списание затрат на выпуск / Списание затрат на выпуск и регистрация изделий в НЗП / Модуль формы

файл

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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