Оборотно-сальдовая ведомость по показателям бюджетов / Модуль объекта

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

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

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

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

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

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

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

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

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

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

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

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

#Область ПолучениеДанныхОтчета

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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