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