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