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