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