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

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

Как определить текущего пользователя 1С 8.3 программно

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

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

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

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

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

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

ИмяВхода = ТекущийПользовательИБ.Имя; // логин, например "ИвановИИ"

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

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

Язык = ТекущийПользовательИБ.Язык;

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

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

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

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

Имя = ИмяПользователя(); // "ИвановИИ" или ""

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

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

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

// Вариант 1: серверный вызов

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

// Вариант 2: на клиенте через кэшированный вызов

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

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

Определение пользователя на клиенте и в веб-клиенте

Объект ПользователиИнформационнойБазы недоступен в тонком и веб-клиенте — это серверный API. Поэтому на клиенте есть два пути: использовать функцию ИмяПользователя() (работает везде) либо вызывать серверную процедуру, которая вернёт нужные данные.

&НаКлиенте

Процедура ПриОткрытии(Отказ)

ИмяДляЗаголовка = ИмяПользователя();

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

&НаСервере

Функция ПолучитьДанныеПользователя()

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

Возврат Новый Структура("Имя, ПолноеИмя", ПользовательИБ.Имя, ПользовательИБ.ПолноеИмя);

КонецФункции

В веб-клиенте дополнительно учитывайте, что аутентификация может выполняться через веб-сервер (например, средствами IIS или Apache), и имя пользователя операционной системы будет отличаться от имени в 1С. Ориентируйтесь именно на учётную запись информационной базы, а не на системные переменные окружения.

Определение пользователя в фоновых и регламентных заданиях

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

Чтобы фоновое задание выполнялось от имени конкретного пользователя, передайте его третьим параметром метода ФоновыеЗадания.Выполнить:

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

ПараметрыВыполнения, КлючЗадания, "Наименование задания");

// пользователь задаётся через параметры выполнения в новых версиях платформы

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

Дополнительные сведения о сеансе пользователя

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

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

НомерСеанса = Сеанс.НомерСеанса;

ИмяКомпьютера = Сеанс.ИмяКомпьютера;

Пользователь = Сеанс.ИмяПользователя; // имя учётной записи

НачалоСеанса = Сеанс.НачалоСеанса;

Этот способ особенно полезен для аудита: например, при записи в журнал действий пользователя можно зафиксировать не только кто, но и откуда и когда выполнено действие. В кластере серверов 1С номер сеанса уникален и позволяет точно идентифицировать конкретное подключение.

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

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

Самый простой, работает на клиенте и сервере. Возвращает только строку имени входа, ничего больше.

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

Полный доступ к учётной записи: имя, полное имя, UUID, роли. Только на сервере.

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

Возвращает ссылку справочника «Пользователи» — то, что нужно для реквизитов документов. Требует БСП.

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

Даёт контекст сеанса: компьютер, номер, время начала. Подходит для аудита и журналирования.

Типичные ошибки и их устранение

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

Вторая частая проблема — пустое имя пользователя в фоновых заданиях, о котором уже говорилось выше. Третья — сравнение пользователей по строке имени вместо уникального идентификатора или ссылки. Имя может быть изменено администратором, а UUID и ссылка остаются постоянными. Всегда сравнивайте пользователей по устойчивым идентификаторам.

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

Типичные ошибки
01
Вызов ПользователиИнформационнойБазы на тонком клиенте — ошибка компиляции; выносите код на сервер.
02
Сравнение пользователей по имени строкой — ломается при переименовании; сравнивайте по UUID или ссылке.
03
Отсутствие проверки пустого имени в фоновых заданиях — документы создаются без автора.
04
Поиск элемента справочника по наименованию вместо реквизита «ИдентификаторПользователяИБ» — находит чужого или никого.
Порядок действий
  1. 1
    Определите, что нужно: имя входа, полное имя, ссылка справочника или данные сеанса.
  2. 2
    Для имени входа используйте ИмяПользователя(), для полных данных учётной записи — ПользователиИнформационнойБазы.ТекущийПользователь() на сервере.
  3. 3
    В типовой конфигурации для реквизитов документов берите Пользователи.ТекущийПользователь().
  4. 4
    На клиенте вызывайте серверную функцию или используйте ПользователиКлиент.АвторизованныйПользователь().
  5. 5
    Проверьте поведение в фоновом задании и при пустом имени пользователя.
Итог

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

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

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

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

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

Как получить текущего пользователя в управляемой форме на клиенте?

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

Почему в фоновом задании имя пользователя пустое?

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

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

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

Можно ли определить пользователя, запустившего внешнюю обработку?

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

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

Через объект WScript.Network (WSHNetwork) в COM-соединении на клиенте под Windows. Однако полагаться на это значение для логики доступа нельзя: при работе через веб-сервер или терминал оно может не соответствовать реальному пользователю. Для прикладных задач используйте учётную запись информационной базы.