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

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

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

&НаКлиенте
Перем ЯчейкаПослеВвода; // Булево -

&НаКлиенте
Перем ПринудительноеЗавершение; // Булево - 

&НаКлиенте
Перем ОткрытДиалогВопросаДубли; // Булево -

&НаКлиенте
Перем ИзмененияВСпискеОтраженыВДокументе; // Булево - 

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

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

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

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

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

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

	УстановитьУсловноеОформление();
	
	Если Параметры.Свойство("АвтоТест") Тогда // возврат при получении формы для анализа
		Возврат;
	КонецЕсли;

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

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

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

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

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

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)

	// СтандартныеПодсистемы.УправлениеДоступом
	УправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	// Конец СтандартныеПодсистемы.УправлениеДоступом
	
	// Обработчик механизма "ДатыЗапретаИзменения"
	ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);

	ПриЧтенииСозданииНаСервере();
	УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	
	МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры

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

	МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(ЭтотОбъект, Отказ, ТекущийОбъект, ПараметрыЗаписи);
	
	// ИнтеграцияС1СДокументооборотом
	ИнтеграцияС1СДокументооборотБазоваяФункциональность.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
	// Конец ИнтеграцияС1СДокументооборотом
	
КонецПроцедуры

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

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура МодельБюджетированияПриИзменении(Элемент)
	
	ПриИзмененииМоделиБюджетированияСервер();
	ОбновитьБюджет();
	
КонецПроцедуры

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

&НаКлиенте
Процедура СценарийПриИзменении(Элемент)
	
	ПриИзмененииСценарияСервер();
	ОбновитьБюджет();
	
КонецПроцедуры

&НаКлиенте
Процедура НачалоПериодаПриИзменении(Элемент)
	
	Объект.ОкончаниеПериода = ?(Объект.НачалоПериода > Объект.ОкончаниеПериода, Объект.НачалоПериода, Объект.ОкончаниеПериода);
	ПриИзмененииПериодаСервер();
	ОбновитьБюджет();
	
КонецПроцедуры

&НаКлиенте
Процедура ОкончаниеПериодаПриИзменении(Элемент)
	
	Объект.НачалоПериода = ?(Объект.НачалоПериода > Объект.ОкончаниеПериода, Объект.ОкончаниеПериода, Объект.НачалоПериода);
	ПриИзмененииПериодаСервер();
	ОбновитьБюджет();
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
	
	ОрганизацияПриИзмененииНаСервере();
	ОбновитьБюджет();
	
КонецПроцедуры

&НаКлиенте
Процедура ПодразделениеПриИзменении(Элемент)
	
	ПодразделениеПриИзмененииНаСервере();
	ОбновитьБюджет();
	
КонецПроцедуры

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоЭлементовБюджета

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокРедактированияБюджета

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

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

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

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

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

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

&НаКлиенте
Процедура СписокРедактированияБюджетаПередУдалением(Элемент, Отказ)
	
	УдалитьСвязанныеСтрокиБюджетаНаСервере(Элемент.ТекущаяСтрока);
	
КонецПроцедуры

&НаКлиенте
Процедура ПереместитьВверх(Команда)
	
	ПереместитьНаСервере(-1);
	
КонецПроцедуры

&НаКлиенте
Процедура ПереместитьВниз(Команда)
	
	ПереместитьНаСервере(1);
	
КонецПроцедуры

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

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

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыКорректировкиПоСтатьямБюджетов

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

&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)

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

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

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

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

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

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

&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовВалютаПриИзменении(Элемент)
	
	ПересчитатьСуммыВВалютеПоСтрокеПоКурсамСценария(Элементы.КорректировкиПоСтатьямБюджетов.ТекущаяСтрока);
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовКоличествоУвеличениеПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.КорректировкиПоСтатьямБюджетов.ТекущиеДанные;
	ТекущаяСтрока.КоличествоУменьшение = 0;
	
КонецПроцедуры

