К статье
Практический материал

Администрирование · 11 мин

Как получить роли пользователя в 1С

Как получить роли пользователя в 1С: через конфигуратор, встроенный язык, Метаданные.Роли и функцию РольДоступна. Примеры кода, проверка прав и типичные ошибки.

Роли в 1С определяют, какие объекты конфигурации доступны пользователю: какие документы он видит, какие отчёты может сформировать, какие справочники редактировать. Задача получить список ролей конкретного пользователя возникает при аудите прав, отладке ошибок «Нарушение прав доступа», разработке логики, зависящей от полномочий, и при выгрузке прав для согласования с руководством.

Универсальной кнопки «показать все роли пользователя» в типовых интерфейсах нет, поэтому роли получают несколькими способами: через конфигуратор, встроенный язык, обработку анализа прав или запрос к метаданным. Выбор зависит от того, где вы работаете — в режиме разработчика или в пользовательском сеансе, — и от того, нужен список ролей сам по себе или проверка конкретного права.

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

Просмотр ролей через конфигуратор

Самый быстрый способ без программирования — открыть список пользователей в конфигураторе. Для этого нужны административные права и монопольный доступ не требуется: список пользователей доступен при работающих сеансах.

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

Этот способ удобен для разового просмотра, но не подходит для массового аудита: при десятках пользователей и десятках ролей ручная сверка займёт много времени и чревата ошибками. Для массового анализа лучше использовать встроенный язык или специализированные обработки.

Получение ролей пользователя кодом

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

// Найти пользователя по имени

ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");

Если ПользовательИБ = Неопределено Тогда

Сообщить("Пользователь не найден");

Возврат;

КонецЕсли;

// Перебрать назначенные роли

Для Каждого Роль Из ПользовательИБ.Роли Цикл

Сообщить(Роль.Имя);

КонецЦикла;

Для текущего пользователя сеанса есть более короткий путь — функция ПользователиИнформационнойБазы.ТекущийПользователь(), которая возвращает объект того же типа. Это удобно, когда код должен отработать в контексте запустившего его сотрудника.

Обратите внимание: метод НайтиПоИмени ищет по имени, заданному при создании пользователя, которое может отличаться от полного имени и от имени в справочнике «Пользователи» типовых конфигураций. Если поиск не даёт результата, проверьте точное имя в списке пользователей конфигуратора.

bsl
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Для Каждого Роль Из ПользовательИБ.Роли Цикл
    Сообщить(Роль.Имя);
КонецЦикла;

Проверка конкретной роли и права в коде

На практике чаще нужно не получить весь список ролей, а ответить на вопрос «есть ли у пользователя нужное полномочие». Для этого встроенный язык предлагает две функции с разным назначением.

Функция РольДоступна("ИмяРоли") возвращает Истина, если у текущего пользователя есть указанная роль. Она используется для ветвления логики: например, показать кнопку административной настройки только пользователям с ролью «АдминистраторСистемы» или «ПолныеПрава».

Если РольДоступна("ПолныеПрава") Тогда

// Показать расширенные настройки

Иначе

// Ограниченный режим

КонецЕсли;

Функция ПравоДоступа("Изменение", Метаданные.Документы.РеализацияТоваровУслуг) проверяет конкретное право на конкретный объект метаданных с учётом всех ролей пользователя. Это более корректный способ: если завтра право появится у другой роли, код не придётся переписывать. РольДоступна привязывает логику к имени роли, что хрупче при доработках конфигурации.

Что использовать

РольДоступна()

Подходит для проверки принадлежности к функциональной группе (например, «это администратор»). Зависит от имени роли.

ПравоДоступа()

Подходит для проверки конкретного действия над объектом (чтение, изменение, удаление). Устойчиво к перераспределению прав между ролями.

ПользовательИБ.Роли

Подходит для аудита и выгрузки полного списка ролей. Не учитывает права, назначенные через профили групп доступа в типовых решениях.

Роли в типовых конфигурациях: профили групп доступа

В конфигурациях на базе Библиотеки стандартных подсистем (БСП) — Бухгалтерия предприятия, Зарплата и управление персоналом, Управление торговлей, ERP — прямое назначение ролей в конфигураторе практически не используется. Вместо этого администратор в режиме предприятия создаёт профили групп доступа, включает в них роли и назначает профили пользователям или группам.

Узнать, какие роли фактически действуют для пользователя, помогает встроенный отчёт. В разделе администрирования обычно доступен отчёт «Права доступа» (или аналогичный), который показывает, какие профили назначены пользователю и какие роли в них входят. Путь к отчёту зависит от конфигурации: чаще всего это «Администрирование» → «Настройка прав и пользователей».

При программном анализе в таких конфигурациях используйте функциональность БСП, а не прямой перебор ролей объекта ПользовательИнформационнойБазы — иначе получите неполную картину, поскольку роли, назначенные через профили, в свойстве Роли пользователя ИБ не отражаются.

Массовый аудит: выгрузка ролей всех пользователей

Для инвентаризации прав по всей базе удобно выгрузить соответствие «пользователь — роли» в таблицу. Это делается небольшой обработкой или консолью кода с правами администратора.

Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл

СписокРолей = "";

Для Каждого Роль Из ПользовательИБ.Роли Цикл

СписокРолей = СписокРолей + Роль.Имя + "; ";

КонецЦикла;

