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

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

1С 8: как определить текущего пользователя

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

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

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

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

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

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

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

ИмяПользователя = ТекПользователь.Имя; // логин, например "ИвановИИ"

ПолноеИмя = ТекПользователь.ПолноеИмя; // "Иванов Иван Иванович"

УникальныйИдентификатор = ТекПользователь.УникальныйИдентификатор; // UUID учётной записи

Язык = ТекПользователь.Язык;

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

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

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

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

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

// В общем модуле с признаком "Сервер" или "Вызов сервера"

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

// Возвращает СправочникСсылка.Пользователи

Второй — самостоятельный поиск по идентификатору пользователя ИБ, если БСП-функция недоступна или вы пишете код для нетиповой конфигурации:

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

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

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

"ВЫБРАТЬ ПЕРВЫЕ 1

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

|ИЗ

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

|ГДЕ

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

Запрос.УстановитьПараметр("Идентификатор", ИдПользователяИБ);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

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

КонецЕсли;

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

Что именно получать

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

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

СправочникСсылка.Пользователи

Нужен для заполнения реквизитов «Ответственный», «Автор», отборов в отчётах и RLS. Работает только если пользователь заведён в справочнике.

Способ 3: параметры сеанса

Во многих конфигурациях текущий пользователь один раз определяется при старте сеанса и сохраняется в параметре сеанса, например ТекущийПользователь. Тогда в любом месте кода достаточно обратиться к нему без запросов к базе:

ТекПользователь = ПараметрыСеанса.ТекущийПользователь;

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

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

Как добавить параметр сеанса «ТекущийПользователь»
  1. 1
    В конфигураторе создайте параметр сеанса с типом СправочникСсылка.Пользователи.
  2. 2
    В модуле сеанса в обработчике УстановкаПараметровСеанса найдите пользователя ИБ и сопоставленный ему элемент справочника.
  3. 3
    Запишите ссылку в ПараметрыСеанса.ТекущийПользователь.
  4. 4
    Если пользователь не найден — создайте элемент справочника или зафиксируйте пустую ссылку, но не оставляйте параметр неустановленным.
  5. 5
    Проверьте вход под обычным пользователем и под пользователем без элемента справочника.

Особые случаи: фоновые задания, веб-сервисы, внешние соединения

Не в каждом сеансе есть «реальный» пользователь. В фоновом задании ТекущийПользователь() возвращает учётную запись, под которой задание запущено: либо пользователя, явно указанного при вызове ФоновыеЗадания.Выполнить, либо пользователя сеанса-родителя. Если фоновое задание запущено регламентным заданием без указания пользователя, метод может вернуть Неопределено — обращение к свойствам приведёт к ошибке.

Поэтому в коде, который может выполняться в фоне, обязательна защитная проверка:

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

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

ИмяПользователя = "ФоновоеЗадание";

Иначе

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

КонецЕсли;

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

Как получить пользователя операционной системы

Иногда нужно знать не учётную запись 1С, а доменного пользователя Windows, например для сквозной аутентификации или логирования. На клиенте это делается через COM-объект WScript.Network:

// Только на клиенте (Windows)

Сеть = Новый COMОбъект("WScript.Network");

ПользовательОС = Сеть.UserName; // логин Windows

Домен = Сеть.UserDomain; // домен или имя компьютера

Компьютер = Сеть.ComputerName;

Способ работает только на толстом или тонком клиенте под Windows, где разрешено создание COM-объектов. На сервере Linux, в веб-клиенте и мобильной платформе он недоступен. Для кроссплатформенного варианта на сервере можно использовать переменные окружения через КомандаСистемы или читать свойство АутентификацияОС у пользователя ИБ — там хранится строка вида \\ДОМЕН\Логин, если настроена аутентификация ОС.

bsl
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Если ПользовательИБ <> Неопределено И ПользовательИБ.АутентификацияОС Тогда
    Сообщить(ПользовательИБ.ПользовательОС); // \\ДОМЕН\Логин
КонецЕсли;

Типичные ошибки и как их проверить

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

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

Третья — отсутствие обработки значения Неопределено в фоновых и регламентных заданиях. Четвёртая — получение текущего пользователя в цикле или при каждом обращении к форме: запрос к справочнику в каждом вызове заметно нагружает базу. Кэшируйте результат через параметры сеанса или повторно используемые значения.

Типичные ошибки
01
Поиск пользователя по имени вместо уникального идентификатора — код ломается после переименования учётной записи.
02
Запись объекта ПользовательИнформационнойБазы в реквизит типа СправочникСсылка — ошибка несоответствия типов при записи.
03
Отсутствие проверки на Неопределено в фоновых заданиях — падение регламентных операций.
04
Запрос к справочнику «Пользователи» при каждом обращении вместо кэширования — лишняя нагрузка на СУБД.
Контрольные точки

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

Тип полученного значения
Норма

СправочникСсылка.Пользователи — значение можно записать в реквизит документа

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

ПользовательИнформационнойБазы — это объект ОМ, не ссылка

Работа в фоновом задании
Норма

Код корректно отрабатывает при ТекущийПользователь() = Неопределено

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

Ошибка «Значение не является значением объектного типа»

Поиск по справочнику
Норма

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

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

Поиск по наименованию или имени теряет пользователя после переименования

FAQ

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

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

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

Так происходит в сеансах без аутентифицированного пользователя: регламентные задания без указанного пользователя, некоторые служебные соединения. Код должен проверять результат на Неопределено до обращения к свойствам объекта.

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

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

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

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

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

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

Что делать, если в справочнике «Пользователи» нет элемента для учётной записи?

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

Итог

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

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