Разработка и Конфигурация · 11 мин
Как получить пользователя информационной базы в 1С
Как получить пользователя информационной базы в 1С: методы НайтиПоИмени, НайтиПоУникальномуИдентификатору, ТекущийПользователь, примеры кода и типичные ошибки.
Пользователь информационной базы (ИБ) в 1С — это объект, описывающий учётную запись на уровне платформы: имя входа, пароль, роли, язык, уникальный идентификатор. Он не привязан к конкретной конфигурации и существует, даже если в справочнике «Пользователи» нет соответствующего элемента. Разработчику и администратору регулярно требуется программно получить такого пользователя — для проверки прав, аудита, синхронизации со справочником или настройки доступа.
Платформа предоставляет для этого менеджер ПользователиИнформационнойБазы с набором методов поиска и перебора. Выбор метода зависит от того, что известно заранее: имя входа, уникальный идентификатор, или нужно просто получить текущего пользователя сеанса. Ниже разобраны все основные способы с примерами кода, условиями применения и типичными ошибками.
Что такое объект ПользовательИнформационнойБазы и когда он нужен
Объект ПользовательИнформационнойБазы представляет одну учётную запись в списке пользователей, который виден в конфигураторе через «Администрирование — Пользователи». У объекта есть свойства: Имя, ПолноеИмя, УникальныйИдентификатор, АутентификацияСтандартная, АутентификацияОС, ПользовательОС, Роли, Язык, Пароль (только для записи) и другие.
Важно понимать разницу между пользователем ИБ и элементом справочника «Пользователи» в типовых конфигурациях. Справочник — прикладной объект, а учётная запись ИБ — платформенный. Они связаны через уникальный идентификатор, который хранится в реквизите справочника «ИдентификаторПользователяИБ». Синхронизацией этих двух сущностей в типовых решениях занимается подсистема «Пользователи» из БСП.
Получение текущего пользователя сеанса
Самая частая задача — определить, кто работает в базе прямо сейчас. Для этого используется метод ТекущийПользователь():
ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Сообщить("Имя входа: " + ТекущийПользовательИБ.Имя);
Сообщить("GUID: " + Строка(ТекущийПользовательИБ.УникальныйИдентификатор));
Метод возвращает пользователя, под которым запущен текущий сеанс. Для фоновых заданий, запущенных от имени конкретного пользователя, вернётся именно этот пользователь; для регламентных заданий без указанного пользователя возможны особенности — учитывайте это при разработке обработчиков.
Если нужен именно элемент справочника «Пользователи» (а не платформенная учётная запись), в типовых конфигурациях используйте функцию БСП Пользователи.ТекущийПользователь() или Пользователи.АвторизованныйПользователь() — они возвращают ссылку на справочник, найденную по идентификатору текущего пользователя ИБ.
Поиск пользователя по имени входа
Когда известно имя входа (то, что пользователь вводит при старте), применяется метод НайтиПоИмени(). Поиск выполняется без учёта регистра:
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ");
Если ПользовательИБ = Неопределено Тогда
Сообщить("Пользователь с таким именем не найден");
Иначе
Сообщить("Найден: " + ПользовательИБ.ПолноеИмя);
КонецЕсли;
Обязательно проверяйте результат на Неопределено — если учётной записи с таким именем нет, метод не вызывает исключение, а просто возвращает пустое значение. Обращение к свойствам такого результата без проверки приведёт к ошибке выполнения.
Имя для поиска должно совпадать именно с именем входа (свойство Имя), а не с полным именем. «Иванов Иван Иванович» в поле «Полное имя» и «ИвановИИ» в поле «Имя» — разные значения, и поиск по полному имени через этот метод не сработает.
Поиск по уникальному идентификатору
Самый надёжный способ — поиск по GUID, поскольку идентификатор не меняется при переименовании учётной записи. Именно так типовые конфигурации связывают справочник «Пользователи» с учётными записями ИБ:
Идентификатор = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-7890-abcd-ef1234567890");
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(Идентификатор);
Если ПользовательИБ = Неопределено Тогда
Сообщить("Учётная запись с таким GUID отсутствует");
КонецЕсли;
Типичный сценарий — получить пользователя ИБ из элемента справочника «Пользователи»: прочитать реквизит «ИдентификаторПользователяИБ» и передать его в метод. Если идентификатор в справочнике заполнен, а пользователь ИБ не найден — это признак рассинхронизации: учётную запись удалили вручную в конфигураторе или при загрузке базы.
Перебор всех пользователей базы
Когда нужен список всех учётных записей — для отчёта, аудита или пакетной обработки — используется метод ПолучитьПользователей(), возвращающий коллекцию:
ВсеПользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Для Каждого ПользовательИБ Из ВсеПользователи Цикл
Сообщить(ПользовательИБ.Имя + " | " + ПользовательИБ.ПолноеИмя);
КонецЦикла;
Такой перебор удобен для поиска по нестандартным условиям: например, найти всех пользователей без ролей, с отключённой стандартной аутентификацией или с устаревшими учётными записями. Отбор по ролям выполняется проверкой ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава).
Учтите, что в базах с сотнями пользователей полный перебор с обращением к данным справочника внутри цикла может выполняться заметное время. Для разовых административных отчётов это приемлемо, но в прикладной логике лучше искать конкретного пользователя по имени или GUID.
- 1Определите, что известно: имя входа, GUID или нужен текущий сеанс
- 2Вызовите соответствующий метод менеджера ПользователиИнформационнойБазы
- 3Проверьте результат на Неопределено перед обращением к свойствам
- 4При необходимости найдите связанный элемент справочника Пользователи по идентификатору
- 5Проверьте результат в тестовом сеансе под нужной учётной записью
Права доступа и ограничения
Чтение списка пользователей ИБ программным способом требует определённых прав. В типовых конфигурациях обращение к ПользователиИнформационнойБазы обычно выполняется в привилегированном модуле — УстановитьПривилегированныйРежим(Истина) — либо из кода, доступного только администраторам. Без достаточных прав вызов методов может завершаться ошибкой нарушения прав доступа.
Отдельное ограничение касается пароля: свойство Пароль доступно только для записи. Прочитать текущий пароль пользователя невозможно — платформа его не хранит в открытом виде. Проверить знание пароля программно тоже нельзя; можно только установить новый или проверить флаг ПарольУстановлен.
В клиент-серверном режиме код, работающий с пользователями ИБ, должен выполняться на сервере — в серверных процедурах и функциях общих модулей с соответствующими флагами. На клиенте этот менеджер недоступен.
Типичные ошибки и как их избежать
Наиболее распространённая ошибка — обращение к свойствам результата поиска без проверки на Неопределено. Вторая по частоте — путаница между пользователем ИБ и элементом справочника «Пользователи»: попытка передать ссылку справочника в метод, ожидающий GUID, или наоборот.
Ещё одна проблема — поиск по имени с учётом лишних пробелов или в неверном регистре при копировании из внешних систем. Хотя сам поиск регистронезависим, лишние пробелы в строке приведут к отрицательному результату. Используйте СокрЛП() для входных данных.
Проверка результата и отладка
После получения пользователя убедитесь, что найден именно тот объект. Самый надёжный критерий — совпадение уникального идентификатора с ожидаемым. Для наглядной проверки выведите имя, полное имя и GUID в журнал регистрации или сообщение.
Если поиск по GUID из справочника возвращает Неопределено, проверьте: не пустой ли идентификатор в реквизите справочника, не была ли учётная запись удалена в конфигураторе, не загружалась ли база из копии, где пользователей очищали. В типовых конфигурациях восстановить связь помогает обработка обновления данных подсистемы «Пользователи» или повторная запись элемента справочника с правильными данными.
Как проверить результат
Возвращён объект, свойства читаются без ошибок
Неопределено — пользователь не найден или неверные входные данные
GUID совпадает с идентификатором в справочнике Пользователи
GUID отличается или пуст — связь нарушена
Код выполняется на сервере, при необходимости в привилегированном режиме
Ошибка нарушения прав доступа или недоступности менеджера
Частые вопросы
Чем пользователь ИБ отличается от элемента справочника «Пользователи»?
Пользователь ИБ — платформенная учётная запись (имя входа, пароль, роли), а элемент справочника — прикладной объект конфигурации с контактами, подразделением и настройками. Связаны они через реквизит «ИдентификаторПользователяИБ». В файловой базе без БСП справочника может не быть вовсе.
Можно ли получить список пользователей, работающих в базе прямо сейчас?
Да, но не через ПользователиИнформационнойБазы. Активные сеансы возвращает метод ПолучитьСеансыИнформационнойБазы(), у каждого сеанса есть свойство Пользователь. Это актуальный список подключений, а не всех заведённых учётных записей.
Почему НайтиПоИмени возвращает Неопределено, хотя пользователь точно есть?
Чаще всего передаётся полное имя вместо имени входа, лишние пробелы в строке или код выполняется без необходимых прав. Проверьте точное значение свойства Имя в конфигураторе и оберните строку в СокрЛП().
Как узнать, какие роли назначены пользователю ИБ?
Через коллекцию ПользовательИБ.Роли — переберите её циклом или проверьте конкретную роль методом Содержит(Метаданные.Роли.ИмяРоли). Учтите, что фактические права могут дополняться профилями групп доступа на уровне прикладной логики.
Можно ли программно узнать пароль пользователя?
Нет. Свойство Пароль доступно только для записи, платформа не отдаёт пароль в открытом или хешированном виде. Доступно лишь чтение признака ПарольУстановлен и установка нового пароля с последующим вызовом метода Записать().
Что вернёт ТекущийПользователь() в регламентном задании?
Если в свойствах регламентного задания указано имя пользователя — вернётся эта учётная запись. Если пользователь не указан, поведение зависит от контекста, поэтому в коде регламентных заданий не стоит полагаться на текущего пользователя без явной проверки.
Что важно запомнить
Пользователя ИБ получают через ПользователиИнформационнойБазы: ТекущийПользователь() для сеанса, НайтиПоИмени() и НайтиПоУникальномуИдентификатору() для поиска, ПолучитьПользователей() для перебора. Всегда проверяйте результат на Неопределено, выполняйте код на сервере с достаточными правами и связывайте учётные записи со справочником по GUID, а не по имени.