Сообщить(ПользовательИБ.Имя + " | " + СписокРолей);

КонецЦикла;

Результат удобно выводить в табличный документ и сохранять в Excel для фильтрации и согласования. Такой отчёт позволяет быстро найти пользователей с избыточными правами — например, всех, у кого назначены «ПолныеПрава» или «АдминистраторСистемы».

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

Порядок аудита ролей
  1. 1
    Определите, как назначаются права: напрямую или через профили групп доступа
  2. 2
    Получите список пользователей и их ролей кодом или отчётом «Права доступа»
  3. 3
    Сверьте назначенные роли с должностными обязанностями сотрудников
  4. 4
    Найдите учётные записи с избыточными правами (ПолныеПрава, АдминистраторСистемы)
  5. 5
    Зафиксируйте результат и согласуйте изменения с руководством

Типичные ошибки и ограничения

Первая ошибка — попытка получить роли другого пользователя без административных прав. Обращение к ПользователиИнформационнойБазы требует права «Администрирование» или выполнения кода в привилегированном модуле. В обычном серверном вызове из-под рядового пользователя код вернёт ошибку доступа.

Вторая ошибка — проверка роли по её синониму (представлению) вместо имени. РольДоступна принимает именно имя роли из метаданных, а не то, как она отображается в интерфейсе. Имя можно посмотреть в дереве конфигурации: Общие → Роли.

Третья ошибка — игнорирование RLS (ограничения доступа на уровне записей). Даже если роль пользователю назначена и ПравоДоступа возвращает Истина, конкретные строки данных могут быть скрыты ограничениями на уровне записей. Проверка роли не гарантирует видимость всех данных объекта.

Четвёртая ошибка — использование РольДоступна вместо ПравоДоступа для прикладной логики. Если права на объект позже перераспределят между ролями, проверка по имени роли начнёт давать неверный результат, и ошибка проявится только у части пользователей.

Типичные ошибки
01
Проверка роли по синониму вместо имени метаданных — функция всегда возвращает Ложь
02
Перебор ролей пользователя ИБ в базе на БСП — права из профилей групп доступа не видны
03
Игнорирование RLS — роль есть, но часть записей недоступна
04
Вызов кода без привилегированного режима — ошибка нарушения прав у обычных пользователей

Как проверить результат

После получения списка ролей убедитесь, что данные полные и актуальные. Сравните программный результат с тем, что видно в конфигураторе на вкладке «Прочие» свойств пользователя, — для баз без БСП списки должны совпадать.

Проверьте поведение в режиме предприятия под учётной записью самого пользователя: попытка открыть объект, на который роль должна давать доступ, — самый надёжный тест. Сообщение «Нарушение прав доступа» при наличии роли обычно указывает на RLS или на то, что роль не включает нужное право (например, даёт только чтение, а требуется изменение).

Контрольные точки

Как проверить результат

Список ролей из кода и из конфигуратора
Норма

Списки совпадают

Тревожный признак

Расхождения — проверьте, не назначены ли права через профили групп доступа

РольДоступна() для известной роли
Норма

Возвращает Истина для роли, видимой в свойствах пользователя

Тревожный признак

Ложь при назначенной роли — проверьте имя роли в метаданных

Открытие объекта в режиме предприятия
Норма

Объект открывается и редактируется

Тревожный признак

«Нарушение прав доступа» — проверьте RLS и состав прав роли

Частые вопросы

Как узнать роли пользователя, не заходя в конфигуратор?

В типовых конфигурациях откройте отчёт «Права доступа» в разделе администрирования — он покажет профили и роли пользователя. Либо выполните код через консоль кода с правами администратора: перебор ПользователиИнформационнойБазы с выводом коллекции Роли.

Почему РольДоступна возвращает Ложь, хотя роль назначена?

Чаще всего указано не имя роли, а её синоним, либо в имени опечатка. Проверьте точное имя в дереве конфигурации: Общие → Роли. Также убедитесь, что код выполняется в контексте нужного пользователя — функция проверяет текущий сеанс.

Можно ли получить роли пользователя из другого сеанса?

Да, через ПользователиИнформационнойБазы.НайтиПоИмени() или НайтиПоУникальномуИдентификатору() — эти методы не зависят от активных сеансов. Но выполнять такой код должен пользователь с правами администрирования или привилегированный модуль.

Чем профили групп доступа отличаются от ролей?

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

Почему в свойстве Роли пользователя пусто, но он работает в базе?

Это типичная ситуация для конфигураций на БСП: роли назначены через профили групп доступа в режиме предприятия и не отражаются в объекте ПользовательИнформационнойБазы. Смотрите отчёт «Права доступа» или настройки профилей.

Как проверить, может ли пользователь редактировать конкретный документ?

Используйте ПравоДоступа("Изменение", Метаданные.Документы.ИмяДокумента). Учтите, что функция проверяет право на уровне объекта метаданных, но не учитывает RLS: конкретная запись может быть недоступна даже при наличии права.

Итог

Что важно запомнить

Роли пользователя смотрят в конфигураторе на вкладке «Прочие» или получают кодом через ПользователиИнформационнойБазы. Для проверки конкретных прав используйте ПравоДоступа(), а не привязку к имени роли. В типовых конфигурациях на БСП учитывайте профили групп доступа — прямой перебор ролей даст неполную картину.