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

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

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

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

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

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

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

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

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

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

ИмяВхода = ПользовательИБ.Имя; // "ИвановИИ" — логин для входа

ПолноеИмя = ПользовательИБ.ПолноеИмя; // "Иванов Иван Иванович"

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

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

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

Как получить ссылку на справочник «Пользователи»

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

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

// В конфигурациях на БСП предпочтительнее программный интерфейс:

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

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

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

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

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

Второй путь — создать собственный справочник «Пользователи» с реквизитом «ИдентификаторПользователяИБ» типа «УникальныйИдентификатор» и искать элемент по этому идентификатору:

Функция ТекущийПользователь() Экспорт

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

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

Возврат Справочники.Пользователи.ПустаяСсылка();

КонецЕсли;

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| Пользователи.Ссылка КАК Ссылка

|ИЗ

| Справочник.Пользователи КАК Пользователи

|ГДЕ

| Пользователи.ИдентификаторПользователяИБ = &Идентификатор";

Запрос.УстановитьПараметр("Идентификатор", ПользовательИБ.УникальныйИдентификатор);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Возврат Выборка.Ссылка;

КонецЕсли;

Возврат Справочники.Пользователи.ПустаяСсылка();

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

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

Где выполнять код: клиент, сервер, фоновое задание

Контекст выполнения определяет, какой способ доступен. На сервере работают все варианты: и ПользователиИнформационнойБазы, и параметры сеанса, и запросы к справочнику. На тонком и веб-клиенте доступны только параметры сеанса (и то с ограничениями по типам) и вызовы серверных функций.

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

Маршрут решения

Как выбрать действие

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

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

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

Типичные ошибки
01
Запись строки имени в реквизит типа «СправочникСсылка.Пользователи» — получите ошибку несоответствия типов или пустое значение; нужна ссылка, а не строка
02
Обращение к ПользователиИнформационнойБазы на тонком клиенте — тип недоступен, код падает; выносите вызов на сервер
03
Отсутствие проверки на Неопределено в фоновых заданиях — при сеансе без аутентификации обращение к свойствам вызовет исключение
04
Поиск элемента справочника по наименованию — при переименовании пользователя связь теряется; ищите по идентификатору пользователя ИБ
05
Прямое обращение к ПараметрыСеанса.ТекущийПользователь в обход функции БСП — при обновлении библиотеки поведение может измениться

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

Контрольные точки

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

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

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

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

Строка или Неопределено там, где ожидалась ссылка

Заполненность ссылки
Норма

ЗначениеЗаполнено(Пользователь) возвращает Истина

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

Пустая ссылка — значит, параметр сеанса не установлен или пользователь ИБ не сопоставлен со справочником

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

Пользователь определён или обработана ситуация с Неопределено

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

Ошибка «Значение не является значением объектного типа»

Практический пример: подстановка ответственного в документ

Классический сценарий — автоматическое заполнение реквизита «Ответственный» при создании документа. Для этого используется обработчик ОбработкаЗаполнения в модуле объекта документа:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)

Если Не ЗначениеЗаполнено(Ответственный) Тогда

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

КонецЕсли;

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

Если конфигурация без БСП, вместо функции библиотеки вызывается собственная серверная функция из общего модуля, описанная выше. Проверка ЗначениеЗаполнено нужна, чтобы не перезаписывать ответственного, когда документ создаётся копированием или на основании другого объекта с уже заполненным реквизитом.

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

Ограничения и особенности

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

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

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

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

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

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

Чем отличается ПользователиИнформационнойБазы от справочника «Пользователи»?

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

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

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

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

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

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

Передать его как параметр: сначала получить ссылку функцией в коде, затем установить её через Запрос.УстановитьПараметр("ТекущийПользователь", Ссылка). В запросах с СКД в типовых конфигурациях также доступен параметр «ТекущийПользователь», который заполняется автоматически из параметров сеанса.

Что вернёт ТекущийПользователь() в регламентном задании?

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

Надёжно ли искать пользователя по имени входа?

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