&НаКлиенте
Процедура КорректировкиПоСтатьямБюджетовКоличествоУменьшениеПриИзменении(Элемент)
	
	ТекущаяСтрока = Элементы.КорректировкиПоСтатьямБюджетов.ТекущиеДанные;
	ТекущаяСтрока.КоличествоУвеличение = 0;
	
КонецПроцедуры

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

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

// СтандартныеПодсистемы.РаботаСФайлами
&НаКлиенте
Процедура Подключаемый_КомандаПанелиПрисоединенныхФайлов(Команда)
	РаботаСФайламиКлиент.КомандаУправленияПрисоединеннымиФайлами(ЭтотОбъект, Команда);
КонецПроцедуры
// Конец СтандартныеПодсистемы.РаботаСФайлами

// СтандартныеПодсистемы.РаботаСФайлами
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	РаботаСФайламиКлиент.ПолеПредпросмотраПроверкаПеретаскивания(ЭтотОбъект,
		Элемент,
		ПараметрыПеретаскивания,
		СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.РаботаСФайлами

// СтандартныеПодсистемы.РаботаСФайлами
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	РаботаСФайламиКлиент.ПолеПредпросмотраПеретаскивание(ЭтотОбъект,
		Элемент,
		ПараметрыПеретаскивания,
		СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.РаботаСФайлами

// СтандартныеПодсистемы.РаботаСФайлами
&НаКлиенте
Процедура Подключаемый_ПолеПредпросмотраНажатие(Элемент, СтандартнаяОбработка)
	РаботаСФайламиКлиент.ПолеПредпросмотраНажатие(ЭтотОбъект, Элемент, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.РаботаСФайлами

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

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

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

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

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

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

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

&НаКлиенте
Процедура ЗаписатьДокумент(Команда)
	
	ОбщегоНазначенияУТКлиент.Записать(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПоДаннымБюджетирования(Команда)
	
	ПроверитьВозможностьЗаполненияПоДаннымБюджетирования();
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьПереопределяемуюКоманду(Команда)
	
	СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду(ЭтотОбъект, Команда);
	
КонецПроцедуры

// ИнтеграцияС1СДокументооборотом
&НаКлиенте
Процедура Подключаемый_ВыполнитьКомандуИнтеграции(Команда)
	
	ИнтеграцияС1СДокументооборотБазоваяФункциональностьКлиент.ВыполнитьПодключаемуюКомандуИнтеграции(Команда, ЭтотОбъект, Объект);
	
КонецПроцедуры
// Конец ИнтеграцияС1СДокументооборотом

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Подключаемый_ПриИзмененииАналитикиШапки(Элемент)
	
	СброситьКэшПараметров();
	ОбновитьБюджет();
	
КонецПроцедуры

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

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

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

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

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

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

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

	//

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

	//

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

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

// СтандартныеПодсистемы.Свойства
&НаСервереБезКонтекста
Функция ВозможностьЧтенияПрисоединенногоФайла(ПрисоединенныйФайл)
	
	РеквизитыФайла = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПрисоединенныйФайл, "ТипСлужебногоФайла, Расширение");
	
	Результат = Новый Структура("ЧтениеВозможно, ТекстОшибки", Истина, "");
	Если ЗначениеЗаполнено(РеквизитыФайла.ТипСлужебногоФайла) Тогда
		Результат.ЧтениеВозможно = Ложь;
		Результат.ТекстОшибки    = НСтр("ru = 'Файл является служебным, выбор запрещен.'");
	ИначеЕсли НРЕГ(РеквизитыФайла.Расширение) <> "xls"
		И НРЕГ(РеквизитыФайла.Расширение) <> "xlsx"
		И НРЕГ(РеквизитыФайла.Расширение) <> "ods" Тогда
		Результат.ЧтениеВозможно = Ложь;
		Результат.ТекстОшибки    = НСтр("ru = 'Файл не является файлом формата Excel или Open Office (ods), выбор запрещен.'");
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции
// Конец СтандартныеПодсистемы.Свойства

#Область ЗаполнениеБюджета

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПриИзмененииСценарияСервер()
	
	УстановитьПараметрыСценария();
	СброситьКэшПараметров();
	
	УстановитьДоступностьЭлементовПослеПроверкиЗаполнения();
КонецПроцедуры

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

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

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

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

&НаСервере
Процедура ОрганизацияПриИзмененииНаСервере()
	
	СброситьКэшПараметров();
	
	УстановитьДоступностьЭлементовПослеПроверкиЗаполнения();
КонецПроцедуры

&НаСервере
Процедура ПодразделениеПриИзмененииНаСервере()
	
	СброситьКэшПараметров();
	
	УстановитьДоступностьЭлементовПослеПроверкиЗаполнения();
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ПриИзмененииДействияСервер(ЗаполнитьБюджет = Истина)

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

&НаКлиентеНаСервереБезКонтекста
Процедура РассчитатьИтоговыеСуммыКорректировки(Форма)
	
	Форма.ИтогоСуммаУвеличения = Форма.КорректировкиПоСтатьямБюджетов.Итог("СуммаУвеличение");
	Форма.ИтогоСуммаУменьшения = Форма.КорректировкиПоСтатьямБюджетов.Итог("СуммаУменьшение");
	Форма.ИтогоСуммаКорректировки = Форма.ИтогоСуммаУвеличения - Форма.ИтогоСуммаУменьшения;
	
КонецПроцедуры

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

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

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

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

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

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

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

#Область ВыгрузкаВЭксель

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

&НаСервере
Функция СоздатьПрисоединенныйФайлXLS97(ИДТаблицы, КолонкиПоИзмерениям)
	ГлубинаДерева = Неопределено;
	
	СхемаКомпоновкиДанных = Документы.ЭкземплярБюджета.ПолучитьСКДПечатиДокументаБезГруппировок(ИДТаблицы, КолонкиПоИзмерениям, 
		ГлубинаДерева, ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета));
	
	// вывод результата компоновки в отчет
	
	Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	
	МакетКомпоновки = КомпоновщикМакета.Выполнить(
		СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	
	ПараметрыЯчеек = ПолучитьИзВременногоХранилища(ПараметрыВыводаВидаБюджета).СтруктураОписанияОтчета.ПараметрыЯчеек;
	ВнешниеДанные = Новый Структура("ДанныеЯчеек, ПараметрыЯчеек", ПолучитьИзВременногоХранилища(АдресДанныхЯчеек), ПараметрыЯчеек);
	
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновкиДанных.Инициализировать(
		МакетКомпоновки, ВнешниеДанные, ДанныеРасшифровки);
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	
	// Выводим результат в табличный документ
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
	
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
	ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS97);
	
	АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла), УникальныйИдентификатор);
	
	ПредставлениеТекущейДатыДляИмениФайла = Формат(ТекущаяДатаСеанса(),
		СтрШаблон(НСтр("ru = 'ДФ=''%1 %2'''"), "dd.MM.yyyy", "ЧЧ.мм.сс"));
		
	ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Бюджет от %1'"),
		ПредставлениеТекущейДатыДляИмениФайла);
	
	ВыполнитьЗаменуЗапрещенныхСимволов(ИмяФайла);
	
	ПараметрыФайла = Новый Структура();
	ПараметрыФайла.Вставить("Автор", Пользователи.АвторизованныйПользователь());
	ПараметрыФайла.Вставить("ВладелецФайлов", Объект.Ссылка);
	ПараметрыФайла.Вставить("ИмяБезРасширения", ИмяФайла);
	ПараметрыФайла.Вставить("РасширениеБезТочки", "xls");
	ПараметрыФайла.Вставить("ВремяИзмененияУниверсальное", Неопределено);
	
	Файл = РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВоВременномХранилище, Неопределено);
	
	УдалитьФайлы(ИмяВременногоФайла);
	
	Возврат Файл;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура ВыполнитьЗаменуЗапрещенныхСимволов(ИмяФайла)
	ЗапрещенныеСимволы = Новый Массив;
	ЗапрещенныеСимволы.Добавить("/");
	ЗапрещенныеСимволы.Добавить("\");
	ЗапрещенныеСимволы.Добавить("[");
	ЗапрещенныеСимволы.Добавить("]");
	ЗапрещенныеСимволы.Добавить(":");
	ЗапрещенныеСимволы.Добавить(";");
	ЗапрещенныеСимволы.Добавить("|");
	ЗапрещенныеСимволы.Добавить("=");
	ЗапрещенныеСимволы.Добавить("?");
	ЗапрещенныеСимволы.Добавить("*");
	ЗапрещенныеСимволы.Добавить("<");
	ЗапрещенныеСимволы.Добавить(">");
	
	Для каждого ЗапрещенныйСимвол Из ЗапрещенныеСимволы Цикл
		ИмяФайла = СтрЗаменить(ИмяФайла, ЗапрещенныйСимвол, "_");
	КонецЦикла;
	
КонецПроцедуры

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

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

#Область ЗагрузкаИзЭксель

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

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

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

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

&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
	
	УстановитьДоступностьЭлементовПоСтатусуСервер(Истина);
	
КонецПроцедуры

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

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

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

&НаСервере
Процедура УстановитьДоступностьЭлементовПослеПроверкиЗаполнения()
	
	МожноОбновитьБюджет = МожноОбновитьБюджет(Ложь);
	Элементы.ГруппаКоманднаяПанельБюджет.Доступность = МожноОбновитьБюджет;
	Элементы.Бюджет.КонтекстноеМеню.Доступность = МожноОбновитьБюджет;
	
КонецПроцедуры

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

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

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

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

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

#Область ВыводИОтображениеТабличногоБюджета

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

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

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

		ДлительныеОперацииКлиент.ОжидатьЗавершение(
			ФоновоеЗаданиеПодготовкаБюджета, ОповещениеОЗавершении, ПараметрыОжидания);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

#Область ВыводОтображениеИРедактированиеСпискаБюджета

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#Область ПереключениеРежимаТаблицаСписок

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

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

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

&НаКлиенте
Процедура ОбработкаАктивацииСтрокиДереваЭлементов()
	
	УстановитьПараметрыСпискаВвода(Ложь);
	
КонецПроцедуры

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

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

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

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

&НаСервере
Процедура УдалитьПримечаниеНаСервере()
	
	ПримечаниеЗавершениеВводаНаСервере("");
	Модифицированность = Истина;
	
КонецПроцедуры

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

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	ПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры

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

&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	ОчиститьСообщения();
	ПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	ПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

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

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	Если Не ЗавершениеРаботы = Истина Тогда
		ПриЗакрытииНаСервере(ИдентификаторЗадания,Объект.Ссылка);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

// СтандартныеПодсистемы.Свойства

&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
	
	УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
	УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура ДополнитьПодчиненнымиОбластямиПоИерархии(ИменаОбластей, ПодчиненныеОбластиБюджета, ДанныеЯчеек = Неопределено)

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

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

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

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

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

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

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

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

// Описание
// 
// Параметры:
// 	СоответствиеРасшифровок - Соответствие -
// 	ИдентификаторРасшифровки - Число - 
// Возвращаемое значение:
// 	Структура - структура со свойством:
// 	 *Строка - СправочникСсылка.ЭлементыФинансовыхОтчетов - Строка бюджета.
&НаКлиенте
Функция ЗначениеРасшифровкиИзСоответствияРасшифровок(СоответствиеРасшифровок, ИдентификаторРасшифровки)
	Возврат СоответствиеРасшифровок[ИдентификаторРасшифровки];
КонецФункции

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

	КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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