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