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

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

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

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

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

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

Ниже разобраны все рабочие способы: от стандартного клиентского модуля БСП до собственного серверного вызова, с примерами кода, ограничениями и типичными ошибками.

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

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

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

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

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

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

&НаКлиенте

Процедура ПриОткрытии(Отказ)

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

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

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

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

Альтернатива — универсальный кэш стандартных подсистем: СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента(). В возвращаемой структуре есть сведения о сеансе, включая данные авторизованного пользователя. Этот вариант удобен, когда помимо пользователя нужны и другие параметры запуска.

Способ 2. Собственный серверный вызов в самописной конфигурации

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

В модуле разместите экспортную функцию:

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

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

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

Теперь из любого клиентского кода функция доступна напрямую:

&НаКлиенте

Процедура КомандаКтоЯ(Команда)

ИмяПользователя = РаботаСПользователямиСервер.ТекущийПользователь();

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

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

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

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

Часто нужно не имя, а ссылка на справочник — например, чтобы подставить её в реквизит документа «Ответственный». На сервере поиск выполняется через имя пользователя информационной базы:

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

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

Найденный = Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя, Истина);

Возврат Найденный;

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

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

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

bsl
&НаСервере
Функция ТекущийПользовательСервер()
    Возврат ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
КонецФункции

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Сообщить(ТекущийПользовательСервер());
КонецПроцедуры

Кеширование и производительность

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

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

Именно так устроена БСП: параметры сеанса читаются один раз при запуске и дальше раздаются клиенту из кэша без обращений к серверу.

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

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

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

Свой модуль с вызовом сервера

Универсально для любой конфигурации, но требует ручной реализации и контроля количества серверных вызовов.

Параметры сеанса

Заполняются один раз при старте, читаются на сервере без поиска. Требуют настройки обработчика заполнения.

Реквизит формы, заполненный при создании

Минимум серверных вызовов внутри формы, но значение доступно только в этой форме.

Типичные ошибки и ограничения

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

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

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

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

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

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

Простой тест: выведите полученное значение через Сообщить или ПоказатьОповещениеПользователя и сравните с именем, указанным в списке пользователей конфигуратора. Для ссылки на справочник откройте найденный элемент и убедитесь, что это именно тот сотрудник.

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

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

Имя пользователя на клиенте
Норма

Совпадает с именем учётной записи в конфигураторе

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

Пустая строка или имя другого пользователя

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

Открывается карточка нужного сотрудника

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

Пустая ссылка или элемент другого пользователя

Работа в тонком клиенте под ограниченными правами
Норма

Значение возвращается без ошибок доступа

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

Ошибка вызова сервера или нарушение прав доступа

FAQ

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

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

Чем отличается Имя от ПолногоИмени у пользователя ИБ?

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

Как получить текущего пользователя в фоновом задании?

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

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

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

Работает ли вызов сервера из веб-клиента?

Да, серверные вызовы из общих модулей с флагом «Вызов сервера» работают в веб-клиенте так же, как в тонком. Ограничения веб-клиента касаются другого: файловой системы, COM-объектов и модальных окон, но не клиент-серверного взаимодействия.

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

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

Итог

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

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