БСП в 1С

Получить пользователя БСП в 1С: АвторизованныйПользователь и ТекущийПользователь

Коротко

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

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

Пользователи.АвторизованныйПользователь — универсальный способ

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

// Общий модуль Пользователи (сервер)
Пользователь = Пользователи.АвторизованныйПользователь();

// Ссылка пригодна для отбора, реквизита документа, записи регистра
НоваяЗапись = РегистрыСведений.ИсторияДействий.СоздатьМенеджерЗаписи();
НоваяЗапись.Пользователь = Пользователь;
НоваяЗапись.Момент       = ТекущаяДатаСеанса();
НоваяЗапись.Записать();
Пользователи.АвторизованныйПользователь
Без параметровопределяется по текущему сеансу
СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи

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

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

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

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

// Внутри реализации БСП:
// Возврат ПользователиСлужебныйКлиентСервер.ТекущийПользователь(АвторизованныйПользователь());
//
// Если ТипЗнч(АвторизованныйПользователь) <> Тип("СправочникСсылка.Пользователи") Тогда
//     ВызватьИсключение(ТекстОшибки, КатегорияОшибки.ОшибкаКонфигурации);
// КонецЕсли;

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

Документ = Документы.ЗаказКлиента.СоздатьДокумент();
Документ.Ответственный = Автор;   // реквизит типа СправочникСсылка.Пользователи
Пользователи.ТекущийПользователь
Без параметровопределяется по текущему сеансу
СправочникСсылка.Пользователи

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

В чём разница между АвторизованныйПользователь и ТекущийПользователь

Разница ровно в одном — в допустимом типе результата и в поведении, когда вход в сеанс выполнил внешний пользователь:

  • АвторизованныйПользователь() — возвращает ссылку на Пользователи или на ВнешниеПользователи. Исключений по типу не бросает.
  • ТекущийПользователь() — возвращает ссылку только на Пользователи. В сеансе внешнего пользователя вызывает исключение.

Практическое правило: если результат кладётся в реквизит, у которого в типах указан только СправочникСсылка.Пользователи, берите ТекущийПользователь() — она сама сработает как контракт и не даст молча записать ссылку чужого типа. Если код общий (регистр истории, подписка на событие, механизм согласований, доступный партнёрам через веб-клиент), берите АвторизованныйПользователь() и приводите тип явно.

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

Если Пользователи.ЭтоСеансВнешнегоПользователя() Тогда
    Автор      = ВнешниеПользователи.ТекущийВнешнийПользователь();
    Контрагент = ВнешниеПользователи.ПолучитьОбъектАвторизацииВнешнегоПользователя();
Иначе
    Автор      = Пользователи.ТекущийПользователь();
КонецЕсли;
Пользователи.ЭтоСеансВнешнегоПользователя
Без параметровопределяется по текущему сеансу
Булево
В ИИ Консоли кода: попросите агента выполнить Пользователи.АвторизованныйПользователь() и ТипЗнч() результата прямо на вашей базе — так за один прогон видно, какой справочник отдаёт сеанс и совпадает ли ссылка с тем, что ожидает ваш реквизит.

Справочник Пользователи и пользователь информационной базы

БСП разводит два объекта: элемент справочника Пользователи (прикладной пользователь, к нему привязаны настройки, права, история) и ПользовательИнформационнойБазы (учётная запись платформы с именем, аутентификацией и ролями). Связь между ними — реквизит справочника ИдентификаторПользователяИБ. Ходить по нему руками не нужно, есть штатные функции.

// Ссылка справочника -> учётная запись платформы
ПользовательИБ = Пользователи.НайтиПоСсылке(Пользователи.АвторизованныйПользователь());

Если ПользовательИБ <> Неопределено Тогда
    ИмяДляВхода = ПользовательИБ.Имя;
    ПолноеИмя   = ПользовательИБ.ПолноеИмя;
КонецЕсли;

// Учётная запись платформы -> ссылка справочника
Пользователь = Пользователи.НайтиПоИмени("Иванов");
Пользователь = Пользователи.НайтиПоИдентификатору(
    ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор);
Пользователи.НайтиПоСсылке
Пользовательссылка справочника Пользователи или ВнешниеПользователи
ПользовательИнформационнойБазы, Неопределено

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

Когда нужны сами свойства учётной записи, а не ссылка, берите структуру свойств по имени или идентификатору:

Свойства = Пользователи.СвойстваПользователяИБ("Иванов");

Если Свойства <> Неопределено Тогда
    Сообщить(Свойства.ПолноеИмя);
    Сообщить(Строка(Свойства.АутентификацияСтандартная));
КонецЕсли;
Пользователи.СвойстваПользователяИБ
ИмяИлиИдентификаторСтрока или УникальныйИдентификатор
Структура (см. НовоеОписаниеПользователяИБ), Неопределено

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

Как проверить права и роли пользователя средствами БСП

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

// Полные права у текущего пользователя
Если Пользователи.ЭтоПолноправныйПользователь() Тогда
    // ...
КонецЕсли;

// Права администрирования системы у конкретного пользователя,
// привилегированный режим не учитываем
ЭтоАдмин = Пользователи.ЭтоПолноправныйПользователь(СсылкаПользователя, Истина, Ложь);
Пользователи.ЭтоПолноправныйПользователь
ПользовательНеопределено — текущий пользователь ИБ; либо ссылка справочника, либо ПользовательИнформационнойБазы
ПроверятьПраваАдминистрированияСистемыБулево, по умолчанию Ложь
УчитыватьПривилегированныйРежимБулево, по умолчанию Истина
Булево

