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

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

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

Способ 1: Перебор всех пользователей информационной базы

Наиболее очевидный, но не самый оптимальный метод — это полный обход списка всех пользователей с проверкой их прав. Часто такая необходимость возникает, когда требуется провести комплексный анализ прав и ролей в системе — в этом поможет обработка быстрого аудита прав доступа пользователей. Алгоритм действий следующий:

  1. Извлечение полного списка пользователей с помощью объекта ПользователиИнформационнойБазы.
  2. Перебор полученного массива в цикле.
  3. Проверка коллекции ролей каждого пользователя на наличие искомого права.
  4. Сохранение подходящих пользователей в результирующий массив.

Пример программной реализации этого метода:


// Имя роли для поиска
ИмяИскомойРоли = "ПолныеПрава"; 

// Получаем объект метаданных роли
НужнаяРоль = Метаданные.Роли.Найти(ИмяИскомойРоли);

// Проверка на существование роли
Если НужнаяРоль = Неопределено Тогда
    Сообщить("Указанная роль '" + ИмяИскомойРоли + "' не найдена в конфигурации.");
    Возврат;
КонецЕсли;

// Массив для хранения результата
ПользователиСНужнойРолью = Новый Массив;

// Получение всех пользователей ИБ
ВсеПользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();

// Цикл по всем пользователям
Для Каждого ТекущийПользователь Из ВсеПользователи Цикл
    // Проверка наличия роли у конкретного пользователя
    Если ТекущийПользователь.Роли.Содержит(НужнаяРоль) Тогда
        ПользователиСНужнойРолью.Добавить(ТекущийПользователь);
    КонецЕсли;
КонецЦикла;

// Вывод имен найденных пользователей
Для Каждого НайденныйПользователь Из ПользователиСНужнойРолью Цикл
    Сообщить(НайденныйПользователь.Имя);
КонецЦикла;

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

Способ 2: Использование менеджера «РолиПользователей» (Оптимальный)

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

Разберем этапы реализации.

Шаг 1: Поиск объекта роли в метаданных

Для работы метода нам требуется объект метаданных роли. Его можно получить из коллекции Метаданные.Роли, используя системное имя.


// Системное имя роли из конфигуратора
ИмяРоли = "АдминистраторСистемы"; 

// Поиск объекта метаданных
ОбъектРоли = Метаданные.Роли.Найти(ИмяРоли);

Обязательно добавьте проверку на Неопределено. Если роль будет переименована или удалена, отсутствие проверки приведет к аварийному завершению работы скрипта.


Если ОбъектРоли = Неопределено Тогда
    ВызватьИсключение("Роль не найдена: " + ИмяРоли);
КонецЕсли;

Шаг 2: Получение итогового списка

Имея объект роли, мы вызываем метод ПолучитьПользователей(). Он мгновенно возвращает массив объектов типа ПользовательИнформационнойБазы, обладающих данной ролью.


// Прямое получение массива пользователей одной командой
МассивПользователей = РолиПользователей.ПолучитьПользователей(ОбъектРоли);

Этот метод оптимизирован на уровне платформы и работает значительно быстрее ручного перебора.

Шаг 3: Универсальная функция

Рекомендуется оформить данный код в виде универсальной функции.


&НаСервереБезКонтекста
Функция ПолучитьПользователейСРолью(ИмяРоли) Экспорт

    // 1. Поиск объекта метаданных
    ОбъектРоли = Метаданные.Роли.Найти(ИмяРоли);

    // 2. Валидация
    Если ОбъектРоли = Неопределено Тогда
        ТекстОшибки = "Ошибка: Роль """ + ИмяРоли + """ отсутствует в метаданных.";
        ЗаписьЖурналаРегистрации("ПраваДоступа.ПоискПользователей", УровеньЖурналаРегистрации.Ошибка,,, ТекстОшибки);
        Возврат Новый Массив;
    КонецЕсли;

    // 3. Быстрое получение списка через платформенный механизм
    Возврат РолиПользователей.ПолучитьПользователей(ОбъектРоли);

КонецФункции

// Пример практического применения:
СписокАдминов = ПолучитьПользователейСРолью("АдминистраторСистемы");

Для Каждого ТекПользователь Из СписокАдминов Цикл
    Сообщить("Доступ разрешен: " + ТекПользователь.ПолноеИмя);
КонецЦикла;

Итоги и рекомендации

Основное преимущество использования РолиПользователей.ПолучитьПользователей() заключается в скорости. В отличие от первого способа, платформа выполняет запрос к данным максимально эффективно. Ручной перебор всех пользователей следует считать устаревшим подходом — для комплексной проверки лучше использовать отчет для детального анализа прав и ролей.

При разработке сложных механизмов, таких как автоматическая выдача временных прав или массовое копирование ролей и прав пользователей, всегда выбирайте второй способ — для упрощения администрирования используйте утилиту для настройки и аудита прав доступа. Это обеспечит стабильную работу системы и предотвратит проблемы с производительностью при росте количества учетных записей в вашей базе 1С.

← На главную