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

файл

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

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

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

// Возвращает соответствие правило - иерархия измерений (аналитик) для массива правил
// с указанием колонок, в которых для таблицы план-факта лимитов находится результат.
// 
// Параметры:
//  Правила - Массив из СправочникСсылка.ПравилаЛимитовПоДаннымБюджетирования - Массив правил лимитов.
//
// Возвращаемое значение:
//  Соответствие из КлючИЗначение - обновленная таблица иерархии аналитик:
//   * Ключ - СправочникСсылка.ПравилаЛимитовПоДаннымБюджетирования - Правило лимитов бюджетирования.
//   * Значение - ТаблицаЗначений - Иерархия аналитик правила с указанием колонок таблицы план-факта:
//     ** НомерВИерархии - Число - Номер строки в иерархии. Чем меньше номер, тем выше измерение (аналитика) в иерархии. 
//     					Число от 1 до (максимальное количество аналитик в бюджетировании + 2 измерения).
//     ** НомерВИерархииСредиИспользуемых - Число - Номер строки в иерархии, с учетом только используемых измерений (видов аналитик).
//     ** ИзмерениеВидАналитики - Строка - Имя измерения, например, "Организация".
//     							- ПланВидовХарактеристикСсылка.АналитикиСтатейБюджетов - Вид аналитики.
//     ** Используется - Булево - флаг использования измерения (вида аналитики).
//     ** ПутьКАналитике - Строка - Путь к данным значения измерения (аналитики).
//     					Для измерений - это имя измерения, для аналитики, это нумерованная аналитика под номером,
//     					указанном в статье.
//
Функция ИерархияАналитикПоПравиламСУказаниемКолонокИсточника(Правила) Экспорт
	
	Результат = Новый Соответствие;
	ШаблонТаблицыИерархии = Новый ТаблицаЗначений();
	ШаблонТаблицыИерархии.Колонки.Добавить("НомерВИерархии", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный)));
	ШаблонТаблицыИерархии.Колонки.Добавить("НомерВИерархииСредиИспользуемых", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный)));
	ШаблонТаблицыИерархии.Колонки.Добавить("ИзмерениеВидАналитики", Новый ОписаниеТипов("Строка, ПланВидовХарактеристикСсылка.АналитикиСтатейБюджетов",, Новый КвалификаторыСтроки(50, ДопустимаяДлина.Переменная)));
	ШаблонТаблицыИерархии.Колонки.Добавить("Используется", Новый ОписаниеТипов("Булево"));
	ШаблонТаблицыИерархии.Колонки.Добавить("ПутьКАналитике", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(100, ДопустимаяДлина.Переменная)));
	
	// 1. Получаем иерархию аналитик по правилам.
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Правила", Правила);
	
	ТекстыЗапроса = Новый Массив;
	Разделитель = ";
	|
	|//////////////////////////////////////////////////////
	|";
	
	// 1.1. Учет возможной ошибочной ситуации, когда для статьи изменены аналитики, а в правиле нет.
	// Получение измерений (видов аналитик) по умолчанию из данных модели бюджетирования и статьи.
	ТекстыЗапросаПорядокИзмерений = Новый Массив();
	ТекстОбъединить = "
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|";
	
	Текст =
	"ВЫБРАТЬ
	|	Правила.Ссылка КАК ПравилоЛимитов,
	|	1 КАК НомерИзмеренияВидаАналитикиПоУмолчанию,
	|	""Организация"" КАК ИзмерениеВидАналитики,
	|	""Организация"" КАК ПутьКАналитике
	|ПОМЕСТИТЬ АналитикиПоУмолчанию
	|ИЗ
	|	Справочник.ПравилаЛимитовПоДаннымБюджетирования КАК Правила
	|ГДЕ
	|	Правила.Ссылка В (&Правила)
	|	И Правила.Владелец.БюджетыПоОрганизациям
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	Правила.Ссылка КАК ПравилоЛимитов,
	|	2 КАК НомерИзмеренияВидаАналитикиПоУмолчанию,
	|	""Подразделение"" КАК ИзмерениеВидАналитики,
	|	""Подразделение"" КАК ПутьКАналитике
	|ИЗ
	|	Справочник.ПравилаЛимитовПоДаннымБюджетирования КАК Правила
	|ГДЕ
	|	Правила.Ссылка В (&Правила)
	|	И Правила.Владелец.БюджетыПоПодразделениям";
	ТекстыЗапросаПорядокИзмерений.Добавить(Текст);
	
	МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
	Для НомерАналитики = 1 По МаксимальноеКоличествоАналитик Цикл
		Текст =
		"ВЫБРАТЬ
		|	Правила.Ссылка КАК ПравилоЛимитов,
		|	&НомерИзмеренияВидаАналитикиПоУмолчанию КАК НомерИзмеренияВидаАналитикиПоУмолчанию,
		|	&ВидАналитики КАК ИзмерениеВидАналитики,
		|	&ПутьКАналитике КАК ПутьКАналитике
		|ИЗ
		|	Справочник.ПравилаЛимитовПоДаннымБюджетирования КАК Правила
		|ГДЕ
		|	Правила.Ссылка В (&Правила)";
		Текст = СтрЗаменить(Текст, "&НомерИзмеренияВидаАналитикиПоУмолчанию", НомерАналитики + 2);
		Текст = СтрЗаменить(Текст, "&ВидАналитики", "Правила.СтатьяБюджета.ВидАналитики" + НомерАналитики);
		Текст = СтрЗаменить(Текст, "&ПутьКАналитике", """Аналитика" + НомерАналитики + """");
		
		ТекстыЗапросаПорядокИзмерений.Добавить(Текст);
	КонецЦикла;
	
	Текст = СтрСоединить(ТекстыЗапросаПорядокИзмерений, ТекстОбъединить);
	
	ТекстыЗапроса.Добавить(Текст);
	
	// 1.2. Выбор иерархии измерений и видов аналитик из правила.
	Текст =
	"ВЫБРАТЬ
	|	ПравилаИерархияАналитик.Ссылка КАК ПравилоЛимитов,
	|	ПравилаИерархияАналитик.НомерСтроки КАК НомерСтроки,
	|	ПравилаИерархияАналитик.Используется КАК Используется,
	|	ВЫБОР
	|		КОГДА ПравилаИерархияАналитик.ИмяИзмерения <> """"
	|			ТОГДА ПравилаИерархияАналитик.ИмяИзмерения
	|		ИНАЧЕ ПравилаИерархияАналитик.ВидАналитики
	|	КОНЕЦ КАК ИзмерениеВидАналитики
	|ПОМЕСТИТЬ ИерархияИзПравил
	|ИЗ
	|	Справочник.ПравилаЛимитовПоДаннымБюджетирования.ИерархияАналитик КАК ПравилаИерархияАналитик
	|ГДЕ
	|	ПравилаИерархияАналитик.Ссылка В (&Правила)";
	
	ТекстыЗапроса.Добавить(Текст);
	
	// 1.3. Объединение наборов. Если в статье в результате ошибки есть аналитика, которой нет в статье, то она в конце иерархии и не используется. 
	Текст =
	"ВЫБРАТЬ
	|	АналитикиПоУмолчанию.ПравилоЛимитов КАК ПравилоЛимитов,
	|	АналитикиПоУмолчанию.ИзмерениеВидАналитики КАК ИзмерениеВидАналитики,
	|	АналитикиПоУмолчанию.ПутьКАналитике КАК ПутьКАналитике,
	|	ЕСТЬNULL(ИерархияИзПравил.Используется, ЛОЖЬ) КАК Используется,
	|	ЕСТЬNULL(ИерархияИзПравил.НомерСтроки, 999) * 100 +
	|		АналитикиПоУмолчанию.НомерИзмеренияВидаАналитикиПоУмолчанию КАК УровеньВИерархии
	|ИЗ
	|	АналитикиПоУмолчанию КАК АналитикиПоУмолчанию
	|		ЛЕВОЕ СОЕДИНЕНИЕ ИерархияИзПравил КАК ИерархияИзПравил
	|		ПО АналитикиПоУмолчанию.ПравилоЛимитов = ИерархияИзПравил.ПравилоЛимитов
	|		И АналитикиПоУмолчанию.ИзмерениеВидАналитики = ИерархияИзПравил.ИзмерениеВидАналитики
	|УПОРЯДОЧИТЬ ПО
	|	ПравилоЛимитов,
	|	УровеньВИерархии
	|ИТОГИ
	|ПО
	|	ПравилоЛимитов,
	|	УровеньВИерархии";
	
	ТекстыЗапроса.Добавить(Текст);
	
	Запрос.Текст = СтрСоединить(ТекстыЗапроса, Разделитель);
	
	ВыборкаПравил = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ПравилоЛимитов");
	Пока ВыборкаПравил.Следующий() Цикл
		ВыборкаУровеньВИерархии = ВыборкаПравил.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "УровеньВИерархии");
		Правило = ВыборкаПравил.ПравилоЛимитов; 
		ИерархияАналитик = ШаблонТаблицыИерархии.СкопироватьКолонки();
		НомерВИерархии = 0;
		НомерВИерархииСредиИспользуемых = 0;
		Пока ВыборкаУровеньВИерархии.Следующий() Цикл
			ВыборкаЗаписей = ВыборкаУровеньВИерархии.Выбрать();
			Пока ВыборкаЗаписей.Следующий() Цикл
				НомерВИерархии = НомерВИерархии + 1;
				Если ВыборкаЗаписей.Используется Тогда
					НомерВИерархииСредиИспользуемых = НомерВИерархииСредиИспользуемых + 1;
				КонецЕсли;
				НоваяСтрока = ИерархияАналитик.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаЗаписей, "ИзмерениеВидАналитики, Используется, ПутьКАналитике");
				НоваяСтрока.НомерВИерархии = НомерВИерархии;
				НоваяСтрока.НомерВИерархииСредиИспользуемых = ?(ВыборкаЗаписей.Используется, НомерВИерархииСредиИспользуемых, 0);
			КонецЦикла;
		КонецЦикла;
		Результат.Вставить(Правило, ИерархияАналитик);
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

#КонецЕсли

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