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

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

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

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

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

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

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

Разница между пользователем информационной базы и справочником «Пользователи»

Пользователь информационной базы — это объект встроенного механизма аутентификации платформы. У него есть имя (логин), полное имя, пароль, роли, язык и настройки аутентификации ОС. Этот объект хранится не в таблицах базы данных, а во внутренней структуре информационной базы, и доступ к нему осуществляется через менеджер ПользователиИнформационнойБазы.

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

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

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

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

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

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

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

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

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

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

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

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

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

Обращение к параметру сеанса — самый быстрый способ с точки зрения производительности: значение вычисляется один раз при установке параметров сеанса и затем хранится в памяти сервера. Поэтому в коде, который выполняется часто (например, при каждой записи документа), предпочтительнее именно этот вариант.

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

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

В конфигурациях на базе БСП есть готовый программный интерфейс — общий модуль «Пользователи». Основные вызовы:

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

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

// То же самое, но через клиентский вызов (в клиентском коде)

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

// Авторизованный пользователь с проверкой

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

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

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

Порядок действий в типовой конфигурации
  1. 1
    Определите, что нужно: ссылка справочника «Пользователи» или учётная запись ИБ
  2. 2
    Для ссылки вызовите Пользователи.ТекущийПользователь()
  3. 3
    Для учётной записи вызовите ПользователиИнформационнойБазы.ТекущийПользователь()
  4. 4
    Проверьте результат на пустую ссылку или пустое имя перед использованием
  5. 5
    Протестируйте код под обычным пользователем без полных прав

Особые случаи: фоновые задания, веб-сервисы, внешние соединения

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

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

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

Проверка результата и типичные ошибки

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

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

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

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

Типичные ошибки
01
Сравнение имени пользователя (строки) со ссылкой справочника — типы не совпадают, условие не срабатывает
02
Отсутствие проверки на пустую ссылку в фоновых заданиях — документы записываются без ответственного
03
Поиск элемента справочника по наименованию — при одинаковых ФИО находится не тот пользователь
04
Использование текущего пользователя вместо ролей для контроля прав — защита не работает

Сравнение способов и рекомендации по выбору

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

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

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

Сравнение вариантов

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

Подходит для проверки логина и свойств учётной записи. Не даёт ссылку справочника и не работает как реквизит документа.

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

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

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

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

Часто задаваемые вопросы

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

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

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

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

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

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

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

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

Как узнать, под каким пользователем выполняется веб-сервис?

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

Итог

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

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