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

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

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

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

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

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

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

Проверка роли через конфигуратор

Самый прямой способ увидеть роли конкретного пользователя — открыть список пользователей информационной базы. Для этого запустите конфигуратор под учётной записью с правами администратора и перейдите в меню Администрирование → Пользователи. В открывшемся списке найдите нужную учётную запись и откройте её двойным щелчком.

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

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

Программная проверка: функция РольДоступна

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

bsl
Если РольДоступна("ПолныеПрава") Тогда
    Сообщить("У текущего пользователя полные права");
ИначеЕсли РольДоступна("МенеджерПоПродажам") Тогда
    Сообщить("Текущий пользователь — менеджер по продажам");
Иначе
    Сообщить("Специальных ролей не назначено");
КонецЕсли;

Функция работает и на клиенте, и на сервере, но с оговоркой: в тонком и веб-клиенте вызов на клиенте может быть ограничен в зависимости от настроек безопасности, поэтому в прикладном коде проверку прав принято выполнять в серверных процедурах. Для управления интерфейсом (видимостью кнопок, команд) результат серверной проверки передаётся в клиентский контекст.

Имя роли указывается так, как оно записано в конфигураторе — без пробелов, с учётом регистра не требуется, но лучше копировать имя точно из метаданных. Если указать имя несуществующей роли, платформа вызовет исключение, поэтому при сомнениях сначала проверьте наличие роли через метаданные:

bsl
Если Метаданные.Роли.Найти("МенеджерПоПродажам") <> Неопределено Тогда
    Результат = РольДоступна("МенеджерПоПродажам");
КонецЕсли;

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

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

bsl
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Сообщить("Имя: " + ТекущийПользователь.Имя);
Сообщить("Полное имя: " + ТекущийПользователь.ПолноеИмя);

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

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

Если сеанс запущен без аутентификации (например, внешнее соединение или фоновое задание без указания пользователя), объект текущего пользователя может иметь пустое имя. В таком случае проверка РольДоступна вернёт результат для «пользователя по умолчанию», что часто становится источником ошибок в регламентных заданиях.

Проверка прав без привязки к конкретной роли

Проверять роль напрямую — не всегда лучшее решение. Если завтра в конфигурации появится новая роль «Старший менеджер» с теми же возможностями, код с жёсткой проверкой РольДоступна("МенеджерПоПродажам") придётся переписывать. Более устойчивый подход — проверять право на конкретный объект:

bsl
Если ПравоДоступа("Изменение", Метаданные.Документы.РеализацияТоваровУслуг) Тогда
    // Пользователь может изменять документы реализации
КонецЕсли;

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

Сравнение вариантов

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

Подходит, когда логика привязана именно к роли (например, особый интерфейс для роли «Кассир»). Минус: ломается при переименовании роли и не учитывает новые роли с похожими правами.

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

Подходит для проверки возможности выполнить операцию с объектом. Устойчиво к изменениям состава ролей, но не отвечает на вопрос «какая именно роль назначена».

ПользователиИнформационнойБазы

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

Проверка ролей в конфигурациях на БСП

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

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

Для визуальной диагностики в режиме предприятия откройте карточку пользователя в разделе администрирования и посмотрите, в какие группы доступа он входит. Затем откройте профиль соответствующей группы — там виден список ролей и разрешённых действий. Такой путь надёжнее, чем поиск по конфигуратору, потому что показывает реальную картину с учётом всех надстроек БСП.

Типичные ошибки при проверке ролей

Типичные ошибки
01
Проверка по имени пользователя вместо роли: код вида «Если ИмяПользователя() = "Иванов"» ломается при смене сотрудника и игнорирует модель прав.
02
Опечатка в имени роли: РольДоступна с несуществующим именем вызывает исключение и останавливает выполнение кода.
03
Игнорирование полных прав: пользователь с ролью ПолныеПрава получает Истина от РольДоступна для любой роли, что искажает логику, если это не учтено.
04
Проверка роли вместо права: пользователь может иметь нужное право через другую роль, и жёсткая проверка роли ошибочно ему отказывает.
05
Забытый привилегированный режим: код в фоновом задании или на сервере без нужных прав возвращает Ложь, и это принимают за отсутствие роли у пользователя.

Отдельно стоит сказать про ограничение доступа на уровне записей (RLS). Роль может разрешать чтение документов, но шаблон ограничения внутри роли скрывает часть данных. Внешне это выглядит как «роль не работает»: пользователь открывает список, а он пустой. Проверка РольДоступна при этом честно возвращает Истина — проблема не в наличии роли, а в её шаблонах ограничений.

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

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

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

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

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

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

Возвращает Истина, но операция недоступна — ищите RLS или функциональные опции

Состав ролей в карточке пользователя
Норма

Флажки соответствуют должностным обязанностям, нет лишних административных ролей

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

Назначены ПолныеПрава «на всякий случай» — это риск для безопасности данных

Поведение после изменения ролей
Норма

После перезахода пользователя права соответствуют новым настройкам

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

Права не изменились — сеанс не был перезапущен или право даёт другая роль

FAQ

Можно ли проверить роль другого пользователя, а не текущего?

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

Почему РольДоступна возвращает Истина для любой роли?

Так происходит, если текущему пользователю назначена роль «ПолныеПрава» (или аналог с правом Администрирование). Платформа считает, что полные права включают все остальные роли. Если логика программы должна отличать «настоящего» обладателя роли от администратора, проверяйте состав ролей через коллекцию Роли объекта пользователя.

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

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

Чем роль отличается от права в 1С?

Право — это элементарное разрешение на действие с объектом: чтение, добавление, изменение, проведение и т.д. Роль — это именованный набор таких прав, объединённый по смыслу (например, «Кассир» или «Бухгалтер»). Пользователю назначаются роли, а итоговые права вычисляются как объединение прав всех его ролей.

Почему после назначения роли права не появились?

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

Где посмотреть, какие права даёт конкретная роль?

В конфигураторе: откройте ветку «Общие → Роли» в дереве конфигурации, выберите роль — справа отобразится матрица объектов и прав с отметками. Там же видно, есть ли у роли шаблоны ограничения доступа к данным (RLS) на уровне записей.

Итог

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

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