Подсистемы текущего пользователя. Формирует дерево подсистем, доступных текущему пользователю.
// Формирует дерево подсистем, доступных текущему пользователю.
//
// Возвращаемое значение:
// Результат - ДеревоЗначений -
// * РазделСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка раздела.
// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка подсистемы.
// * Имя - Строка - Имя подсистемы.
// * ПолноеИмя - Строка - Полное имя подсистемы.
// * Представление - Строка - Представление подсистемы.
// * Приоритет - Строка - Приоритет подсистемы.
//
Функция ПодсистемыТекущегоПользователя() Экспорт
ОписаниеТиповИдентификатора = Новый ОписаниеТипов;
ОписаниеТиповИдентификатора.Типы().Добавить("СправочникСсылка.ИдентификаторыОбъектовМетаданных");
ОписаниеТиповИдентификатора.Типы().Добавить("СправочникСсылка.ИдентификаторыОбъектовРасширений");
Результат = Новый ДеревоЗначений;
Результат.Колонки.Добавить("Ссылка", ОписаниеТиповИдентификатора);
Результат.Колонки.Добавить("Имя", ВариантыОтчетов.ОписаниеТиповСтрока(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
///////////////////////////////////////////////////////////////////////////////////////////////////////