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

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

Как вывести текущего пользователя в 1С

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

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

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

Ниже разобраны все рабочие способы: от одной строки кода до вывода пользователя в отчёт на СКД и на форму. Примеры подходят для платформы 8.3 и типовых конфигураций.

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

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

Из объекта можно прочитать имя для входа, полное имя, уникальный идентификатор, роли и настройки аутентификации:

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

Сообщить("Имя входа: " + ТекущийПользовательИБ.Имя);

Сообщить("Полное имя: " + ТекущийПользовательИБ.ПолноеИмя);

Сообщить("GUID: " + ТекущийПользовательИБ.УникальныйИдентификатор);

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

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

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

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

Сообщить("В базе работает: " + ТекПользователь);

Через ссылку доступны все реквизиты справочника: наименование, подразделение (если заполнено), физическое лицо, служебные признаки. Именно эту ссылку следует подставлять в реквизиты документов типа «Ответственный», «Автор», «Менеджер»:

НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

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

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

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

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

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

Если ЗначениеЗаполнено(ТекПользователь) Тогда

Сообщить("Текущий пользователь: " + ТекПользователь);

КонецЕсли;

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

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

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

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

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

Самый быстрый доступ к ссылке справочника «Пользователи». Требует БСП или собственной реализации параметра сеанса.

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

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

Вывод пользователя в сообщение, на форму и в отчёт

Сообщение и заголовок окна

Простейший вывод — через Сообщить(), как в примерах выше. Чтобы показать имя пользователя в заголовке управляемой формы, достаточно переопределить заголовок при создании:

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ЭтаФорма.Заголовок = "Журнал документов — " + ПараметрыСеанса.ТекущийПользователь;

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

Реквизит на форме

Если имя нужно отображать постоянно, добавьте на форму реквизит типа «Строка» или «СправочникСсылка.Пользователи» и заполните его в ПриСозданииНаСервере. Для надписи-украшения достаточно строки; ссылка удобнее, если по пользователю должны работать отборы и переходы.

Отчёт на СКД

В схеме компоновки данных текущего пользователя обычно используют как параметр отбора. В запросе набора данных добавьте условие вида ГДЕ Ответственный = &ТекущийПользователь, а в модуле объекта отчёта или в настройках задайте значение параметра:

КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(

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

Так отчёт «Мои документы» автоматически покажет каждому сотруднику только его данные без ручной настройки отборов.

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

Особые случаи и ограничения

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

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

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

Если ТипЗнч(ТекПользователь) = Тип("СправочникСсылка.Пользователи") Тогда

// сотрудник

Иначе

// внешний пользователь

КонецЕсли;

Толстый и тонкий клиент. Все перечисленные методы серверные. В клиентском коде управляемой формы вызывайте их через серверную процедуру с директивой &НаСервере или кэшируйте значение в реквизите формы при открытии.

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

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

Вторая ошибка — сравнение пользователя по наименованию строкой. Например, Если ПараметрыСеанса.ТекущийПользователь = "Иванов" Тогда — сравнение ссылки со строкой всегда ложно, а если сравнивать наименования, при переименовании сотрудника логика сломается. Сравнивайте ссылки или предопределённые элементы.

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

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

Проверка результата

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

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

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

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

Вывод под обычным пользователем
Норма

Показывается имя вошедшего сотрудника

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

Выводится администратор или пустая строка

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

Пользователь передан параметром или обработана пустота

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

Ошибки в журнале регистрации, молчаливый пропуск логики

Запись в реквизит документа
Норма

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

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

Ошибка несоответствия типов при записи

Итог

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

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

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

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

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

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

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

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

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

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

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

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

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