ПодсистемыТекущегоПользователя (БСП)

Автор: 1С
ОбщийМодуль.ВариантыОтчетовПовтИсп
БСП

Подсистемы текущего пользователя. Формирует дерево подсистем, доступных текущему пользователю.

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

СвойстваДоступны (БСП)

ТекущийПользователь (БСП)

АвторизованныйПользователь (БСП)

Настройки (БСП)

ТекущийВнешнийПользователь (БСП)

ПриЗаполненииСпискаТекущихДел (БСП)

TurboConf ИР адаптер 1.75