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