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

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

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

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

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

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

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

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

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

ИмяПользователя = ТекущийПользовательИБ.Имя; // логин

ПолноеИмя = ТекущийПользовательИБ.ПолноеИмя; // отображаемое имя

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

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

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

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

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

// Возвращает ссылку справочника "Пользователи" для текущего сеанса

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

// Более строгий вариант — вызывает исключение, если пользователь не найден

Авторизованный = Пользователи.АвторизованныйПользователь();

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

Если нужно получить не ссылку, а сразу наименование или другие реквизиты, используйте ОбщегоНазначения.ЗначенияРеквизитовОбъекта() — это быстрее, чем обращение к реквизитам через точку, которое вызывает неявный запрос к базе при каждом обращении.

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

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

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

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

Ограничение: параметр сеанса заполняется обработчиком при установке параметров сеанса. Если вход выполнен нештатно или обработчик переопределён с ошибкой, параметр может оказаться пустым. Проверяйте заполненность перед использованием в критичных местах.

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

Частая ошибка — попытка вызвать серверные механизмы напрямую из клиентского кода формы. В тонком и веб-клиенте обращение к ПользователиИнформационнойБазы и запросы к базе возможны только в серверном контексте.

Порядок действий для формы
  1. 1
    Создайте в модуле формы серверную процедуру с директивой &НаСервере
  2. 2
    Внутри неё вызовите Пользователи.ТекущийПользователь() или ПараметрыСеанса.ТекущийПользователь
  3. 3
    Верните результат в клиентскую процедуру или заполните реквизит формы
  4. 4
    Для многократного использования закешируйте значение в реквизите формы, чтобы не дёргать сервер лишний раз

Если пользователь нужен только для отображения на форме (например, в заголовке или надписи), достаточно один раз получить его при создании формы на сервере в обработчике ПриСозданииНаСервере.

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

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

Заполнение ответственного в документе

Типовой приём — переопределить обработчик ОбработкаЗаполнения в модуле объекта документа:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

Если Не ЗначениеЗаполнено(Ответственный) Тогда

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

КонецЕсли;

КонецПроцедуры;

Фильтрация данных в отчёте или списке

Для отбора «только мои документы» передайте ссылку пользователя в параметр запроса или отбора динамического списка. Это надёжнее, чем сравнение по строковому имени: наименования могут совпадать или меняться, а ссылка уникальна.

Запись автора изменений

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

Сравнение способов

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

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

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

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

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

Самый быстрый доступ в типовых конфигурациях, значение вычислено при входе. Требует корректного заполнения при старте сеанса.

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

Типичные ошибки
01
Попытка записать объект ПользовательИнформационнойБазы в реквизит типа СправочникСсылка.Пользователи — приведёт к ошибке несоответствия типов. Сначала получите ссылку через модуль Пользователи или поиск по реквизиту ИдентификаторПользователяИБ.
02
Вызов серверного метода из клиентского контекста формы — ошибка компиляции или выполнения. Выносите вызов в процедуру &НаСервере.
03
Сравнение пользователей по наименованию строкой — ломается при переименовании или совпадающих именах. Сравнивайте по ссылке.
04
Отсутствие проверки на пустое значение в сеансе без аутентификации — в документы записывается пустая ссылка. Добавляйте проверку ЗначениеЗаполнено().
05
Многократное обращение к реквизитам ссылки через точку в цикле — каждое обращение идёт в базу. Получайте реквизиты одним запросом.

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

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

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

Возвращаемое значение
Норма

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

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

Пустая ссылка, Неопределено или пустое имя

Запись в документ
Норма

Реквизит «Ответственный» заполняется при создании документа

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

Реквизит пустой или возникает ошибка типов

Работа в клиенте
Норма

Значение получено в серверной процедуре и передано на клиент

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

Ошибка вызова серверного метода из клиентского контекста

Ограничения и безопасность

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

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

Итог

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

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

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

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

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

Чем отличается ТекущийПользователь от АвторизованныйПользователь в БСП?

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

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

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

Что вернёт метод, если в базе нет ни одного пользователя?

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

Как найти элемент справочника «Пользователи» по учётной записи платформы?

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

Почему в реквизит документа записывается пустой ответственный?

Чаще всего причина в том, что код получения пользователя выполняется в контексте, где параметр сеанса не заполнен, либо возвращается пустая ссылка без проверки. Добавьте проверку ЗначениеЗаполнено() и используйте Пользователи.АвторизованныйПользователь() как более строгий вариант.