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

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

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

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

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

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

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

Что именно нужно определить: три разных «пользователя»

Прежде чем писать код, важно понять, какую сущность вы хотите получить. В экосистеме 1С под словом «пользователь» скрываются минимум три разных объекта.

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

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

Третий — пользователь операционной системы, под которым запущен клиентский сеанс. Он нужен редко, например для интеграций, и определяется отдельными средствами.

Сравнение подходов

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

Возвращает объект учётной записи ИБ. Подходит для проверки ролей, имени входа, аутентификации. Не даёт ссылку справочника.

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

Быстрый доступ к тому, что сохранено при входе. В типовых конфигурациях часто уже содержит ссылку справочника «Пользователи».

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

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

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

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

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

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

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

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

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

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

Способ 2. Параметры сеанса

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

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

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

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

Способ 3. Функции БСП: Пользователи.ТекущийПользователь()

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

// Серверный код в конфигурации с БСП

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

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

// Проверка роли с учётом привилегированного режима

ЕстьРоль = Пользователи.РолиДоступны("ДобавлениеИзменениеДокументов");

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

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

Отдельная тема — фоновые задания. Если задание запущено из сеанса пользователя методом ФоновыеЗадания.Выполнить(), оно наследует пользователя этого сеанса, и все описанные способы работают штатно.

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

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

Если ТекущийПользовательИБ = Неопределено Тогда

// Регламентное задание без пользователя:

// используем предопределённого служебного пользователя

Ответственный = Справочники.Пользователи.НайтиПоНаименованию("Робот");

Иначе

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

КонецЕсли;

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

Как проверить роль и права текущего пользователя

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

Если РольДоступна("ПолныеПрава") Тогда

// Полный доступ

КонецЕсли;

Если ПравоДоступа("Изменение", Метаданные.Справочники.Номенклатура) Тогда

// Пользователь может редактировать номенклатуру

КонецЕсли;

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

Типичные ошибки и как их избежать

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

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

Третья — вызов серверных функций определения пользователя на клиенте. ПользователиИнформационнойБазы недоступен в клиентском контексте тонкого и веб-клиента. Клиентский код должен вызывать серверную процедуру или использовать кэшированные клиентские модули БСП.

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

Порядок выбора способа под задачу

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

Если значение нужно часто и в разных местах кода — создайте параметр сеанса и заполняйте его один раз при входе. Если код работает с внешними пользователями или в сервисах — используйте Пользователи.АвторизованныйПользователь() и всегда проверяйте результат на пустую ссылку.

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

Как проверить результат

Тип возвращаемого значения
Норма

СправочникСсылка.Пользователи для БСП-функций, ПользовательИнформационнойБазы для метода платформы

Тревожный признак

Неопределено или несоответствие типов при записи в реквизит

Работа в фоновом задании
Норма

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

Тревожный признак

Ошибка или пустой автор в документах, созданных регламентным заданием

Проверка прав
Норма

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

Тревожный признак

РольДоступна() всегда возвращает Истина из-за привилегированного режима

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

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

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

Можно ли определить пользователя на клиенте в тонком клиенте?

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

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

Регламентное задание выполняется от имени пользователя, указанного в его свойствах. Если свойство не заполнено, задание работает без пользователя, и ТекущийПользователь() возвращает Неопределено. Решение — указать пользователя в настройках задания или предусмотреть в коде подстановку служебного пользователя.

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

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

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

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

Что использовать для разграничения прав на уровне записей (RLS)?

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

Итог

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

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