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