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