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

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

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

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

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

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

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

Какие сущности «пользователь» существуют в 1С

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

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

Есть еще третий уровень — имя текущего сеанса. Функция ИмяПользователя() возвращает строку имени, под которым запущен текущий сеанс, без обращения к списку пользователей. Это самый легковесный способ, когда нужна только строка для сообщения или журнала.

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

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

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

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

Сообщить("Учетная запись для текущего сеанса не определена");

Иначе

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

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

УникальныйИд = ПользовательИБ.УникальныйИдентификатор;

КонецЕсли;

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

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

Быстрое получение имени: ИмяПользователя() и ПолноеИмяПользователя()

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

ИмяДляЖурнала = ИмяПользователя();

// Например: "ИвановИИ"

Представление = ПолноеИмяПользователя();

// Например: "Иванов Иван Иванович"

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

Получение пользователя справочника в типовых конфигурациях

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

Первый — через параметр сеанса ТекущийПользователь, который БСП устанавливает при запуске системы:

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

Второй — через программный интерфейс БСП, общий модуль «Пользователи»:

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

// Или только для чтения реквизитов без получения ссылки:

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

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

Способы получения текущего пользователя

ИмяПользователя()

Только строка имени сеанса. Быстро, без прав, но не дает объект и пустое при отсутствии учетных записей

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

Полный объект учетной записи с ролями и GUID. Может вернуть Неопределено в фоновых заданиях

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

Ссылка на справочник «Пользователи» в типовых. Быстро, подходит для документов и регистров

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

Та же ссылка через API БСП с проверками. Чуть медленнее, надежнее при рассинхронизации данных

Особенности работы в фоновых заданиях и веб-сервисах

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

Если логика фонового задания зависит от пользователя-инициатора (например, нужно записать его в результат обработки), передавайте ссылку или имя пользователя через параметры метода ФоновыеЗадания.Выполнить в момент запуска:

ПараметрыЗадания = Новый Массив;

ПараметрыЗадания.Добавить(ПараметрыСеанса.ТекущийПользователь);

ФоновыеЗадания.Выполнить("МойМодуль.ДлительнаяОперация",

ПараметрыЗадания, , "Обработка данных");

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

Проверка ролей и прав текущего пользователя

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

Если РольДоступна("ПолныеПрава") Тогда

// Пользователь — администратор по совокупности ролей

КонецЕсли;

Если ПравоДоступа("Проведение", Метаданные.Документы.ПриходныйОрдер) Тогда

// Можно проводить документ

КонецЕсли;

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

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

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

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

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

Типичные ошибки
01
Поиск пользователя справочника по наименованию вместо идентификатора учетной записи — находит не того или не находит никого
02
Отсутствие проверки на Неопределено после ТекущийПользователь() — падение кода в фоновом задании
03
Запись ИмяПользователя() в обязательный реквизит без проверки — пустые значения в базах без учетных записей
04
Ожидание интерактивного пользователя в регламентном задании — там его нет по умолчанию

Как проверить, что код возвращает правильного пользователя

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

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

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

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

ИмяПользователя() в сообщении
Норма

Совпадает с колонкой «Имя» в списке пользователей конфигуратора

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

Пустая строка — в базе нет учетных записей или сеанс фоновый

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

Заполненная ссылка, открывается карточка нужного пользователя

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

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

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

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

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

Неопределено — задание запущено без пользователя, нужна передача через параметры

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

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

Результат обычно одинаковый, но ИмяПользователя() берет строку из контекста сеанса и не создает объект, поэтому работает быстрее и не возвращает Неопределено — в худшем случае вернет пустую строку. Метод менеджера пользователей нужен, когда требуются роли, идентификатор или другие свойства учетной записи.

Почему ПараметрыСеанса.ТекущийПользователь возвращает пустую ссылку?

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

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

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

Можно ли получить список пользователей, работающих в базе прямо сейчас?

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

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

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

Работает ли ТекущийПользователь() на клиенте?

ИмяПользователя() доступна и на клиенте, и на сервере. Обращение к ПользователиИнформационнойБазы и ПараметрыСеанса в тонком и веб-клиенте выполняется только в серверном контексте — из клиентского кода вызывайте серверную процедуру в общем модуле с признаком «Сервер».

Итог

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

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