Бюджетный отчет / Форма отчета / Модуль формы

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

&НаКлиенте
Перем ПараметрыОбработчикаОжидания;

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

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

&НаКлиенте
Процедура ПриПовторномОткрытии()
	
	СформироватьНепосредственно();
	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	Если ЗавершениеРаботы = Истина Тогда
    	Возврат;	
	КонецЕсли;

	ОтменитьВыполнениеЗадания();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура РезультатВыбор(Элемент, Область, СтандартнаяОбработка)

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

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

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, ИндексРасшифровка, СтандартнаяОбработка)

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

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

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

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

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

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

&НаКлиенте
Процедура СформироватьОтчет(Команда)
	
	Сформировать();
	
КонецПроцедуры

&НаКлиенте
Процедура ПанельНастроек(Команда)
	
	ПоказыватьПанельНастройки = Не ПоказыватьПанельНастройки;
	УстановитьВидимостьПанелиНастроек(ЭтотОбъект);
	
КонецПроцедуры

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

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

////////////////////////////////////////////////////////////////////////////////
// Обработчики команд расчета показателей.

&НаКлиенте
Процедура ВыбратьПоказательНажатие(Элемент)

	Меню = МенюВидовПоказателей(Элементы.КомандыВидовПоказателей);
	ПоказатьВыборИзМеню(Новый ОписаниеОповещения("ПослеВыбораПоказателя", ЭтотОбъект), Меню, Элемент);

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

&НаКлиенте
Процедура РассчитатьСумму(Команда)
	РассчитатьПоказатели(Команда.Имя);
КонецПроцедуры

&НаКлиенте
Процедура РассчитатьКоличество(Команда)
	РассчитатьПоказатели(Команда.Имя);
КонецПроцедуры

&НаКлиенте
Процедура РассчитатьСреднее(Команда)
	РассчитатьПоказатели(Команда.Имя);
КонецПроцедуры

&НаКлиенте
Процедура РассчитатьМинимум(Команда)
	РассчитатьПоказатели(Команда.Имя);
КонецПроцедуры

&НаКлиенте
Процедура РассчитатьМаксимум(Команда)
	РассчитатьПоказатели(Команда.Имя);
КонецПроцедуры

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

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

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

#Область ОбработчикиСобытийДокументаРезультат

&НаКлиенте
Процедура РезультатПриАктивизации(Элемент)

	ПодключитьОбработчикОжидания("РассчитатьПоказателиДинамически", 0.2, Истина);

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

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

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

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

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

&НаСервере
Функция ПараметрыОткрытияОтчетаРасшифровки(Расшифровка, Сравнение = Ложь)

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьВидимостьПанелиНастроек(Форма)
	
	Форма.Элементы.ГруппаПанельНастроек.Видимость = Форма.ПоказыватьПанельНастройки;
	Форма.Элементы.ПанельНастроек.Пометка = Форма.ПоказыватьПанельНастройки;
	
КонецПроцедуры

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

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

	Возврат ПараметрыОтчета;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура ОбновитьТекстЗаголовка(Форма)

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

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

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

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

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

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

&НаСервере
Процедура ОтменитьВыполнениеЗадания()
	
	ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
	
КонецПроцедуры

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

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

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

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

#Область РасчетПоказателей

// Параметры:
//  Родитель - ГруппаФормы
//  Меню - Неопределено
//       - СписокЗначений
// 
// Возвращаемое значение:
//  - Неопределено
//  - СписокЗначений
//
&НаКлиенте
Функция МенюВидовПоказателей(Родитель, Меню = Неопределено)

	Если Меню = Неопределено Тогда
		Меню = Новый СписокЗначений;
	КонецЕсли;

	ЭлементыМеню = Родитель.ПодчиненныеЭлементы; // ЭлементыФормы

	Для Каждого Элемент Из ЭлементыМеню Цикл

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

	КонецЦикла;

	ЭлементМеню = Меню.НайтиПоЗначению(Элементы.РассчитатьВсеПоказатели.Имя);

	Если ЭлементМеню <> Неопределено Тогда
		ЭлементМеню.Пометка = РазвернутьОбластьПоказателей;
	КонецЕсли;

	Возврат Меню;

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

&НаКлиенте
Процедура ПослеВыбораПоказателя(ВыбранныйПоказатель, ДополнительныеПараметры) Экспорт

	Если ТипЗнч(ВыбранныйПоказатель) <> Тип("ЭлементСпискаЗначений") Тогда
		Возврат;
	КонецЕсли;

	Если ВыбранныйПоказатель.Значение = Элементы.РассчитатьВсеПоказатели.Имя Тогда

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

	Иначе
		РассчитатьПоказатели(ВыбранныйПоказатель.Значение);
	КонецЕсли;

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

// Выполняет расчет и вывод показателей выделенной области ячеек.
// См. обработчик события ОтчетТабличныйДокументПриАктивизацииОбласти.
//
&НаКлиенте
Процедура РассчитатьПоказателиДинамически()

	РассчитатьПоказатели();

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

&НаКлиенте
Процедура РассчитатьПоказатели(ТекущаяКоманда = "")

	Показатель = "";
	ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "Результат", ТекущаяКоманда, 2);

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

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

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

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

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