Администрирование · 10 мин
Как проверить наличие роли у пользователя в 1С
Как проверить наличие роли у пользователя в 1С: функция РольДоступна, проверка через конфигуратор, СКД и права доступа. Примеры кода и типичные ошибки.
Проверка роли пользователя — одна из базовых задач при разработке и администрировании конфигураций 1С. Она нужна, когда логика программы должна различаться в зависимости от прав: например, показывать кнопку только менеджерам по продажам или запрещать проведение документа обычным пользователям.
В платформе 1С:Предприятие 8 есть встроенный механизм для такой проверки — функция РольДоступна(), а также административные инструменты: список пользователей в конфигураторе, настройка ролей в режиме предприятия и отчёт по правам доступа. Ниже разобраны все рабочие способы — от программной проверки до визуального контроля без изменения кода.
Важно понимать разницу: роль — это набор прав на объекты метаданных, а не «должность» пользователя. Один пользователь может иметь несколько ролей, и итоговые права складываются как объединение прав всех назначенных ролей.
Как устроены роли и права в 1С
Роль в 1С — это объект метаданных, который определяет права на чтение, добавление, изменение, удаление и использование объектов конфигурации: справочников, документов, регистров, отчётов и обработок. Роли создаются разработчиком в конфигураторе и затем назначаются пользователям информационной базы.
Ключевая особенность механизма: права пользователя — это сумма прав всех его ролей. Если хотя бы одна роль разрешает действие, оно считается разрешённым. Поэтому проверка «есть ли роль» и проверка «есть ли право на конкретный объект» — разные задачи, и решать их нужно разными средствами.
Также существуют предопределённые роли в типовых конфигурациях, например «ПолныеПрава» или «АдминистраторСистемы». В конфигурациях на базе БСП (Библиотека стандартных подсистем) вместо прямого назначения ролей часто используются профили групп доступа — это надстройка, которая в конечном счёте тоже сводится к ролям.
Программная проверка через РольДоступна()
Основной способ проверить наличие роли у текущего пользователя — встроенная функция РольДоступна(<ИмяРоли>). Она принимает строковое имя роли, как оно задано в конфигураторе, и возвращает булево значение: Истина, если роль назначена текущему пользователю, и Ложь в противном случае.
Если РольДоступна("ПолныеПрава") Тогда
// Действия, доступные только пользователю с полными правами
Элементы.КнопкаНастройка.Видимость = Истина;
Иначе
Элементы.КнопкаНастройка.Видимость = Ложь;
КонецЕсли;
Функция работает и на толстом, и на тонком клиенте, и в веб-клиенте, и на сервере. Важный нюанс: если указать имя несуществующей роли, будет вызвана ошибка исполнения, поэтому имя роли должно точно совпадать с именем в метаданных, включая регистр букв не имеет значения, но лишние пробелы недопустимы.
Для пользователей с ролью «ПолныеПрава» (или в привилегированном режиме) учитывайте: РольДоступна() проверяет именно назначение роли, а не фактическую доступность действия. Если нужно узнать, может ли пользователь выполнить операцию над объектом, корректнее использовать ПравоДоступа().
Если РольДоступна("ДобавлениеИзменениеДокументов") Тогда
Сообщить("Роль назначена текущему пользователю");
Иначе
Сообщить("Роль не назначена");
КонецЕсли;Проверка права доступа вместо проверки роли
Часто настоящая цель — не узнать про роль, а убедиться, что пользователь может выполнить конкретное действие. Для этого предназначена функция ПравоДоступа(<Право>, <ОбъектМетаданных>). Она учитывает все роли пользователя сразу и возвращает итоговое право.
Если ПравоДоступа("Изменение", Метаданные.Документы.РеализацияТоваровУслуг) Тогда
// Пользователь может изменять документы реализации
КонецЕсли;
Такой подход устойчивее к изменениям конфигурации: если администратор создаст новую роль с теми же правами, код с ПравоДоступа() продолжит работать корректно, а проверка через РольДоступна() потребует доработки. Прямую проверку роли оправданно применять, когда логика жёстко привязана к конкретной роли — например, при разграничении интерфейса.
Что выбрать для проверки
Когда логика привязана к конкретной роли: видимость элементов интерфейса, особые сценарии для администраторов. Ограничение: не учитывает новые роли с аналогичными правами.
Когда важен факт возможности действия над объектом: изменение документа, чтение регистра. Учитывает все роли суммарно, устойчиво к изменениям в настройке прав.
В типовых конфигурациях с БСП — проверка через подсистему управления доступом. Рекомендуется для кода, встроенного в типовую конфигурацию.
Как проверить роль другого пользователя
Функция РольДоступна() всегда относится к текущему сеансу. Если нужно узнать, какие роли назначены другому пользователю, применяется объект ПользователиИнформационнойБазы. Пример кода, выполняемого на сервере с достаточными правами:
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");
Если ПользовательИБ <> Неопределено Тогда
Для Каждого Роль Из ПользовательИБ.Роли Цикл
Сообщить(Роль.Имя);
КонецЦикла;
КонецЕсли;
Для проверки конкретной роли у конкретного пользователя коллекцию ролей перебирают и сравнивают имена. Учтите, что доступ к ПользователиИнформационнойБазы требует права «Администрирование» — обычный пользователь такой код выполнить не сможет.
В конфигурациях на базе БСП вместо прямой работы с пользователями ИБ используют функциональность справочника «Пользователи» и профилей групп доступа: роли назначаются через профили, а проверить их можно в карточке пользователя на вкладке «Права доступа».
Визуальная проверка ролей без программирования
Администратор может проверить роли пользователя без написания кода. В конфигураторе откройте меню «Администрирование → Пользователи», выберите нужного пользователя и перейдите на вкладку «Прочие» — там отображается список доступных ролей с отметками о назначении.
В режиме 1С:Предприятие в типовых конфигурациях роли видны в карточке пользователя: раздел «Администрирование → Настройки пользователей и прав → Пользователи». Там же через группы доступа видно, какие профили (а значит, и роли) действуют для пользователя.
Дополнительно в ряде типовых решений есть отчёт «Права доступа» или аналогичный, который показывает матрицу «пользователь — объект — право». Он удобен, когда нужно понять, почему пользователю доступно или недоступно конкретное действие, а не просто перечислить роли.
- 1Откройте конфигуратор и войдите под учётной записью с правами администратора
- 2Перейдите: Администрирование → Пользователи
- 3Откройте нужного пользователя двойным щелчком
- 4Перейдите на вкладку «Прочие» и найдите список ролей
- 5Отмеченные роли — назначены пользователю; сравните с требуемой ролью
Типичные ошибки при проверке ролей
Самая распространённая ошибка — опечатка в имени роли. Строка передаётся в РольДоступна() как литерал, поэтому компилятор её не проверяет, и ошибка проявляется только в момент выполнения. Чтобы снизить риск, выносите имена ролей в константы или функции-проверки.
Вторая ошибка — проверка роли вместо проверки права. Если завтра появится новая роль с теми же правами, логика «сломается» незаметно: пользователь с нужными правами не пройдёт проверку. Третья типичная ситуация — тестирование только под полными правами, когда проверка РольДоступна() ведёт себя иначе, чем у рядового пользователя, и дефект всплывает уже в рабочей базе.
Как проверить результат
Возвращает Истина для пользователя с ролью и Ложь без неё
Всегда Истина (проверка под полными правами) или ошибка исполнения (неверное имя роли)
Элементы скрываются и показываются согласно ролям у разных тестовых пользователей
Поведение одинаковое для всех — проверка не работает или не вызывается
ПравоДоступа() отражает суммарные права всех ролей пользователя
Право есть, а РольДоступна() = Ложь — использован неподходящий метод проверки
Ответы на частые вопросы
РольДоступна() возвращает Истина у всех пользователей — почему?
Скорее всего, проверка выполняется под пользователем с ролью «ПолныеПрава» либо код работает в привилегированном режиме в контексте, где права не ограничиваются. Протестируйте логику под тестовой учётной записью с ограниченным набором ролей.
Можно ли проверить роль на клиенте в управляемом приложении?
Да, функция РольДоступна() доступна на тонком и веб-клиенте, однако для надёжности бизнес-логику, связанную с безопасностью, лучше дублировать на сервере: клиентскую проверку потенциально можно обойти.
Как узнать имя роли, если я не знаю конфигурацию?
Откройте в конфигураторе ветку «Общие → Роли» дерева конфигурации — там перечислены все роли с их именами. Именно эти имена (не синонимы) нужно передавать в РольДоступна().
Чем профиль группы доступа отличается от роли?
Профиль — это настройка в режиме предприятия (в конфигурациях с БСП), которая при записи назначает пользователю соответствующие роли. Роль — объект метаданных; профиль — инструмент администратора для управления ролями без конфигуратора.
Роль назначена, но действие всё равно недоступно. В чём причина?
Проверьте ограничения доступа на уровне записей (RLS) — они могут запрещать доступ к конкретным данным даже при наличии роли. Также убедитесь, что пользователь перезашёл в базу после изменения ролей: в некоторых случаях требуется новый сеанс.
Как проверить роли сразу для всех пользователей базы?
Напишите серверную процедуру, которая перебирает ПользователиИнформационнойБазы.ПолучитьПользователей() и для каждого анализирует коллекцию Роли. Для выполнения нужны административные права; в типовых конфигурациях проще воспользоваться штатным отчётом по правам доступа.
Что важно запомнить
Для текущего пользователя применяйте РольДоступна("ИмяРоли"), для проверки фактической возможности действия — ПравоДоступа(). Роли других пользователей смотрите через ПользователиИнформационнойБазы или визуально в конфигураторе. Тестируйте логику под ограниченными правами и избегайте опечаток в именах ролей.