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

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

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

// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
//  МеханизмыДокумента - Массив из Строка - список имен учетных механизмов, для которых будет выполнена
//  			регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
	
	МеханизмыДокумента.Добавить("Бюджетирование");
	
КонецПроцедуры

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

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

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

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

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

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

// СтандартныеПодсистемы.ВерсионированиеОбъектов
// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
// Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

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

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

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

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

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

#Область ФормированиеФормыДокумента

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

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

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

Функция ТипКолонки(Измерение)
	
	Если Измерение.ИмяИзмерения = "Организация" Тогда 
		Возврат Новый ОписаниеТипов("СправочникСсылка.Организации");
	ИначеЕсли Измерение.ИмяИзмерения = "Подразделение" Тогда 
		Возврат Новый ОписаниеТипов("СправочникСсылка.СтруктураПредприятия");
	ИначеЕсли Измерение.ИмяИзмерения = "Сценарий" Тогда 
		Возврат Новый ОписаниеТипов("СправочникСсылка.Сценарии");
	ИначеЕсли Измерение.ИмяИзмерения = "Аналитика" Тогда
		Возврат Измерение.ТипЗначения;
	ИначеЕсли Измерение.ИмяИзмерения = "НомерПодПериода" Тогда
		Возврат ОбщегоНазначения.ОписаниеТипаЧисло(3, 0);
	ИначеЕсли Измерение.ИмяИзмерения = "Период" Тогда
		Возврат Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.Дата));
	Иначе
		ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Неверный шаблон: неизвестное измерение ""%1""'"),
			Измерение.ИмяИзмерения);
		ВызватьИсключение ТекстИсключения;
	КонецЕсли;
	
КонецФункции

Функция ТекстЗапросаРасчетаНомераАналитики()
	
	ТекстЗапроса =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	&ТекстПолейВидовАналитик
	|ПОМЕСТИТЬ АналитикаПоказателя
	|ИЗ
	|	ШаблонПоказатели КАК ШаблонПоказатели
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПараметрыШапки.Аналитика,
	|	ПараметрыШапки.ИмяИзмерения КАК ИмяИзмерения,
	|	ВЫБОР
	|		КОГДА ПараметрыШапки.ИмяИзмерения = ""Аналитика""
	|			ТОГДА &ТекстНомераАналитики
	|		ИНАЧЕ """"
	|	КОНЕЦ КАК ПостФикс,
	|	ПараметрыШапки.Аналитика.ТипЗначения КАК ТипЗначения,
	|	ПараметрыШапки.Представление
	|ИЗ
	|	ПараметрыШапки КАК ПараметрыШапки
	|		ЛЕВОЕ СОЕДИНЕНИЕ АналитикаПоказателя КАК АналитикаПоказателя
	|		ПО (ИСТИНА)";
	
	ТекстПолейВидовАналитик = "";
	ТекстНомераАналитики = "";
	ШаблонУсловияНомераАналитики =
	"					КОГДА ПараметрыШапки.Аналитика = АналитикаПоказателя.ВидАналитики%1
	|						ТОГДА ""%1""";
	МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
	Для НомерАналитики = 1 По МаксимальноеКоличествоАналитик Цикл
		ТекстПолейВидовАналитик = ТекстПолейВидовАналитик
			+ ?(ТекстПолейВидовАналитик = "", "", "," + Символы.ПС + Символы.Таб)
			+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				"ШаблонПоказатели.Показатель.ВидАналитики%1 КАК ВидАналитики%1",
				НомерАналитики);
		
		ТекстНомераАналитики = ТекстНомераАналитики + ?(ТекстНомераАналитики = "", "", Символы.ПС)
			+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				ШаблонУсловияНомераАналитики,
				НомерАналитики);
	КонецЦикла;
	ТекстНомераАналитики = "ВЫБОР" + Символы.ПС
	+ ТекстНомераАналитики + "
	|				КОНЕЦ"; // @query-part-1
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстПолейВидовАналитик", ТекстПолейВидовАналитик);
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстНомераАналитики", ТекстНомераАналитики);
	
	ТекстЗапроса =
	"
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|" + ТекстЗапроса;
	
	Возврат ТекстЗапроса;
	
КонецФункции

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

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

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

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

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

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

Процедура УничтожитьВспомогательныеТаблицы(Запрос)
	
	Запрос.Текст =
	"УНИЧТОЖИТЬ ПараметрыШапки
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|УНИЧТОЖИТЬ АналитикаПоказателя";
	
	Запрос.Выполнить();
	
КонецПроцедуры

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

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

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

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

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

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


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


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


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


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


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


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

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

#Область ЗаполнениеДокумента


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

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


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


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


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

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

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

Функция ДополнительныеИсточникиДанныхДляДвижений(ИмяРегистра) Экспорт

	ИсточникиДанных = Новый Соответствие;

	Возврат ИсточникиДанных; 

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

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

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

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



#КонецЕсли

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