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

Разработка и Конфигурация · 13 мин

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

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

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

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

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

Что такое «профиль пользователя» в контексте 1С

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

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

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

Получение текущего пользователя информационной базы

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

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

ИмяВхода = ПользовательИБ.Имя;

ПолноеИмя = ПользовательИБ.ПолноеИмя;

Идентификатор = ПользовательИБ.УникальныйИдентификатор;

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

Обратите внимание: если сеанс запущен без аутентификации (например, фоновое задание или внешнее соединение без указания пользователя), метод вернёт пользователя с пустым именем, а не вызовет исключение. Поэтому перед использованием результата полезно проверять Имя на пустоту, иначе последующие запросы к справочнику «Пользователи» вернут пустую ссылку.

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

Поиск пользователя по имени, идентификатору и выборка всех

Когда нужен не текущий, а произвольный пользователь, применяются методы поиска менеджера. НайтиПоИмени() ищет по имени входа, НайтиПоУникальномуИдентификатору() — по GUID, который, например, хранится в реквизите «ИдентификаторПользователяИБ» справочника «Пользователи».

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

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

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

Иначе

Сообщить("Полное имя: " + ПользовательИБ.ПолноеИмя);

КонецЕсли;

Оба метода возвращают Неопределено, если пользователь не найден, — это нормальное поведение, а не ошибка. Обязательно обрабатывайте этот случай, иначе обращение к свойству вызовет исключение «Поле объекта не обнаружено».

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

Порядок действий
  1. 1
    Определите, какой объект нужен: учётная запись ИБ, элемент справочника «Пользователи» или профиль группы доступа
  2. 2
    Для учётной записи вызовите ТекущийПользователь() или НайтиПоИмени()/НайтиПоУникальномуИдентификатору()
  3. 3
    Проверьте результат на Неопределено перед обращением к свойствам
  4. 4
    Для прикладных данных выполните запрос к справочнику «Пользователи» по ИдентификаторПользователяИБ
  5. 5
    Для прав получите профиль через группу доступа пользователя
  6. 6
    Проверьте результат под учётной записью с ограниченными правами

Связь с справочником «Пользователи» в типовых конфигурациях

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Пользователи.Ссылка КАК Ссылка,

| Пользователи.Наименование КАК Наименование,

| Пользователи.Подразделение КАК Подразделение

|ИЗ

| Справочник.Пользователи КАК Пользователи

|ГДЕ

| Пользователи.ИдентификаторПользователяИБ = &Идентификатор";

Запрос.УстановитьПараметр("Идентификатор",

ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор);

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

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

Получение профиля группы доступа пользователя

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ГруппыДоступаПользователи.Ссылка.Профиль КАК Профиль,

| ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа

|ИЗ

| Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи

|ГДЕ

| ГруппыДоступаПользователи.Пользователь = &Пользователь";

Запрос.УстановитьПараметр("Пользователь", ТекущийПользовательСсылка);

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

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

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

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

Подходит для учётных записей: имя входа, роли платформы, аутентификация. Не содержит прикладных данных и не знает о профилях доступа.

Справочник «Пользователи» + модуль Пользователи

Подходит для прикладных данных: подразделение, физлицо, недействительность. Требует конфигурации на базе БСП.

Профили групп доступа

Подходит для анализа и назначения прав в типовых решениях. Не работает в конфигурациях без БСП и не заменяет проверку РольДоступна().

Права, привилегированный режим и ограничения

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

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

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

Частые ошибки и проверка результата

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

Типичные ошибки
01
Поиск элемента справочника «Пользователи» по наименованию вместо ИдентификаторПользователяИБ — находит не того пользователя или никого
02
Отсутствие проверки на Неопределено после НайтиПоИмени() — исключение при обращении к свойству
03
Ожидание одного профиля у пользователя, который состоит в нескольких группах доступа — права анализируются неполностью
04
Чтение ПользователиИнформационнойБазы без административных прав и без привилегированного режима — ошибка нарушения прав
05
Использование ТекущийПользователь() в фоновом задании без учёта того, что оно может выполняться без аутентифицированного пользователя

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

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

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

Возвращаемое значение поиска
Норма

Объект пользователя или ссылка на элемент справочника

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

Неопределено или пустая ссылка — проверьте имя и идентификатор

Поведение под ограниченными правами
Норма

Код отрабатывает или осознанно использует привилегированный режим

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

Ошибка нарушения прав доступа

Количество профилей в выборке
Норма

Учтены все группы доступа пользователя

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

Обрабатывается только первая строка выборки

FAQ

Как получить текущего пользователя в фоновом задании?

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

Чем отличается ПользователиИнформационнойБазы от справочника «Пользователи»?

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

Можно ли получить список ролей пользователя без административных прав?

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

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

Запросом к табличной части «Пользователи» справочника «ГруппыДоступа» с отбором по пользователю вы получите все его группы и связанные профили. Итоговые права — объединение всех профилей, поэтому обрабатывайте всю выборку, а не первую строку.

Почему НайтиПоИмени() возвращает Неопределено, хотя пользователь есть в справочнике?

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

Работает ли этот код в расширении конфигурации?

Чтение через ПользователиИнформационнойБазы в расширении возможно, но в безопасном режиме и в сервисе часть операций ограничена. Если расширение предназначено для облачной публикации, тестируйте код именно в целевом окружении и предусмотрите обработку отказа в доступе.

Итог

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

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