Экземпляр бюджета / Модуль менеджера

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

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

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

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

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

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

#Область СозданиеНаОсновании

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

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

	Возврат Неопределено;
КонецФункции

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

// СтандартныеПодсистемы.ВерсионированиеОбъектов

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

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

// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// Заполняет список команд печати.
//
// Параметры:
//   КомандыПечати - см. УправлениеПечатью.СоздатьКоллекциюКомандПечати
//
Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
	
	// Печать бюджета.
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "ПечатьБюджета";
	КомандаПечати.Представление = НСтр("ru = 'Печать бюджета'");
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
	
	// Печать бюджета списком.
	КомандаПечати = КомандыПечати.Добавить();
	КомандаПечати.Идентификатор = "ПечатьБюджетаСписком";
	КомандаПечати.Представление = НСтр("ru = 'Печать бюджета списком'");
	КомандаПечати.ПроверкаПроведенияПередПечатью = Истина;
	
КонецПроцедуры

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

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

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

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

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

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

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

#КонецЕсли

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

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

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
	
	Данные.Вставить("НаименованиеДокумента", СокрЛП(Данные.Действие));
	Данные.Удалить("Действие");
	
	СтандартнаяОбработка = Ложь;
	Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = '%1 %2 от %3'"), Данные.НаименованиеДокумента, Данные.Номер, Данные.Дата);
	
КонецПроцедуры

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

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

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

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


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

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

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

Функция ТекстЗапросаВтСводнаяТаблицаДокумента(Запрос, ТекстыЗапроса)

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция ТекстЗапросаВтПравилаЛимитов(Запрос, ТекстыЗапроса)

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

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

// Возвращает заголовок или представление прочих значений на языке пользователя по параметрам формирования заголовка.
//
// Параметры:
//  ПараметрыФормированияСпискаВвода - см. БюджетнаяОтчетностьРасчетКэшаСервер.ПараметрыЭлементаСпискаВвода.
//
// Возвращаемое значение:
//  Структура - Параметры элемента ввода значений на языке пользователя:
//   *Заголовок - Строка - Заголовок элемента.
//   *ПредставлениеПрочихЗначений - Строка - Подсказка ввода значений.
//   *Формат - Строка - форматная строка ввода периода.
//   		 - Неопределено - форматная строка не применяется.
//
Функция ПараметрыЭлементаВводаЗначенийНаЯзыкеПользователя(ПараметрыФормированияСпискаВвода) Экспорт
	ПараметрыФормированияСпискаВвода = ПараметрыФормированияСпискаВвода;
	
	Результат = Новый Структура("Заголовок, ПредставлениеПрочихЗначений, Формат");
	
	Если ПараметрыФормированияСпискаВвода.ВидЭлемента = Перечисления.ВидыЭлементовФинансовогоОтчета.СтатьяБюджетов Тогда
		Результат.Заголовок = НСтр("ru = 'Статья/показатель бюджетов'");
		Результат.ПредставлениеПрочихЗначений = НСтр("ru = '<прочие статьи/показатели бюджетов>'");
	ИначеЕсли ПараметрыФормированияСпискаВвода.ВидЭлемента = Перечисления.ВидыЭлементовФинансовогоОтчета.Измерение
		И ПараметрыФормированияСпискаВвода.ТипИзмерения = Перечисления.ТипыИзмеренийФинансовогоОтчета.Валюта Тогда
		Результат.Заголовок = БюджетнаяОтчетностьКлиентСервер.ПредставлениеИзмеренияБюджетирования("Валюта");
		Результат.ПредставлениеПрочихЗначений = БюджетнаяОтчетностьКлиентСервер.ПредставлениеПрочейАналитикиБюджетирования(
			"Валюта", "Прочие");
	ИначеЕсли ПараметрыФормированияСпискаВвода.ВидЭлемента = Перечисления.ВидыЭлементовФинансовогоОтчета.Измерение
		И ПараметрыФормированияСпискаВвода.ТипИзмерения = Перечисления.ТипыИзмеренийФинансовогоОтчета.Период Тогда
		
		Результат.Заголовок = Строка(ПараметрыФормированияСпискаВвода.Периодичность);
		Результат.ПредставлениеПрочихЗначений = "";
		
		Периодичность = ПараметрыФормированияСпискаВвода.Периодичность;
		Если Периодичность = Перечисления.Периодичность.Год Тогда
			Формат = НСтр("ru = 'ДФ=гггг'");
		ИначеЕсли Периодичность = Перечисления.Периодичность.Полугодие Тогда
			Формат = НСтр("ru = 'ДФ=''""Полугодие с"" ММММ гггг'''");
		ИначеЕсли Периодичность = Перечисления.Периодичность.Квартал Тогда
			Формат = НСтр("ru = 'ДФ=''к ""квартал""'''")
		ИначеЕсли Периодичность = Перечисления.Периодичность.Месяц Тогда
			Формат = НСтр("ru = 'ДФ=''MMMM yyyy'''");
		ИначеЕсли Периодичность = Перечисления.Периодичность.Декада Тогда
			Формат = СтрШаблон(НСтр("ru = 'ДФ=''""Декада с"" %1'''"), "dd.MM.yy");
		ИначеЕсли Периодичность = Перечисления.Периодичность.Неделя Тогда
			Формат = СтрШаблон(НСтр("ru = 'ДФ=''""Неделя с"" %1'''"), "dd.MM.yy");
		ИначеЕсли Периодичность = Перечисления.Периодичность.День Тогда
			Формат = "ДЛФ=D";
		КонецЕсли;
		
		Результат.Формат = Формат;
	Иначе
		// это вид аналитики. 
		Результат.Заголовок = Строка(ПараметрыФормированияСпискаВвода.ВидАналитики);
		Результат.ПредставлениеПрочихЗначений = БюджетнаяОтчетностьКлиентСервер.ПредставлениеПрочейАналитикиБюджетирования(
			ПараметрыФормированияСпискаВвода.ВидАналитики, "Прочие");
	КонецЕсли;
	
	Возврат Результат;
КонецФункции


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

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


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

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

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

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

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

// Функция-конструктор структуры представления аналитики (прочее)
// 
// Параметры:
// 	НаименованиеДляПечати - Строка -
// Возвращаемое значение:
// 	Структура - Описание:
// * НаименованиеДляПечати - Строка -
// * МассивСтрокОснования - Массив -
Функция НовыйСтруктураПредставленияАналитикиПрочее(НаименованиеДляПечати = "")
	
	Результат = Новый Структура;
	
	Результат.Вставить("МассивСтрокОснования",  Новый Массив);
	Результат.Вставить("НаименованиеДляПечати", НаименованиеДляПечати);
	
	Возврат Результат;
	
КонецФункции

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

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

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

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

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

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

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

#Область Отчеты

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

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

#КонецЕсли

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