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