Для проверки конкретных ролей служит РолиДоступны(). Имена ролей передаются одной строкой через запятую, результат — «доступна хотя бы одна из перечисленных».

Если Пользователи.РолиДоступны("ДобавлениеИзменениеЗаказовКлиентов, ПроведениеДокументов") Тогда
    // ...
КонецЕсли;

// Проверка ролей другого пользователя
ЕстьДоступ = Пользователи.РолиДоступны("ЧтениеОтчетовПоПродажам", СсылкаПользователя);
Пользователи.РолиДоступны
ИменаРолейстрока имён ролей через запятую
ПользовательНеопределено — текущий пользователь ИБ
УчитыватьПривилегированныйРежимБулево, по умолчанию Истина
Булево

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

Второй нюанс — привилегированный режим. По умолчанию УчитыватьПривилегированныйРежим = Истина, и внутри привилегированного блока обе функции вернут Истина для текущего пользователя. Если проверка должна отражать реальные роли, а не режим исполнения, передавайте третьим параметром Ложь.

Как получить пользователя БСП на клиенте

На клиенте те же три функции живут в модуле ПользователиКлиент и не делают серверных вызовов — значения приходят из параметров клиента, заполненных при старте:

&НаКлиенте
Процедура ПриОткрытии(Отказ)

    Если ПользователиКлиент.ЭтоСеансВнешнегоПользователя() Тогда
        Элементы.ГруппаСлужебная.Видимость = Ложь;
    КонецЕсли;

    Если ПользователиКлиент.ЭтоПолноправныйПользователь() Тогда
        Элементы.КнопкаНастройки.Видимость = Истина;
    КонецЕсли;

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

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

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

1С БСП: пользователи, группы и неуказанный пользователь

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

  • Пользователи.ГруппаВсеПользователи()СправочникСсылка.ГруппыПользователей — ссылка на стандартную группу «ВсеПользователи», корень иерархии групп.
  • Пользователи.СсылкаНеуказанногоПользователя(СоздатьЕслиНеСуществует = Ложь) — ссылка служебного пользователя «Не указан». Возвращает Неопределено, если такой элемент ещё не создан, а флаг не поднят. Текстовое представление отдаёт Пользователи.ПолноеИмяНеуказанногоПользователя().
  • Пользователи.ВходВПрограммуРазрешен(ОписаниеПользователяИБ)Булево — есть ли у пользователя хотя бы один вид аутентификации. Принимает ссылку справочника, ПользовательИнформационнойБазы, УникальныйИдентификатор или структуру свойств аутентификации.
  • Пользователи.ПользовательИБЗанят(ПользовательИБ, УчетнаяЗапись = Неопределено)Булево — сопоставлена ли учётная запись платформы с элементом справочника Пользователи или ВнешниеПользователи.
В ИИ Консоли кода: опишите задачу словами — «собери таблицу пользователей справочника с их именами для входа и признаком, разрешён ли вход» — и агент соберёт код на НайтиПоСсылке() и ВходВПрограммуРазрешен() и выполнит его на базе. Не придётся угадывать, какие поля отдаёт ПользовательИнформационнойБазы.

Частые ошибки при получении пользователя через БСП

  • ТекущийПользователь() в универсальном коде. В сеансе внешнего пользователя функция вызывает исключение «Невозможно получить текущего пользователя в сеансе внешнего пользователя». В подписках, регламентных механизмах и общих подсистемах используйте АвторизованныйПользователь().
  • Ссылка справочника вместо пользователя ИБ. АвторизованныйПользователь() отдаёт элемент справочника, а не ПользовательИнформационнойБазы. Имя для входа, аутентификация и роли берутся только через Пользователи.НайтиПоСсылке().
  • Сравнение результата с ПользователиИнформационнойБазы.ТекущийПользователь(). Это объекты разной природы, их нельзя сравнивать напрямую — сопоставляйте по УникальныйИдентификатор через Пользователи.НайтиПоИдентификатору().
  • Проверка ролей под полными правами. РолиДоступны() вернёт Истина для полноправного пользователя независимо от списка ролей — тестируйте разграничение под обычной учётной записью.
  • Проверка прав внутри привилегированного блока. При УчитыватьПривилегированныйРежим = Истина (значение по умолчанию) ЭтоПолноправныйПользователь() вернёт Истина просто из-за режима. Для реальной картины передавайте Ложь.
  • Вызов в безопасном режиме. НайтиПоИмени(), НайтиПоСсылке(), НайтиПоИдентификатору() и СвойстваПользователяИБ() содержат проверку ПроверитьБезопасныйРежимОтключен и в безопасном режиме завершатся ошибкой.
  • Ожидание пустой ссылки вместо Неопределено. НайтиПоИмени() возвращает Неопределено, когда учётной записи нет, и пустую ссылку справочника, когда учётная запись есть, но не сопоставлена. Эти случаи нужно различать.
  • Вызов в сеансе без разделителей. В модели сервиса АвторизованныйПользователь() требует доступности разделённых данных, иначе будет исключение — в фоновых заданиях области это надо учитывать.

Частые вопросы о получении пользователя в БСП

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

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

Как по пользователю БСП получить имя для входа в информационную базу?

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

Как проверить роль пользователя в БСП вместо РольДоступна?

Используйте Пользователи.РолиДоступны("Роль1, Роль2") — она учитывает назначение ролей и привилегированный режим. Для проверки полных прав есть Пользователи.ЭтоПолноправныйПользователь(), а на клиенте — одноимённая функция модуля ПользователиКлиент.

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 1,5 млн токенов

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф