Разработка и Конфигурация · 11 мин
1С 8: как определить текущего пользователя
Способы определить текущего пользователя в 1С 8: ПользователиИнформационнойБазы, ПараметрыСеанса, имя пользователя ОС. Примеры кода, отличия, ошибки и FAQ.
Задача определить текущего пользователя возникает в 1С 8 постоянно: при записи документов фиксировать автора, при открытии форм подставлять ответственного, при настройке прав ограничивать доступ к данным. Платформа предоставляет несколько способов получить эту информацию, и они не взаимозаменяемы — каждый возвращает разный объект с разными свойствами.
Главное различие, которое нужно понять сразу: «пользователь информационной базы» (учётная запись, под которой выполнен вход) и «пользователь» как элемент справочника «Пользователи» в типовых конфигурациях — это разные сущности, связанные между собой, но не тождественные. Путаница между ними — самая частая причина ошибок в коде.
Ниже разобраны все рабочие способы: от штатной функции встроенного языка до получения пользователя операционной системы и тонкостей работы в фоновых заданиях.
Способ 1: ПользователиИнформационнойБазы.ТекущийПользователь()
Штатный механизм платформы — менеджер ПользователиИнформационнойБазы. Метод ТекущийПользователь() возвращает объект типа ПользовательИнформационнойБазы, описывающий учётную запись, под которой выполняется текущий сеанс.
ТекПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
ИмяПользователя = ТекПользователь.Имя; // логин, например "ИвановИИ"
ПолноеИмя = ТекПользователь.ПолноеИмя; // "Иванов Иван Иванович"
УникальныйИдентификатор = ТекПользователь.УникальныйИдентификатор; // UUID учётной записи
Язык = ТекПользователь.Язык;
Объект содержит и другие полезные свойства: АутентификацияСтандартная, АутентификацияОС, ПарольУстановлен, Роли (доступные роли учётной записи), ЗапрещеноИзменятьПароль, ПоказыватьВСпискеВыбора. Это удобно для проверки настроек безопасности прямо из кода.
Метод работает на сервере и на толстом клиенте. Важно помнить: он возвращает именно учётную запись информационной базы, а не элемент справочника. Если конфигурация ведёт свой справочник пользователей (как все типовые решения на БСП), для получения ссылки на него нужен дополнительный шаг.
Способ 2: пользователь справочника «Пользователи» в типовых конфигурациях
В конфигурациях на базе Библиотеки стандартных подсистем (УТ 11, ERP, БП 3.0, ЗУП 3.1 и других) прикладной код почти всегда работает не с учётной записью ИБ, а со ссылкой на справочник Пользователи. Именно эта ссылка хранится в реквизитах «Ответственный», «Автор», «Менеджер» документов.
Получить текущего пользователя справочника можно двумя путями. Первый — функция БСП:
// В общем модуле с признаком "Сервер" или "Вызов сервера"
ТекущийПользователь = Пользователи.ТекущийПользователь();
// Возвращает СправочникСсылка.Пользователи
Второй — самостоятельный поиск по идентификатору пользователя ИБ, если БСП-функция недоступна или вы пишете код для нетиповой конфигурации:
ИдПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Пользователи.Ссылка КАК Ссылка
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ИдентификаторПользователяИБ = &Идентификатор";
Запрос.УстановитьПараметр("Идентификатор", ИдПользователяИБ);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СсылкаНаПользователя = Выборка.Ссылка;
КонецЕсли;
Если запрос ничего не вернул, значит учётная запись не сопоставлена элементу справочника. Такое бывает у служебных учётных записей, созданных напрямую в конфигураторе или консоли кластера. Код должен корректно обрабатывать эту ситуацию, а не падать с ошибкой.
Что именно получать
Нужен для проверки ролей, логина, настроек аутентификации. Не является ссылкой, его нельзя записать в реквизит документа.
Нужен для заполнения реквизитов «Ответственный», «Автор», отборов в отчётах и RLS. Работает только если пользователь заведён в справочнике.
Способ 3: параметры сеанса
Во многих конфигурациях текущий пользователь один раз определяется при старте сеанса и сохраняется в параметре сеанса, например ТекущийПользователь. Тогда в любом месте кода достаточно обратиться к нему без запросов к базе:
ТекПользователь = ПараметрыСеанса.ТекущийПользователь;
Установка параметра обычно выполняется в обработчике УстановкаПараметровСеанса модуля сеанса. Такой подход быстрее, чем запрос к справочнику при каждом обращении, и именно его использует БСП «под капотом» через механизм кэширования.
Ограничение способа очевидно: параметр сеанса должен существовать в метаданных и корректно заполняться. В самописной конфигурации без этого механизма обращение к несуществующему параметру вызовет ошибку. Перед использованием проверьте наличие параметра в ветке «Параметры сеанса» дерева конфигурации.
- 1В конфигураторе создайте параметр сеанса с типом СправочникСсылка.Пользователи.
- 2В модуле сеанса в обработчике УстановкаПараметровСеанса найдите пользователя ИБ и сопоставленный ему элемент справочника.
- 3Запишите ссылку в ПараметрыСеанса.ТекущийПользователь.
- 4Если пользователь не найден — создайте элемент справочника или зафиксируйте пустую ссылку, но не оставляйте параметр неустановленным.
- 5Проверьте вход под обычным пользователем и под пользователем без элемента справочника.
Особые случаи: фоновые задания, веб-сервисы, внешние соединения
Не в каждом сеансе есть «реальный» пользователь. В фоновом задании ТекущийПользователь() возвращает учётную запись, под которой задание запущено: либо пользователя, явно указанного при вызове ФоновыеЗадания.Выполнить, либо пользователя сеанса-родителя. Если фоновое задание запущено регламентным заданием без указания пользователя, метод может вернуть Неопределено — обращение к свойствам приведёт к ошибке.
Поэтому в коде, который может выполняться в фоне, обязательна защитная проверка:
ТекПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Если ТекПользовательИБ = Неопределено Тогда
ИмяПользователя = "ФоновоеЗадание";
Иначе
ИмяПользователя = ТекПользовательИБ.Имя;
КонецЕсли;
При вызове через веб-сервисы и HTTP-сервисы текущим считается пользователь, указанный в настройках публикации или переданный при аутентификации. При COM-соединении и внешнем соединении — пользователь, под которым установлено соединение. Это нужно учитывать при расследовании «чужих» записей в журнале регистрации: автором изменений окажется служебная учётная запись интеграции.
Как получить пользователя операционной системы
Иногда нужно знать не учётную запись 1С, а доменного пользователя Windows, например для сквозной аутентификации или логирования. На клиенте это делается через COM-объект WScript.Network:
// Только на клиенте (Windows)
Сеть = Новый COMОбъект("WScript.Network");
ПользовательОС = Сеть.UserName; // логин Windows
Домен = Сеть.UserDomain; // домен или имя компьютера
Компьютер = Сеть.ComputerName;
Способ работает только на толстом или тонком клиенте под Windows, где разрешено создание COM-объектов. На сервере Linux, в веб-клиенте и мобильной платформе он недоступен. Для кроссплатформенного варианта на сервере можно использовать переменные окружения через КомандаСистемы или читать свойство АутентификацияОС у пользователя ИБ — там хранится строка вида \\ДОМЕН\Логин, если настроена аутентификация ОС.
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Если ПользовательИБ <> Неопределено И ПользовательИБ.АутентификацияОС Тогда
Сообщить(ПользовательИБ.ПользовательОС); // \\ДОМЕН\Логин
КонецЕсли;Типичные ошибки и как их проверить
Первая ошибка — попытка записать объект ПользовательИнформационнойБазы в реквизит типа СправочникСсылка.Пользователи. Платформа выдаст ошибку несоответствия типов. Всегда проверяйте, какой тип ожидает реквизит, и получайте именно ссылку.
Вторая — использование имени пользователя как ключа поиска. Имя можно переименовать, и после этого весь код, ищущий по строке «ИвановИИ», перестанет находить пользователя. Надёжный ключ — УникальныйИдентификатор пользователя ИБ, который не меняется в течение жизни учётной записи.
Третья — отсутствие обработки значения Неопределено в фоновых и регламентных заданиях. Четвёртая — получение текущего пользователя в цикле или при каждом обращении к форме: запрос к справочнику в каждом вызове заметно нагружает базу. Кэшируйте результат через параметры сеанса или повторно используемые значения.
Как проверить результат
СправочникСсылка.Пользователи — значение можно записать в реквизит документа
ПользовательИнформационнойБазы — это объект ОМ, не ссылка
Код корректно отрабатывает при ТекущийПользователь() = Неопределено
Ошибка «Значение не является значением объектного типа»
Поиск по ИдентификаторПользователяИБ находит пользователя после его переименования
Поиск по наименованию или имени теряет пользователя после переименования
FAQ
Чем отличается Имя от ПолноеИмя у пользователя информационной базы?
Имя — это логин, используемый при входе, обычно короткий и без пробелов. ПолноеИмя — произвольное описательное поле, куда администратор вписывает ФИО. Для отображения в интерфейсе лучше использовать ПолноеИмя, а для технической идентификации — УникальныйИдентификатор.
Почему ТекущийПользователь() возвращает Неопределено?
Так происходит в сеансах без аутентифицированного пользователя: регламентные задания без указанного пользователя, некоторые служебные соединения. Код должен проверять результат на Неопределено до обращения к свойствам объекта.
Как определить текущего пользователя на клиенте без вызова сервера?
Объект ПользователиИнформационнойБазы доступен только на сервере и толстом клиенте. На тонком и веб-клиенте получите пользователя один раз при открытии приложения через серверный вызов и сохраните в глобальной переменной модуля управляемого приложения или параметрах формы.
Как узнать, какие роли есть у текущего пользователя?
Через коллекцию Роли объекта ПользовательИнформационнойБазы или проще — функцией РольДоступна("ИмяРоли"), которая проверяет роль текущего сеанса без получения объекта пользователя. Также используется ЕстьРоль из БСП.
Можно ли определить пользователя, который создал конкретный документ?
Если в конфигурации включена версия БСП с реквизитом «Автор» — прочитайте его. Универсальный способ — журнал регистрации: отфильтруйте события «Данные.Добавление» по представлению объекта, в поле «Пользователь» будет учётная запись автора записи.
Что делать, если в справочнике «Пользователи» нет элемента для учётной записи?
Создайте элемент программно или вручную и запишите в реквизит ИдентификаторПользователяИБ значение УникальныйИдентификатор учётной записи. В типовых конфигурациях сопоставление выполняется автоматически при создании пользователя через интерфейс «Администрирование — Пользователи и права».
Что важно запомнить
Для учётной записи сеанса используйте ПользователиИнформационнойБазы.ТекущийПользователь(), для ссылки справочника в типовых конфигурациях — Пользователи.ТекущийПользователь() или поиск по идентификатору ИБ. Идентифицируйте пользователя по UUID, а не по имени, и всегда проверяйте результат на Неопределено в фоновых и регламентных заданиях.