Виды бюджетов / Модуль менеджера

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

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

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

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

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

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

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

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

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

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

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

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

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

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

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

#Область ПроверкаВидаБюджета

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ПроверитьСоответствиеВалютыСтатьям(Параметры, СообщенияОбОшибках)
	
	СтруктураКолонокТаблицыДанных = Параметры.СтруктураКолонокТаблицыДанных;
	СтруктураОписанияОтчета = Параметры.СтруктураОписанияОтчета;

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

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

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

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

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

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

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

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

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

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

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

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

Процедура ПроверитьДублиСтрокСтатейБюджетовПоГруппам(Параметры, СообщенияОбОшибках)
	
	ДеревоЭлементов = Параметры.ДеревоЭлементовБезДопЭлементов;
	СтруктураКолонокТаблицыДанных = Параметры.СтруктураКолонокТаблицыДанных;
	СтруктураОписанияОтчета = Параметры.СтруктураОписанияОтчета;

	СтруктураПоискаГрупп = Новый Структура("ОсновнойЭлемент, ВидЭлемента", Истина,
		Перечисления.ВидыЭлементовФинансовогоОтчета.Группа);
	СтруктураЯчеекГрупп = СтруктураОписанияОтчета.СтруктураЯчеек.Скопировать(СтруктураПоискаГрупп);

	СтруктураПоиска = Новый Структура("ВидЭлемента", Перечисления.ВидыЭлементовФинансовогоОтчета.СтатьяБюджетов);

	РезультатПроверки = Новый ТаблицаЗначений;

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

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

	ОбработанныеЭлементыОтчета = Новый Массив;

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

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

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

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

Процедура ПроверитьОтсутствиеВыводаИерархииПоАналитикамВыводимымВместе(Параметры, СообщенияОбОшибках)

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

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

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

#Область ДатыБюджетаИГраницыФакта

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

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

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


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

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

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


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

#КонецЕсли

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