В задачах администрирования и автоматизации прав в 1С часто возникает необходимость получить список пользователей, которые включены в определенную группу доступа. Это может потребоваться для формирования отчетов по правам, для копирования ролей и прав пользователей при их переносе между группами или для работы с временными правами пользователей. Рассмотрим, как решить эту задачу программным способом в среде 1С:Предприятие 8.
Самый простой и наглядный способ получить состав группы — это найти нужный элемент в плане видов характеристик ГруппыДоступа и обратиться к его табличной части Состав. Этот метод идеально подходит для простых сценариев, когда нужно выполнить анализ прав и ролей в рамках одной конкретной группы.
Разберем по шагам:
НайтиПоНаименованию() или НайтиПоКоду() объекта ПланыВидовХарактеристик.ГруппыДоступа. Поиск по наименованию более удобен для интерактивной работы, но может быть ненадёжным, если наименования могут меняться.Состав. В ней хранятся ссылки на пользователей (или другие группы доступа, если используется вложенность), которые входят в данную группу.Посмотрим на пример кода, который реализует этот алгоритм. В данном примере мы ищем группу с наименованием «Администраторы» и выводим ее состав в сообщения пользователю.
// Укажем наименование группы, состав которой мы хотим получить
ИмяИскомойГруппы = "Администраторы";
// Ищем ссылку на группу доступа по ее наименованию
СсылкаНаГруппу = ПланыВидовХарактеристик.ГруппыДоступа.НайтиПоНаименованию(ИмяИскомойГруппы);
// Проверяем, найдена ли группа
Если ЗначениеЗаполнено(СсылкаНаГруппу) Тогда
// Если группа найдена, получаем ее объект
ОбъектГруппы = СсылкаНаГруппу.ПолучитьОбъект();
// Проверяем, есть ли кто-то в составе группы
Если ОбъектГруппы.Состав.Количество() > 0 Тогда
Сообщить("Состав группы доступа '" + ИмяИскомойГруппы + "':");
// Перебираем строки табличной части "Состав"
Для Каждого СтрокаСостава Из ОбъектГруппы.Состав Цикл
// Выводим наименование пользователя в окно сообщений
Сообщить(" - " + СтрокаСостава.Пользователь);
КонецЦикла;
Иначе
Сообщить("Группа доступа '" + ИмяИскомойГруппы + "' пуста.");
КонецЕсли;
Иначе
Сообщить("Группа доступа с наименованием '" + ИмяИскомойГруппы + "' не найдена!");
КонецЕсли;
Важный момент: вместо получения всего объекта через ПолучитьОбъект(), можно работать напрямую со ссылкой, что более производительно, если не требуется изменять данные. Однако для доступа к табличной части получение объекта является стандартной практикой. В данном случае, поскольку данные только читаются, можно было бы обойтись и без ПолучитьОбъект(), просто обратившись к СсылкаНаГруппу.Состав.
Когда требуется обработать данные по нескольким группам, получить дополнительную информацию о пользователях или выполнить быструю проверку прав доступа на объект метаданных, лучшим выбором будет использование запроса. Запрос позволяет получить нужные данные за одно обращение к базе данных, что гораздо эффективнее, чем перебор объектов в цикле.
Запрос будет обращаться к плану видов характеристик ГруппыДоступа и его табличной части Состав.
Проанализируем структуру запроса:
ПланВидовХарактеристик.ГруппыДоступа.Состав. Это виртуальная таблица, содержащая данные из табличных частей всех групп.Ссылка, которое указывает на саму группу доступа.Ссылка равна интересующей нас группе.Пользователь, которое содержит ссылку на элемент справочника Пользователи или ВнешниеПользователи.Давайте посмотрим, как это выглядит в коде:
// Найдем нужную группу, как и в первом примере
ИмяИскомойГруппы = "Администраторы";
СсылкаНаГруппу = ПланыВидовХарактеристик.ГруппыДоступа.НайтиПоНаименованию(ИмяИскомойГруппы);
Если НЕ СсылкаНаГруппу.Пустая() Тогда
// Создаем новый объект Запрос
Запрос = Новый Запрос;
// Устанавливаем текст запроса
Запрос.Текст =
"ВЫБРАТЬ
| ГруппыДоступаСостав.Пользователь КАК Пользователь
|ИЗ
| ПланВидовХарактеристик.ГруппыДоступа.Состав КАК ГруппыДоступаСостав
|ГДЕ
| ГруппыДоступаСостав.Ссылка = &ГруппаДоступа";
// Устанавливаем значение параметра в запросе
Запрос.УстановитьПараметр("ГруппаДоступа", СсылкаНаГруппу);
// Выполняем запрос и получаем результат
РезультатЗапроса = Запрос.Выполнить();
// Выгружаем результат в таблицу значений
ТаблицаПользователей = РезультатЗапроса.Выгрузить();
// Теперь можно работать с таблицей пользователей
Сообщить("Состав группы доступа '" + ИмяИскомойГруппы + "' (получено запросом):");
Для Каждого СтрокаПользователя Из ТаблицаПользователей Цикл
Сообщить(" - " + СтрокаПользователя.Пользователь);
КонецЦикла;
Иначе
Сообщить("Группа доступа с наименованием '" + ИмяИскомойГруппы + "' не найдена!");
КонецЕсли;
При работе с правами доступа в 1С полезно понимать взаимосвязь ключевых объектов:
Справочник.Пользователи: содержит список всех пользователей информационной базы.ПланВидовХарактеристик.ГруппыДоступа: это конкретные группы, в которые мы включаем пользователей. Например, "Бухгалтерия", "Менеджеры по продажам".Справочник.ПрофилиГруппДоступа: это шаблоны прав, или роли. Профиль определяет, что может делать пользователь (например, "Чтение справочника Номенклатура" или "Проведение расходных накладных"). Для детального изучения состава полномочий полезно проводить анализ и сравнение ролей.Связь между ними такая: одна Группа доступа может включать в себя несколько Профилей. Таким образом, пользователи, входящие в эту группу, получают совокупность прав из всех профилей, назначенных группе. В некоторых случаях после изменения настроек может потребоваться точечный пересчет прав доступа для пользователя.
В итоге, выбор между прямым обращением к объекту и запросом зависит от масштаба задачи. Для разового получения состава одной группы первый способ проще и понятнее. Для массовых операций, формирования отчетов или в коде, критичном к производительности, всегда следует отдавать предпочтение запросам.