Разработка и Конфигурация · 11 мин
Как получить пользователя 1С: способы определения текущего пользователя
Как получить текущего пользователя в 1С: ПользователиИнформационнойБазы, ПараметрыСеанса, справочник Пользователи. Примеры кода, различия методов, типичные ошибки.
Задача получить пользователя в 1С возникает постоянно: при записи автора документа, настройке прав доступа, фильтрации данных по ответственному, журналировании действий. При этом в платформе существует несколько разных сущностей, которые называют «пользователем», — и путаница между ними является источником большинства ошибок.
Ключевое различие: есть пользователь информационной базы (объект аутентификации, хранится в системных таблицах, имеет логин, пароль, роли) и есть элемент справочника «Пользователи» (прикладной объект из Библиотеки стандартных подсистем, к которому привязаны подразделение, физлицо, дополнительные реквизиты). Это разные вещи, и получаются они разными способами.
Ниже разобраны все рабочие способы: от одной строки кода до получения списка активных сеансов, с указанием, где каждый вариант уместен, а где приведёт к ошибке.
Способ 1. Получить пользователя информационной базы
Это базовый метод платформы, работающий в любой конфигурации, даже без БСП. Он возвращает объект типа ПользовательИнформационнойБазы, из которого можно прочитать имя (логин), полное имя, роли, язык и другие системные свойства.
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ИмяПользователя = ПользовательИБ.Имя; // логин, например "ИвановИИ"
ПолноеИмя = ПользовательИБ.ПолноеИмя; // "Иванов Иван Иванович"
Важная особенность: если сеанс работает без аутентификации (например, фоновое задание, запущенное регламентным образом, или внешнее соединение без указания пользователя), свойство Имя вернёт пустую строку. Поэтому перед использованием имени в логике стоит проверять его на пустоту.
Объект, полученный этим способом, нельзя использовать как реквизит документа — он не является ссылкой на данные базы. Для хранения автора в документе нужен справочник «Пользователи», о котором ниже.
Способ 2. Получить текущего пользователя через БСП
В типовых конфигурациях (Управление торговлей, ERP, Бухгалтерия, Зарплата и управление персоналом) используется Библиотека стандартных подсистем. Она предоставляет функцию, возвращающую ссылку на элемент справочника «Пользователи»:
ТекущийПользователь = Пользователи.ТекущийПользователь();
// или устаревший вариант клиентского вызова:
ТекущийПользователь = ПользователиКлиентСервер.ТекущийПользователь();
Результат — именно ссылка, которую можно записать в реквизит «Ответственный» документа, отобрать по ней данные в запросе, сравнить с владельцем объекта. Через точку доступны реквизиты справочника: подразделение, физическое лицо, недействителен и другие.
Если конфигурация самописная и БСП в ней нет, функции Пользователи.ТекущийПользователь() не существует — попытка вызова завершится ошибкой «Процедура или функция с указанным именем не определена». В этом случае используйте способ 1 или создайте собственный справочник пользователей.
Способ 3. Получить пользователя через параметры сеанса
БСП при входе пользователя в систему записывает ссылку на элемент справочника в параметр сеанса ТекущийПользователь. Обращение к нему — самый быстрый способ, потому что значение уже вычислено и не требует запроса к базе:
ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
Этот вариант удобен внутри запросов и в коде, который выполняется часто: в подписках на события, при проведении документов, в обработчиках заполнения. По факту функция Пользователи.ТекущийПользователь() внутри себя тоже опирается на параметры сеанса, поэтому разница в производительности невелика, но прямое обращение короче.
Ограничение: параметр сеанса устанавливается только если в конфигурации внедрена подсистема «Пользователи» БСП и корректно отработал обработчик установки параметров сеанса. В файловой базе при ошибках обновления параметр может оказаться не установлен — тогда обращение вернёт неопределено или вызовет исключение.
Сравнение способов: что выбрать в каждом случае
Выбор метода зависит от того, что именно требуется дальше: системное имя для журнала регистрации, ссылка для реквизита документа или проверка роли.
| Способ | Что возвращает | Когда использовать | Ограничения |
|---|---|---|---|
| ПользователиИнформационнойБазы.ТекущийПользователь() | Объект ПользовательИнформационнойБазы | Нужен логин, роли, проверка аутентификации | Не ссылка; пустое имя в фоновых заданиях |
| Пользователи.ТекущийПользователь() | Ссылка на справочник «Пользователи» | Запись в реквизиты, запросы, отборы | Требуется БСП |
| ПараметрыСеанса.ТекущийПользователь | Ссылка на справочник «Пользователи» | Частые обращения, запросы, подписки | Требуется настроенная БСП |
| ИмяПользователя() | Строка — логин | Быстро получить логин без объекта | Только имя, ничего больше |
Как выбрать действие
Получить пользователя в запросе
В тексте запроса нельзя вызвать функции встроенного языка, поэтому текущего пользователя передают как параметр. Типичный пример — отбор документов по ответственному:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Документ
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Ответственный = &ТекущийПользователь";
Запрос.УстановитьПараметр("ТекущийПользователь",
ПараметрыСеанса.ТекущийПользователь);
Распространённая ошибка — сравнивать реквизит типа «СправочникСсылка.Пользователи» со строкой имени пользователя. Такое сравнение всегда ложно, и запрос молча вернёт пустой результат. Проверяйте типы: параметр должен быть ссылкой того же справочника, что и реквизит.
Получить список пользователей и активные сеансы
Иногда нужен не текущий пользователь, а перечень всех пользователей базы или тех, кто работает прямо сейчас. Для этого есть отдельные методы.
Все пользователи информационной базы
Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
Сообщить(ПользовательИБ.Имя + " — " + ПользовательИБ.ПолноеИмя);
КонецЦикла;
Для выполнения этого кода требуются административные права. Обычный пользователь без права «Администрирование» получит нарушение прав доступа.
Активные сеансы через соединения
Соединения = ПолучитьСоединенияИнформационнойБазы();
Для Каждого Соединение Из Соединения Цикл
Если Соединение.Пользователь <> Неопределено Тогда
Сообщить(Соединение.Пользователь.Имя);
КонецЕсли;
КонецЦикла;
Метод ПолучитьСоединенияИнформационнойБазы() доступен только в клиент-серверном варианте и требует административных прав. В файловой базе он недоступен — там о активных пользователях можно судить только косвенно, по монопольному режиму или файлам блокировок.
Типичные ошибки и их последствия
Первая ошибка — сравнение объекта ПользовательИнформационнойБазы со ссылкой справочника «Пользователи». Это разные типы, сравнение всегда ложно, логика прав доступа молча перестаёт работать.
Вторая — использование Пользователи.ТекущийПользователь() в конфигурации без БСП. Код падает с ошибкой «Процедура или функция не определена» ещё на этапе компиляции модуля.
Третья — ожидание непустого имени в фоновом задании. Регламентные задания выполняются от имени служебного сеанса, и ТекущийПользователь() там может вернуть пользователя с пустым именем или предопределённого служебного пользователя. Если логика завязана на авторе, задайте его явно при постановке задания.
Как проверить результат
После внедрения кода проверьте три вещи: тип возвращаемого значения (ссылка или объект), поведение под разными пользователями и поведение в фоновом задании. Быстрый способ — вывести значение и его тип:
ТекущийПользователь = Пользователи.ТекущийПользователь();
Сообщить(ТипЗнч(ТекущийПользователь)); // СправочникСсылка.Пользователи
Сообщить(ТекущийПользователь); // представление элемента
Как проверить результат
СправочникСсылка.Пользователи для прикладной логики
Строка или объект ПользовательИнформационнойБазы там, где нужна ссылка
Возвращается именно тот пользователь, под которым выполнен вход
Пустая ссылка или чужой пользователь
Пользователь передан явно через параметры задания
Пустое имя и сбой логики отбора
Что важно запомнить
Пользователь информационной базы и элемент справочника «Пользователи» — разные сущности. Для реквизитов и запросов берите ссылку через Пользователи.ТекущийПользователь() или ПараметрыСеанса.ТекущийПользователь, для системных задач — ПользователиИнформационнойБазы.ТекущийПользователь(). В фоновых заданиях передавайте пользователя явно.
Частые вопросы
Чем отличается ИмяПользователя() от ПользователиИнформационнойБазы.ТекущийПользователь()?
Функция ИмяПользователя() возвращает только строку с логином текущего сеанса, а метод ПользователиИнформационнойБазы.ТекущийПользователь() — полноценный объект, из которого доступны полное имя, роли, пароль задан, аутентификация ОС и другие свойства. Если нужен только логин, первого варианта достаточно и он короче.
Почему Пользователи.ТекущийПользователь() возвращает пустую ссылку?
Чаще всего параметр сеанса не установлен: не отработал обработчик установки параметров БСП, вход выполнен под пользователем, которому не сопоставлен элемент справочника, или обновление конфигурации завершилось с ошибкой. Проверьте справочник «Пользователи» — у текущего пользователя ИБ должен быть связанный элемент.
Как получить пользователя внешнего соединения или веб-сервиса?
Тем же способом, что и обычного: в сеансе веб-сервиса или COM-соединения действует тот пользователь, под которым установлено соединение. Если соединение открыто без указания пользователя, имя будет пустым — логику нужно строить с учётом этого случая.
Можно ли получить пользователя по логину?
Да: ПользователиИнформационнойБазы.НайтиПоИмени("ИвановИИ") вернёт объект пользователя ИБ или Неопределено, если такого логина нет. Для поиска элемента справочника БСП используйте функцию Пользователи.НайтиПоИмени или запрос по реквизиту ИдентификаторПользователяИБ.
Как получить роли текущего пользователя?
Через объект пользователя ИБ: ПользователиИнформационнойБазы.ТекущийПользователь().Роли содержит коллекцию ролей. Однако для проверки доступа правильнее использовать функции РольДоступна("ПолныеПрава") или Пользователи.ЭтоПолноправныйПользователь() — они корректно работают и в безопасном режиме.
Работает ли ТекущийПользователь() в мобильном клиенте и тонком клиенте?
Да, серверные методы работают одинаково во всех клиентах. Важно лишь помнить, что ПользователиИнформационнойБазы и ПараметрыСеанса доступны только в серверном контексте — с клиента обращайтесь через серверные вызовы общих модулей.