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

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

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

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

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

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

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

Различие между пользователем ИБ и справочником «Пользователи»

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

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

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

Поиск пользователя ИБ по имени и идентификатору

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

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

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

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

Иначе

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

КонецЕсли;

Если известен уникальный идентификатор (например, он сохранён в реквизите «ИдентификаторПользователяИБ» справочника), используйте НайтиПоУникальномуИдентификатору(). Идентификатор передаётся как строка или как объект УникальныйИдентификатор.

Ид = Новый УникальныйИдентификатор("a1b2c3d4-...");

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

Получение текущего пользователя сеанса

Самая частая задача — определить, кто сейчас работает в базе. Для пользователя ИБ это делается одной строкой:

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

ИмяВхода = ТекущийПользовательИБ.Имя;

ПолноеИмя = ТекущийПользовательИБ.ПолноеИмя;

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

ТекущийПользователь = Пользователи.ТекущийПользователь();

// или в клиентском контексте:

ТекущийПользователь = ПользователиКлиент.ТекущийПользователь();

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

Перебор всех пользователей базы

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

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

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

Если ПользовательИБ.АутентификацияСтандартная

И Не ПользовательИБ.ПарольУстановлен Тогда

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

КонецЕсли;

КонецЦикла;

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

Порядок поиска пользователя по роли
  1. 1
    Получите коллекцию через ПользователиИнформационнойБазы.ПолучитьПользователей()
  2. 2
    Найдите объект роли: Метаданные.Роли.Найти("ИмяРоли")
  3. 3
    В цикле проверяйте ПользовательИБ.Роли.Содержит(Роль)
  4. 4
    Соберите подходящих пользователей в массив или таблицу значений
  5. 5
    Проверьте результат на тестовой базе перед запуском в рабочей

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

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| Пользователи.Наименование = &Наименование

| И НЕ Пользователи.ПометкаУдаления";

Запрос.УстановитьПараметр("Наименование", "Иванов Иван Иванович");

Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда

Выборка = Результат.Выбрать();

Выборка.Следующий();

НайденныйПользователь = Выборка.Ссылка;

КонецЕсли;

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

bsl
// Поиск элемента справочника по идентификатору пользователя ИБ
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Пользователи
|ГДЕ ИдентификаторПользователяИБ = &Ид");
Запрос.УстановитьПараметр("Ид", ПользовательИБ.УникальныйИдентификатор);

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

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

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

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

Типичные ошибки
01
Поиск только по имени входа — после переименования учётной записи код перестаёт находить пользователя; храните уникальный идентификатор
02
Запрос к справочнику без отбора по ПометкаУдаления — в результат попадают уволенные и дубли
03
Вызов ПользователиИнформационнойБазы из непривилегированного кода — ошибка нарушения прав доступа
04
Игнорирование справочника ВнешниеПользователи — часть учётных записей не находится
Маршрут решения

Как выбрать способ поиска

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

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

Как найти пользователя по полному имени, а не по логину?

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

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

Метод возвращает Неопределено, исключение не возникает. Всегда проверяйте результат перед обращением к свойствам объекта, иначе получите ошибку «Значение не является значением объектного типа».

Как узнать, кто сейчас работает в базе?

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

Можно ли найти пользователя ИБ запросом?

Нет, пользователи информационной базы не хранятся в таблицах, доступных языку запросов. Запросом можно искать только элементы справочников «Пользователи» и «ВнешниеПользователи». Для пользователей ИБ применяйте менеджер ПользователиИнформационнойБазы.

Почему Пользователи.ТекущийПользователь() возвращает пустую ссылку?

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

Как программно проверить, есть ли у пользователя конкретная роль?

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

Итог

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

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