Как программно получить список пользователей из группы доступа в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В задачах администрирования и автоматизации прав в 1С часто возникает необходимость получить список пользователей, которые включены в определенную группу доступа. Это может потребоваться для формирования отчетов по правам, для копирования ролей и прав пользователей при их переносе между группами или для работы с временными правами пользователей. Рассмотрим, как решить эту задачу программным способом в среде 1С:Предприятие 8.

Решение 1: Прямое обращение к объекту группы доступа

Самый простой и наглядный способ получить состав группы — это найти нужный элемент в плане видов характеристик ГруппыДоступа и обратиться к его табличной части Состав. Этот метод идеально подходит для простых сценариев, когда нужно выполнить анализ прав и ролей в рамках одной конкретной группы.

Разберем по шагам:

  1. Находим нужную группу. Для этого можно использовать методы НайтиПоНаименованию() или НайтиПоКоду() объекта ПланыВидовХарактеристик.ГруппыДоступа. Поиск по наименованию более удобен для интерактивной работы, но может быть ненадёжным, если наименования могут меняться.
  2. Обращаемся к табличной части. У найденного объекта группы доступа есть табличная часть с именем Состав. В ней хранятся ссылки на пользователей (или другие группы доступа, если используется вложенность), которые входят в данную группу.
  3. Обрабатываем результат. Мы можем перебрать строки табличной части в цикле или выгрузить ее в таблицу значений для дальнейшей обработки.

Посмотрим на пример кода, который реализует этот алгоритм. В данном примере мы ищем группу с наименованием «Администраторы» и выводим ее состав в сообщения пользователю.


// Укажем наименование группы, состав которой мы хотим получить
ИмяИскомойГруппы = "Администраторы";

// Ищем ссылку на группу доступа по ее наименованию
СсылкаНаГруппу = ПланыВидовХарактеристик.ГруппыДоступа.НайтиПоНаименованию(ИмяИскомойГруппы);

// Проверяем, найдена ли группа
Если ЗначениеЗаполнено(СсылкаНаГруппу) Тогда
    
    // Если группа найдена, получаем ее объект
    ОбъектГруппы = СсылкаНаГруппу.ПолучитьОбъект();
    
    // Проверяем, есть ли кто-то в составе группы
    Если ОбъектГруппы.Состав.Количество() > 0 Тогда
        
        Сообщить("Состав группы доступа '" + ИмяИскомойГруппы + "':");
        
        // Перебираем строки табличной части "Состав"
        Для Каждого СтрокаСостава Из ОбъектГруппы.Состав Цикл
            // Выводим наименование пользователя в окно сообщений
            Сообщить(" - " + СтрокаСостава.Пользователь);
        КонецЦикла;
        
    Иначе
        Сообщить("Группа доступа '" + ИмяИскомойГруппы + "' пуста.");
    КонецЕсли;
    
Иначе
    Сообщить("Группа доступа с наименованием '" + ИмяИскомойГруппы + "' не найдена!");
КонецЕсли;

Важный момент: вместо получения всего объекта через ПолучитьОбъект(), можно работать напрямую со ссылкой, что более производительно, если не требуется изменять данные. Однако для доступа к табличной части получение объекта является стандартной практикой. В данном случае, поскольку данные только читаются, можно было бы обойтись и без ПолучитьОбъект(), просто обратившись к СсылкаНаГруппу.Состав.

Решение 2: Использование запроса к базе данных

Когда требуется обработать данные по нескольким группам, получить дополнительную информацию о пользователях или выполнить быструю проверку прав доступа на объект метаданных, лучшим выбором будет использование запроса. Запрос позволяет получить нужные данные за одно обращение к базе данных, что гораздо эффективнее, чем перебор объектов в цикле.

Запрос будет обращаться к плану видов характеристик ГруппыДоступа и его табличной части Состав.

Проанализируем структуру запроса:

  1. Основная таблица: ПланВидовХарактеристик.ГруппыДоступа.Состав. Это виртуальная таблица, содержащая данные из табличных частей всех групп.
  2. Связь с основной таблицей: В этой таблице есть поле Ссылка, которое указывает на саму группу доступа.
  3. Условие: Мы отбираем только те строки, где Ссылка равна интересующей нас группе.
  4. Выбираемые поля: Нам нужно поле Пользователь, которое содержит ссылку на элемент справочника Пользователи или ВнешниеПользователи.

Давайте посмотрим, как это выглядит в коде:


// Найдем нужную группу, как и в первом примере
ИмяИскомойГруппы = "Администраторы";
СсылкаНаГруппу = ПланыВидовХарактеристик.ГруппыДоступа.НайтиПоНаименованию(ИмяИскомойГруппы);

Если НЕ СсылкаНаГруппу.Пустая() Тогда
    // Создаем новый объект Запрос
    Запрос = Новый Запрос;
    
    // Устанавливаем текст запроса
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ГруппыДоступаСостав.Пользователь КАК Пользователь
        |ИЗ
        |   ПланВидовХарактеристик.ГруппыДоступа.Состав КАК ГруппыДоступаСостав
        |ГДЕ
        |   ГруппыДоступаСостав.Ссылка = &ГруппаДоступа";
        
    // Устанавливаем значение параметра в запросе
    Запрос.УстановитьПараметр("ГруппаДоступа", СсылкаНаГруппу);
    
    // Выполняем запрос и получаем результат
    РезультатЗапроса = Запрос.Выполнить();
    
    // Выгружаем результат в таблицу значений
    ТаблицаПользователей = РезультатЗапроса.Выгрузить();
    
    // Теперь можно работать с таблицей пользователей
    Сообщить("Состав группы доступа '" + ИмяИскомойГруппы + "' (получено запросом):");
    Для Каждого СтрокаПользователя Из ТаблицаПользователей Цикл
        Сообщить(" - " + СтрокаПользователя.Пользователь);
    КонецЦикла;
    
Иначе
    Сообщить("Группа доступа с наименованием '" + ИмяИскомойГруппы + "' не найдена!");
КонецЕсли;

Что важно знать о структуре прав доступа

При работе с правами доступа в 1С полезно понимать взаимосвязь ключевых объектов:

Связь между ними такая: одна Группа доступа может включать в себя несколько Профилей. Таким образом, пользователи, входящие в эту группу, получают совокупность прав из всех профилей, назначенных группе. В некоторых случаях после изменения настроек может потребоваться точечный пересчет прав доступа для пользователя.

В итоге, выбор между прямым обращением к объекту и запросом зависит от масштаба задачи. Для разового получения состава одной группы первый способ проще и понятнее. Для массовых операций, формирования отчетов или в коде, критичном к производительности, всегда следует отдавать предпочтение запросам.

← На главную