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

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

&НаКлиенте
Перем ИзменениеСуществующейСтроки;

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура НефинансовыйПоказательПриИзменении(Элемент)
	
	ПерерисоватьФорму(Истина);
	
КонецПроцедуры

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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



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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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

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

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