Разработка и Конфигурация · 11 мин
Как вывести текущего пользователя в 1С
Как получить текущего пользователя в 1С: ПользователиИнформационнойБазы, ПараметрыСеанса, вывод в сообщение, отчёт и на форму. Примеры кода и типичные ошибки.
Задача определить, кто именно работает в программе прямо сейчас, возникает постоянно: при записи документов, в журналах регистрации, при разграничении прав, в отчётах и при выводе приветствия на начальной странице. В 1С есть несколько штатных механизмов получения текущего пользователя, и они возвращают разные данные — путать их нельзя.
Главное различие — между пользователем информационной базы (учётная запись для входа) и пользователем справочника «Пользователи» (элемент, к которому привязаны права, подразделение и дополнительные реквизиты). Первый существует всегда, второй — только в конфигурациях на базе Библиотеки стандартных подсистем (БСП), например в «1С:Бухгалтерии», «1С:Управление торговлей», «1С:ERP».
Ниже разобраны все рабочие способы: от одной строки кода до вывода пользователя в отчёт на СКД и на форму. Примеры подходят для платформы 8.3 и типовых конфигураций.
Способ 1. ПользователиИнформационнойБазы.ТекущийПользователь()
Это базовый механизм платформы, доступный в любой конфигурации, даже самописной без единого справочника. Метод возвращает объект типа ПользовательИнформационнойБазы — ту самую учётную запись, под которой выполнен вход (Администрирование → Пользователи в конфигураторе).
Из объекта можно прочитать имя для входа, полное имя, уникальный идентификатор, роли и настройки аутентификации:
ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
Сообщить("Имя входа: " + ТекущийПользовательИБ.Имя);
Сообщить("Полное имя: " + ТекущийПользовательИБ.ПолноеИмя);
Сообщить("GUID: " + ТекущийПользовательИБ.УникальныйИдентификатор);
Важное ограничение: если сеанс запущен без аутентификации (например, фоновое задание планировщика или веб-сервис без указания пользователя), метод вернёт пользователя с пустым именем или значение, соответствующее пользователю по умолчанию. Поэтому в серверных процедурах, которые могут вызываться из регламентных заданий, делайте проверку на пустое имя.
Способ 2. ПараметрыСеанса.ТекущийПользователь в типовых конфигурациях
В конфигурациях на БСП (Бухгалтерия, ЗУП, УТ, ERP, КА) есть параметр сеанса ТекущийПользователь, который заполняется при старте системы и содержит ссылку на элемент справочника «Пользователи». Это самый быстрый способ: обращение к параметру сеанса не выполняет запрос к базе, значение уже находится в памяти сервера.
ТекПользователь = ПараметрыСеанса.ТекущийПользователь;
Сообщить("В базе работает: " + ТекПользователь);
Через ссылку доступны все реквизиты справочника: наименование, подразделение (если заполнено), физическое лицо, служебные признаки. Именно эту ссылку следует подставлять в реквизиты документов типа «Ответственный», «Автор», «Менеджер»:
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Ответственный = ПараметрыСеанса.ТекущийПользователь;
Если конфигурация не содержит БСП, параметр сеанса придётся создать самостоятельно в конфигураторе и заполнять в обработчике УстановкаПараметровСеанса — иначе обращение вызовет ошибку «Параметр сеанса не найден».
Способ 3. Функция Пользователи.ТекущийПользователь() из БСП
Библиотека стандартных подсистем предоставляет программный интерфейс — общий модуль Пользователи. Функция Пользователи.ТекущийПользователь() возвращает ту же ссылку на справочник, но работает корректнее в пограничных случаях: для внешних пользователей (контрагентов с доступом к базе) она вернёт соответствующий тип, а не сломается.
ТекПользователь = Пользователи.ТекущийПользователь();
Если ЗначениеЗаполнено(ТекПользователь) Тогда
Сообщить("Текущий пользователь: " + ТекПользователь);
КонецЕсли;
Дополнительно модуль даёт смежные функции: Пользователи.ЭтоПолноправныйПользователь() — проверка административных прав, Пользователи.ТекущийВнешнийПользователь() — для сценариев с внешним доступом. Если вы пишете расширение или доработку типовой конфигурации, используйте именно этот программный интерфейс, а не прямое обращение к параметрам сеанса — так код переживёт обновления БСП.
Сравнение вариантов
Работает в любой конфигурации, возвращает учётную запись входа. Не даёт ссылку на справочник, не подходит для реквизитов документов.
Самый быстрый доступ к ссылке справочника «Пользователи». Требует БСП или собственной реализации параметра сеанса.
Рекомендуемый API БСП, корректно обрабатывает внешних пользователей. Требует наличия БСП в конфигурации.
Вывод пользователя в сообщение, на форму и в отчёт
Сообщение и заголовок окна
Простейший вывод — через Сообщить(), как в примерах выше. Чтобы показать имя пользователя в заголовке управляемой формы, достаточно переопределить заголовок при создании:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭтаФорма.Заголовок = "Журнал документов — " + ПараметрыСеанса.ТекущийПользователь;
КонецПроцедуры
Реквизит на форме
Если имя нужно отображать постоянно, добавьте на форму реквизит типа «Строка» или «СправочникСсылка.Пользователи» и заполните его в ПриСозданииНаСервере. Для надписи-украшения достаточно строки; ссылка удобнее, если по пользователю должны работать отборы и переходы.
Отчёт на СКД
В схеме компоновки данных текущего пользователя обычно используют как параметр отбора. В запросе набора данных добавьте условие вида ГДЕ Ответственный = &ТекущийПользователь, а в модуле объекта отчёта или в настройках задайте значение параметра:
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(
"ТекущийПользователь", ПараметрыСеанса.ТекущийПользователь);
Так отчёт «Мои документы» автоматически покажет каждому сотруднику только его данные без ручной настройки отборов.
- 1Определите, что нужно: учётная запись входа или ссылка справочника «Пользователи».
- 2Для учётной записи используйте ПользователиИнформационнойБазы.ТекущийПользователь().
- 3Для ссылки в типовой конфигурации — ПараметрыСеанса.ТекущийПользователь или Пользователи.ТекущийПользователь().
- 4Оберните значение в Сообщить(), присвойте реквизиту формы или параметру отчёта.
- 5Проверьте работу под пользователем без полных прав и в фоновом задании — там поведение отличается.
Особые случаи и ограничения
Фоновые и регламентные задания. В сеансе регламентного задания нет интерактивного входа, поэтому ПараметрыСеанса.ТекущийПользователь может быть пустым или содержать служебного пользователя, указанного в настройках задания. Если логика зависит от пользователя, передавайте его ссылку в параметры фонового задания явно.
Внешние пользователи. В конфигурациях с механизмом внешнего доступа (например, личный кабинет контрагента) текущим может оказаться не сотрудник, а элемент справочника «ВнешниеПользователи». Проверяйте тип значения перед записью в реквизиты, рассчитанные на сотрудников:
ТекПользователь = Пользователи.ТекущийПользователь();
Если ТипЗнч(ТекПользователь) = Тип("СправочникСсылка.Пользователи") Тогда
// сотрудник
Иначе
// внешний пользователь
КонецЕсли;
Толстый и тонкий клиент. Все перечисленные методы серверные. В клиентском коде управляемой формы вызывайте их через серверную процедуру с директивой &НаСервере или кэшируйте значение в реквизите формы при открытии.
Типичные ошибки и как их избежать
Первая частая ошибка — попытка сохранить объект ПользовательИнформационнойБазы в реквизит документа. Платформа выдаст ошибку несоответствия типов, потому что этот объект не является ссылкой. Решение: храните ссылку справочника «Пользователи» или строковое имя пользователя.
Вторая ошибка — сравнение пользователя по наименованию строкой. Например, Если ПараметрыСеанса.ТекущийПользователь = "Иванов" Тогда — сравнение ссылки со строкой всегда ложно, а если сравнивать наименования, при переименовании сотрудника логика сломается. Сравнивайте ссылки или предопределённые элементы.
Третья ошибка — обращение к параметру сеанса в конфигурации, где он не заполняется. В собственных разработках без БСП параметр останется пустым, и проверки вида «если пользователь заполнен» будут молча не проходить. Всегда проверяйте заполнение параметра при старте системы.
Проверка результата
После внедрения кода проверьте три сценария. Первый — интерактивный вход под обычным пользователем: сообщение или поле формы должно показать именно его имя, а не администратора, под которым вы тестировали. Второй — запуск того же кода под пользователем с ограниченными правами: обращение к справочнику «Пользователи» не должно вызывать ошибку доступа (чтение собственной записи в типовых конфигурациях разрешено, но проверить стоит).
Третий сценарий — выполнение кода в фоновом задании. Откройте консоль заданий или журнал регистрации и убедитесь, что значение либо корректно передано параметром, либо осознанно пустое и обработано веткой «иначе». Если в журнале появляются ошибки «Поле объекта не обнаружено» или «Параметр сеанса не найден» — значит, код выполняется в контексте, где нужные механизмы недоступны.
Как проверить результат
Показывается имя вошедшего сотрудника
Выводится администратор или пустая строка
Пользователь передан параметром или обработана пустота
Ошибки в журнале регистрации, молчаливый пропуск логики
Сохраняется ссылка справочника «Пользователи»
Ошибка несоответствия типов при записи
Что важно запомнить
Для учётной записи входа — ПользователиИнформационнойБазы.ТекущийПользователь(), для ссылки справочника в типовых конфигурациях — ПараметрыСеанса.ТекущийПользователь или функция БСП Пользователи.ТекущийПользователь(). В реквизиты документов записывайте только ссылку, в фоновых заданиях передавайте пользователя параметром, доработки делайте через расширение.
Частые вопросы
Чем отличается ПользователиИнформационнойБазы от справочника «Пользователи»?
Учётная запись информационной базы — это данные для входа: логин, пароль, роли. Справочник «Пользователи» — прикладной объект конфигурации, к которому привязаны подразделение, физлицо и права на уровне данных. Одна учётная запись обычно соответствует одному элементу справочника, связь хранится по уникальному идентификатору.
Почему ПараметрыСеанса.ТекущийПользователь возвращает пустое значение?
Чаще всего код выполняется в сеансе регламентного задания или внешнего соединения, где процедура установки параметров сеанса отработала без аутентифицированного пользователя. Проверьте, какой пользователь назначен заданию, и передавайте нужную ссылку через параметры.
Как получить текущего пользователя на клиенте без вызова сервера?
Напрямую — никак, механизм серверный. Практичный вариант: один раз получить значение в ПриСозданииНаСервере и сохранить в реквизит формы, дальше использовать его на клиенте без повторных вызовов.
Можно ли вывести текущего пользователя в печатную форму?
Да. В модуле менеджера печати или в коде формирования макета получите значение стандартным способом и передайте в параметр макета, например «Исполнитель» или «Ответственный». В типовых конфигурациях часто уже выводится реквизит «Ответственный» документа — тогда дополнительный код не нужен.
Как узнать, полные ли права у текущего пользователя?
В конфигурациях с БСП используйте функцию Пользователи.ЭтоПолноправныйПользователь() — она учитывает и роль «ПолныеПрава», и режим привилегированного доступа. Прямая проверка ролей через РольДоступна("ПолныеПрава") тоже работает, но менее устойчива к особенностям конкретной конфигурации.