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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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