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

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

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

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

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

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

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

Какие «имена» бывают у пользователя в 1С

Прежде чем писать код, нужно понять, какое именно значение требуется. От этого зависит выбор метода.

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

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

Способ 1. Получить имя через ПользователиИнформационнойБазы

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

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

Метод ТекущийПользователь() возвращает объект ПользовательИнформационнойБазы, у которого доступны свойства: Имя, ПолноеИмя, УникальныйИдентификатор, АутентификацияОС, АутентификацияСтандартная, Роли и другие.

Если известен уникальный идентификатор, пользователя можно найти методом НайтиПоУникальномуИдентификатору(), а по имени — НайтиПоИмени(). Оба метода вернут Неопределено, если пользователь не найден, поэтому результат нужно проверять перед обращением к свойствам.

Способ 2. Имя пользователя в конфигурациях на БСП

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

bsl
ТекущийПользователь = Пользователи.ТекущийПользователь(); // СправочникСсылка.Пользователи

// В серверном контексте с обращением к данным:
Наименование = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийПользователь, "Наименование");

Функция Пользователи.ТекущийПользователь() возвращает ссылку на элемент справочника, а не строку. Это именно то значение, которое подставляют в реквизиты документов типа «Ответственный». Для получения строкового представления используйте Строка(ТекущийПользователь) или читайте реквизит Наименование.

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

Что выбрать

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

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

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

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

ИмяПользователя() (глобальный контекст)

Быстрая функция платформы, возвращает строку имени текущего пользователя сеанса. Не даёт доступа к полному имени и идентификатору.

Способ 3. Быстрые функции глобального контекста

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

bsl
Логин = ИмяПользователя();           // "ivanov" или "" при OS-аутентификации
ФИО = ПолноеИмяПользователя();       // "Иванов Иван Иванович"

Предупреждение("Операцию выполнил: " + ФИО);

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

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

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

bsl
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
	Если Не ЗначениеЗаполнено(Ответственный) Тогда
		Ответственный = Пользователи.ТекущийПользователь();
	КонецЕсли;
КонецПроцедуры
Порядок действий
  1. 1
    Определите тип реквизита: строка или СправочникСсылка.Пользователи
  2. 2
    Для ссылки используйте Пользователи.ТекущийПользователь(), для строки — ИмяПользователя() или ПолноеИмяПользователя()
  3. 3
    Добавьте проверку ЗначениеЗаполнено(), чтобы не перезаписывать уже установленное значение
  4. 4
    Проверьте заполнение под пользователем с ограниченными правами
  5. 5
    Проверьте сценарий фонового задания, где пользователя сеанса может не быть

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

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

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

Текущий сеанс

В клиентском приложении имя текущего пользователя обычно видно в заголовке окна или в разделе настроек пользователя. В тонком и веб-клиенте сведения о текущем сеансе доступны через «О программе» — там отображается имя пользователя, режим работы и версия платформы.

Список активных пользователей

В клиент-серверном режиме администратор видит всех работающих пользователей в консоли кластера серверов 1С: ветка «Сеансы» показывает имя пользователя, компьютер, время начала и активность. В файловом режиме список активных сеансов доступен в типовых конфигурациях через обработку «Активные пользователи» (Администрирование → Обслуживание).

Журнал регистрации

Чтобы узнать, кто выполнял конкретное действие, откройте журнал регистрации (Администрирование → Обслуживание → Журнал регистрации) и отфильтруйте по событию или пользователю. В каждой записи указано имя пользователя информационной базы, под которым выполнялось действие.

Типичные ошибки и как их избежать

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

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

Как проверить, что код работает правильно

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

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

Значение в реквизите документа
Норма

Записана ссылка на справочник «Пользователи», при переименовании отображение обновляется

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

Записана строка, после смены ФИО в документах остаётся старое значение

Работа под пользователем с OS-аутентификацией
Норма

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

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

В сообщениях и журнале пустая строка вместо пользователя

Выполнение в фоновом задании
Норма

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

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

Исключение или пустой ответственный в созданных фоном документах

Быстрая отладочная проверка — вывести все три значения рядом: ИмяПользователя(), ПолноеИмяПользователя() и строковое представление Пользователи.ТекущийПользователь(). Если они расходятся, значит, учётная запись и элемент справочника настроены по-разному, и для прикладных задач нужно опираться на справочник.

Итог

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

Для строки имени используйте ИмяПользователя() или ПользователиИнформационнойБазы.ТекущийПользователь().Имя. Для прикладных данных в типовых конфигурациях — Пользователи.ТекущийПользователь() со ссылкой на справочник. Проверяйте пустое имя при OS-аутентификации и отсутствие пользователя в фоновых заданиях.

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

Чем Имя отличается от Полного имени пользователя?

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

Почему ИмяПользователя() возвращает пустую строку?

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

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

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

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

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

Как узнать, кто изменил конкретный документ?

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

Что возвращает Пользователи.ТекущийПользователь() — строку или ссылку?

Ссылку типа СправочникСсылка.Пользователи. Чтобы получить строку для сообщения, используйте Строка() над результатом или прочитайте реквизит Наименование. Присваивать результат строковой переменной с последующим сравнением строк нельзя — типы не совпадут.