Источники данных планирования / Заполнение плана / Модуль формы

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

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

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

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

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

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

	
	СобытияФорм.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПравилоЗаполненияЦенаПериодПриИзменении(Элемент)
	
	ЭлементИсточник = ПолучитьПервыйЭлементПравилаЗаполнения(Истина);
	
	ЭлементИсточник.Период = ПравилоЗаполненияЦенаПериод;
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиПриИзменении(Элемент)
	
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнениеКоличестваНажатие(Элемент)
	
	Элементы.ГруппаИсточникиЗаполнения.ТекущаяСтраница = Элементы.ГруппаИсточникЗаполненияКоличества;
	
	ИсточникиЗаполненияПриСменеСтраницы(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнениеЦеныНажатие(Элемент)
	
	Элементы.ГруппаИсточникиЗаполнения.ТекущаяСтраница = Элементы.ГруппаИсточникЗаполненияЦены;
	
	ИсточникиЗаполненияПриСменеСтраницы(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьИНастроитьСезонныеКоэффициентыНажатие(Элемент)
	ОткрытьФорму("РегистрСведений.СезонныеКоэффициенты.Форма.СезонныеКоэффициенты");
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьРезультатКоличестваНаПриИзменении(Элемент)
	ЭлементИсточник = ПолучитьПервыйЭлементПравилаЗаполнения(Ложь);
	ЭлементИсточник.ИзменитьРезультатНа = ИзменитьРезультатКоличестваНа;
КонецПроцедуры

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

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

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


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

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыКомпоновщикНастроекИсточникаЦеныПользовательскиеНастройки

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

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

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

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

&НаКлиенте
Процедура ПравилоЗаполненияПередУдалением(Элемент, Отказ)
	
	// Корневой элемент не удаляется
	Если Элемент.ТекущиеДанные.ТипЭлемента = 2 Тогда
		
		Отказ = Истина;
		
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура СнятьПометки(Команда)
	
	УстановитьПометкиСПодчиненными(ПравилоЗаполнения, Ложь);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ВключитьРасширенныйРежим(Команда)
	
	СохранитьНастройкиКомпоновщика();
	ИспользоватьРасширенныеВозможностиЗаполнения = Истина;
	НастроитьФорму();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

	//

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

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

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

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

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

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

	//

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

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Отображать", Ложь);

	//

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

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

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

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

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

	//

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

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

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

	//

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

	//

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

	//

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

	//

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

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

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

	Элемент.Оформление.УстановитьЗначениеПараметра("Видимость", Ложь);

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

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

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

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

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

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

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

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

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

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



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

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

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

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

КонецФункции 
 
&НаСервереБезКонтекста
Функция ПолучитьПоляЗаполнения(Знач Источник,
	Знач ВариантПериода,
	Знач АдресСхемыПреобразованияДанных, 
	Знач ВидПлана, 
	АдресПользовательскиеНастройки = Неопределено, 
	УдалятьНеиспользуемыеПоля = Ложь,
	КоличествоПериодов = 0)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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