Получить пользователя БСП в 1С: АвторизованныйПользователь и ТекущийПользователь
Чтобы получить пользователя БСП, вызовите Пользователи.АвторизованныйПользователь() —
функция возвращает СправочникСсылка.Пользователи либо
СправочникСсылка.ВнешниеПользователи, в зависимости от того, кто выполнил вход в сеанс.
Если код заведомо не работает с внешними пользователями, используйте
Пользователи.ТекущийПользователь(): она возвращает только
СправочникСсылка.Пользователи.
Разница принципиальна: ТекущийПользователь() в сеансе внешнего пользователя
вызывает исключение с категорией ОшибкаКонфигурации, а не возвращает
пустую ссылку. Обе функции продублированы на клиенте — в модуле ПользователиКлиент.
Пользователи.АвторизованныйПользователь — универсальный способ
Это основная функция для получения пользователя в БСП. Она не принимает параметров и возвращает ссылку того справочника, который соответствует авторизовавшемуся в сеансе пользователю.
// Общий модуль Пользователи (сервер)
Пользователь = Пользователи.АвторизованныйПользователь();
// Ссылка пригодна для отбора, реквизита документа, записи регистра
НоваяЗапись = РегистрыСведений.ИсторияДействий.СоздатьМенеджерЗаписи();
НоваяЗапись.Пользователь = Пользователь;
НоваяЗапись.Момент = ТекущаяДатаСеанса();
НоваяЗапись.Записать();
В описании функции в модуле БСП прямо сказано: её рекомендуется использовать в коде, который
поддерживает работу в обоих случаях — и с обычными, и с внешними пользователями. Поэтому в общей
подсистеме, в универсальной обработке или в механизме логирования правильный выбор —
АвторизованныйПользователь().
Значение берётся не из базы напрямую, а из параметров сеанса: если заполнен
ПараметрыСеанса.ТекущийПользователь, возвращается он, иначе —
ПараметрыСеанса.ТекущийВнешнийПользователь. Отсюда два следствия: вызов дешёвый
(обращения к справочнику при каждом вызове нет) и он недоступен в сеансе без разделителей
в модели сервиса — там функция вызовет исключение.
Пользователи.ТекущийПользователь — только справочник Пользователи
Вторая функция — обёртка над первой с жёсткой проверкой типа. Она возвращает ровно
СправочникСсылка.Пользователи и предназначена для кода, который не поддерживает работу
с внешними пользователями.
// Внутри реализации БСП:
// Возврат ПользователиСлужебныйКлиентСервер.ТекущийПользователь(АвторизованныйПользователь());
//
// Если ТипЗнч(АвторизованныйПользователь) <> Тип("СправочникСсылка.Пользователи") Тогда
// ВызватьИсключение(ТекстОшибки, КатегорияОшибки.ОшибкаКонфигурации);
// КонецЕсли;
Автор = Пользователи.ТекущийПользователь();
Документ = Документы.ЗаказКлиента.СоздатьДокумент();
Документ.Ответственный = Автор; // реквизит типа СправочникСсылка.Пользователи
Текст исключения — «Невозможно получить текущего пользователя в сеансе внешнего пользователя».
Это именно ошибка конфигурации, а не ошибка данных: платформа сообщает, что код вызван там, где
он не рассчитан работать. Гасить её через Попытка не нужно — нужно либо перейти на
АвторизованныйПользователь(), либо заранее отсечь сеанс внешнего пользователя.
В чём разница между АвторизованныйПользователь и ТекущийПользователь
Разница ровно в одном — в допустимом типе результата и в поведении, когда вход в сеанс выполнил внешний пользователь:
-
АвторизованныйПользователь()— возвращает ссылку наПользователиили наВнешниеПользователи. Исключений по типу не бросает. -
ТекущийПользователь()— возвращает ссылку только наПользователи. В сеансе внешнего пользователя вызывает исключение.
Практическое правило: если результат кладётся в реквизит, у которого в типах указан только
СправочникСсылка.Пользователи, берите ТекущийПользователь() — она сама
сработает как контракт и не даст молча записать ссылку чужого типа. Если код общий (регистр истории,
подписка на событие, механизм согласований, доступный партнёрам через веб-клиент), берите
АвторизованныйПользователь() и приводите тип явно.
Проверить вид сеанса до вызова помогает третья функция того же модуля:
Если Пользователи.ЭтоСеансВнешнегоПользователя() Тогда
Автор = ВнешниеПользователи.ТекущийВнешнийПользователь();
Контрагент = ВнешниеПользователи.ПолучитьОбъектАвторизацииВнешнегоПользователя();
Иначе
Автор = Пользователи.ТекущийПользователь();
КонецЕсли;
Пользователи.АвторизованныйПользователь() и ТипЗнч() результата прямо
на вашей базе — так за один прогон видно, какой справочник отдаёт сеанс и совпадает ли ссылка
с тем, что ожидает ваш реквизит.
Справочник Пользователи и пользователь информационной базы
БСП разводит два объекта: элемент справочника Пользователи (прикладной пользователь,
к нему привязаны настройки, права, история) и ПользовательИнформационнойБазы (учётная
запись платформы с именем, аутентификацией и ролями). Связь между ними — реквизит справочника
ИдентификаторПользователяИБ. Ходить по нему руками не нужно, есть штатные функции.
// Ссылка справочника -> учётная запись платформы
ПользовательИБ = Пользователи.НайтиПоСсылке(Пользователи.АвторизованныйПользователь());
Если ПользовательИБ <> Неопределено Тогда
ИмяДляВхода = ПользовательИБ.Имя;
ПолноеИмя = ПользовательИБ.ПолноеИмя;
КонецЕсли;
// Учётная запись платформы -> ссылка справочника
Пользователь = Пользователи.НайтиПоИмени("Иванов");
Пользователь = Пользователи.НайтиПоИдентификатору(
ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор);
У НайтиПоСсылке() есть ограничение из описания функции: для поиска требуются
административные права, без них допустимо искать учётную запись только для текущего пользователя ИБ.
НайтиПоИмени() ведёт себя мягче и различает два «нет»: Неопределено —
пользователя ИБ с таким именем не существует; пустая ссылка
Справочники.Пользователи.ПустаяСсылка() — учётная запись есть, но с элементом справочника
она не сопоставлена.
Когда нужны сами свойства учётной записи, а не ссылка, берите структуру свойств по имени или идентификатору:
Свойства = Пользователи.СвойстваПользователяИБ("Иванов");
Если Свойства <> Неопределено Тогда
Сообщить(Свойства.ПолноеИмя);
Сообщить(Строка(Свойства.АутентификацияСтандартная));
КонецЕсли;
Функция запрещена в безопасном режиме: внутри стоит явная проверка
ПроверитьБезопасныйРежимОтключен. Такое же ограничение действует у
НайтиПоИмени(), НайтиПоИдентификатору() и НайтиПоСсылке() —
из кода расширения в безопасном режиме они не отработают.
Как проверить права и роли пользователя средствами БСП
Прямой вызов РольДоступна() в типовых конфигурациях не приветствуется: он не учитывает
ни привилегированный режим, ни назначение ролей. В БСП для этого есть две функции.
// Полные права у текущего пользователя
Если Пользователи.ЭтоПолноправныйПользователь() Тогда
// ...
КонецЕсли;
// Права администрирования системы у конкретного пользователя,
// привилегированный режим не учитываем
ЭтоАдмин = Пользователи.ЭтоПолноправныйПользователь(СсылкаПользователя, Истина, Ложь);
Для проверки конкретных ролей служит РолиДоступны(). Имена ролей передаются одной
строкой через запятую, результат — «доступна хотя бы одна из перечисленных».
Если Пользователи.РолиДоступны("ДобавлениеИзменениеЗаказовКлиентов, ПроведениеДокументов") Тогда
// ...
КонецЕсли;
// Проверка ролей другого пользователя
ЕстьДоступ = Пользователи.РолиДоступны("ЧтениеОтчетовПоПродажам", СсылкаПользователя);
Важная деталь из описания функции: она возвращает Истина не только когда доступна одна
из указанных ролей, но и когда ЭтоПолноправныйПользователь() для этого пользователя даёт
Истина. Поэтому для администратора любая проверка ролей пройдёт — на этом ломаются
сценарии вида «скрыть кнопку у всех, кроме роли X», если тестировать их под полными правами.
Второй нюанс — привилегированный режим. По умолчанию УчитыватьПривилегированныйРежим = Истина,
и внутри привилегированного блока обе функции вернут Истина для текущего пользователя.
Если проверка должна отражать реальные роли, а не режим исполнения, передавайте третьим параметром
Ложь.
Как получить пользователя БСП на клиенте
На клиенте те же три функции живут в модуле ПользователиКлиент и не делают серверных
вызовов — значения приходят из параметров клиента, заполненных при старте:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ПользователиКлиент.ЭтоСеансВнешнегоПользователя() Тогда
Элементы.ГруппаСлужебная.Видимость = Ложь;
КонецЕсли;
Если ПользователиКлиент.ЭтоПолноправныйПользователь() Тогда
Элементы.КнопкаНастройки.Видимость = Истина;
КонецЕсли;
ТекущийАвтор = ПользователиКлиент.АвторизованныйПользователь();
КонецПроцедуры
Клиентская ЭтоПолноправныйПользователь() принимает единственный параметр
ПроверятьПраваАдминистрированияСистемы (по умолчанию Ложь) — проверить
другого пользователя или отключить учёт привилегированного режима на клиенте нельзя, для этого нужен
серверный вызов. Аналога РолиДоступны() на клиенте тоже нет.
1С БСП: пользователи, группы и неуказанный пользователь
Ещё несколько функций модуля Пользователи, которые обычно нужны рядом с получением
текущего пользователя:
-
Пользователи.ГруппаВсеПользователи()→СправочникСсылка.ГруппыПользователей— ссылка на стандартную группу «ВсеПользователи», корень иерархии групп. -
Пользователи.СсылкаНеуказанногоПользователя(СоздатьЕслиНеСуществует = Ложь)— ссылка служебного пользователя «Не указан». ВозвращаетНеопределено, если такой элемент ещё не создан, а флаг не поднят. Текстовое представление отдаётПользователи.ПолноеИмяНеуказанногоПользователя(). -
Пользователи.ВходВПрограммуРазрешен(ОписаниеПользователяИБ)→Булево— есть ли у пользователя хотя бы один вид аутентификации. Принимает ссылку справочника,ПользовательИнформационнойБазы,УникальныйИдентификаторили структуру свойств аутентификации. -
Пользователи.ПользовательИБЗанят(ПользовательИБ, УчетнаяЗапись = Неопределено)→Булево— сопоставлена ли учётная запись платформы с элементом справочникаПользователиилиВнешниеПользователи.
НайтиПоСсылке() и ВходВПрограммуРазрешен() и выполнит его на базе. Не придётся
угадывать, какие поля отдаёт ПользовательИнформационнойБазы.
Частые ошибки при получении пользователя через БСП
-
ТекущийПользователь() в универсальном коде. В сеансе внешнего пользователя
функция вызывает исключение «Невозможно получить текущего пользователя в сеансе внешнего
пользователя». В подписках, регламентных механизмах и общих подсистемах используйте
АвторизованныйПользователь(). -
Ссылка справочника вместо пользователя ИБ.
АвторизованныйПользователь()отдаёт элемент справочника, а неПользовательИнформационнойБазы. Имя для входа, аутентификация и роли берутся только черезПользователи.НайтиПоСсылке(). -
Сравнение результата с ПользователиИнформационнойБазы.ТекущийПользователь().
Это объекты разной природы, их нельзя сравнивать напрямую — сопоставляйте по
УникальныйИдентификаторчерезПользователи.НайтиПоИдентификатору(). -
Проверка ролей под полными правами.
РолиДоступны()вернётИстинадля полноправного пользователя независимо от списка ролей — тестируйте разграничение под обычной учётной записью. -
Проверка прав внутри привилегированного блока. При
УчитыватьПривилегированныйРежим = Истина(значение по умолчанию)ЭтоПолноправныйПользователь()вернётИстинапросто из-за режима. Для реальной картины передавайтеЛожь. -
Вызов в безопасном режиме.
НайтиПоИмени(),НайтиПоСсылке(),НайтиПоИдентификатору()иСвойстваПользователяИБ()содержат проверкуПроверитьБезопасныйРежимОтключени в безопасном режиме завершатся ошибкой. -
Ожидание пустой ссылки вместо Неопределено.
НайтиПоИмени()возвращаетНеопределено, когда учётной записи нет, и пустую ссылку справочника, когда учётная запись есть, но не сопоставлена. Эти случаи нужно различать. -
Вызов в сеансе без разделителей. В модели сервиса
АвторизованныйПользователь()требует доступности разделённых данных, иначе будет исключение — в фоновых заданиях области это надо учитывать.
Частые вопросы о получении пользователя в БСП
Чем Пользователи.АвторизованныйПользователь отличается от Пользователи.ТекущийПользователь?
АвторизованныйПользователь() возвращает СправочникСсылка.Пользователи
или СправочникСсылка.ВнешниеПользователи — в зависимости от того, кто вошёл в сеанс.
ТекущийПользователь() возвращает только СправочникСсылка.Пользователи,
а в сеансе внешнего пользователя вызывает исключение категории ОшибкаКонфигурации.
Как по пользователю БСП получить имя для входа в информационную базу?
Через Пользователи.НайтиПоСсылке(Пользователи.АвторизованныйПользователь()) —
функция возвращает ПользовательИнформационнойБазы либо Неопределено,
имя лежит в свойстве Имя. Для поиска чужой учётной записи нужны административные
права, для своей — нет.
Как проверить роль пользователя в БСП вместо РольДоступна?
Используйте Пользователи.РолиДоступны("Роль1, Роль2") — она учитывает назначение
ролей и привилегированный режим. Для проверки полных прав есть
Пользователи.ЭтоПолноправныйПользователь(), а на клиенте — одноимённая функция
модуля ПользователиКлиент.
ИИ Консоль кода 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Для индивидуального использования
- До 5 конфигураций
- Встроенный агент запросов 1С
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Популярный выборДля интенсивного использования или команд
- До 15 конфигураций
- Встроенный агент запросов 1С
-
≈ 300 задач Подробнее про лимиты
-
Свои подписки Codex, Claude и любые OpenAI-совместимые
-
Внешние обработки без Конфигуратора
- Приоритетная техническая поддержка