Виды бюджетов / Форма элемента / Модуль формы

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

&НаСервере
Перем ТекущийЭлементОтчета; // Неопределено, СправочникСсылка.ЭлементыФинансовыхОтчетов, Строка - текущий элемент или его адрес во временном хранилище.

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

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

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

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

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

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

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
	
	Элементы.ЭлементыОтчетаОтображение.Развернуть(ЭлементыОтчетаОтображение.ПолучитьЭлементы()[0].ПолучитьИдентификатор(), Истина);

	МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(ЭтотОбъект, ПараметрыЗаписи);

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

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

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

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

	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

	// СтандартныеПодсистемы.УправлениеДоступом
	УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	// Конец СтандартныеПодсистемы.УправлениеДоступом

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ГраницаФактическихДанныхПриИзменении(Элемент)
	
	УправлениеФормой();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Изменить(Команда)

	РедактироватьЭлементОтчета();
	
КонецПроцедуры

&НаКлиенте
Процедура Обновить(Команда)
	
	ОбновитьДеревоНовыхЭлементов();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ЗаполнитьИдентификаторыСтрокДляОбновленияНаименования(ИдентификаторыСтрок, ВидЭлемента,
	СтатьяПоказательТипИзмерения, Наименование, Дерево = Неопределено)

	Если Дерево = Неопределено Тогда
		Дерево = ЭлементыОтчета;
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервереБезКонтекста
Функция ПоместитьСписокАналитикШапкиВХранилище(Знач АналитикиШапки, УникальныйИдентификатор)
	
	Возврат ПоместитьВоВременноеХранилище(АналитикиШапки.Выгрузить(), УникальныйИдентификатор);
	
КонецФункции

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

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

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

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

&НаСервере
Процедура УстановитьТекстАналитикВШапке()
	
	ТаблицаВидовАналитик = Объект.АналитикиШапки.Выгрузить();
	АналитикиШапки = СтрСоединить(ТаблицаВидовАналитик.ВыгрузитьКолонку("ВидАналитики"), ", ");
	Если ПустаяСтрока(АналитикиШапки) Тогда
		АналитикиШапки = НСтр("ru = '<не указаны>'");
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

		КонецЦикла;
		
	КонецЦикла;
		
	Для Каждого Строка Из СтрокаДереваЭлементов.Строки Цикл
		ЗаполнитьКэшСтатейИПоказателей(Строка, ТзКэшСтатейИПоказателей);	
	КонецЦикла;
	
КонецПроцедуры

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

	Для Каждого СтрокаДереваЭлементов Из ДеревоЭлементов.Строки Цикл
		ЗаполнитьКэшСтатейИПоказателей(СтрокаДереваЭлементов, ТзКэшСтатейИПоказателей);
	КонецЦикла;
	
	ТзКэшСтатейИПоказателей.Свернуть("СтатьяПоказатель,ПривилегированныйРежим");

	Возврат ТзКэшСтатейИПоказателей;
	
КонецФункции

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

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