Как программно получить настройки текущего пользователя в 1С 8.3?

Программист 1С v8.3 (Управляемые формы)
← На главную

В процессе разработки или доработки конфигураций 1С часто возникает необходимость программно получить определенные настройки текущего пользователя. Это может быть "Основное подразделение организации", "Основная организация", "Основная касса" или любой другой параметр, который пользователь задал в своих персональных настройках. Эти значения по умолчанию используются системой для автоматической подстановки в новые документы и формы, значительно упрощая работу пользователей. Рассмотрим, как мы можем получить эти настройки средствами встроенного языка 1С, избегая распространенных ошибок.

Особенности хранения пользовательских настроек

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

Основные подходы к программному получению настроек пользователя

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

Подход 1: Использование общих модулей типовой конфигурации (рекомендуемый)

Наиболее надежный и правильный способ получить пользовательские настройки — это использовать функции, предоставляемые общими модулями типовой конфигурации. Чаще всего это модуль "УправлениеПользователями" или аналогичные модули, предназначенные для работы с пользовательскими данными.

Функция УправлениеПользователями.ПолучитьЗначениеПоУмолчанию

Во многих типовых конфигурациях на базе БСП (Библиотека стандартных подсистем) существует функция ПолучитьЗначениеПоУмолчанию в общем модуле УправлениеПользователями. Она принимает два параметра: объект, представляющий пользователя, и строковое имя параметра настройки.

Разберем пример из темы форума:


КР = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ТекушийПользователь, "ОсновноеПодразделениеОрганизации");

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

Почему возникает ошибка "Неверные параметры в операции сравнения. Нельзя сравнивать поля неограниченной длины и поля несовместимых типов. Пользователи.Ссылка >= &Пользователь"?

Эта ошибка, описанная в сообщении 4, возникает из-за несоответствия типов. Объект, возвращаемый функцией ПользователиИнформационнойБазы.ТекущийПользователь(), имеет тип "ПользовательИнформационнойБазы", который является системным объектом, представляющим пользователя, под которым осуществлен вход в информационную базу. Однако, функция ПолучитьЗначениеПоУмолчанию, как правило, в своей внутренней логике строит запрос к регистру сведений "НастройкиПользователей", измерение "Пользователь" которого имеет тип "СправочникСсылка.Пользователи".

Следовательно, напрямую сравнивать ПользовательИнформационнойБазы с СправочникСсылка.Пользователи нельзя. Мы должны преобразовать системный объект пользователя к ссылке на элемент справочника.

Способы получения корректного объекта пользователя (СправочникСсылка.Пользователи)

Существует несколько способов получить ссылку на элемент справочника "Пользователи" для текущего пользователя:

Вариант А: Преобразование через Имя (менее универсальный)

В некоторых случаях, если имя пользователя информационной базы совпадает с кодом или наименованием элемента справочника "Пользователи", можно использовать метод поиска по коду или наименованию. Однако это не всегда надежно, так как код или наименование могут быть изменены или не совпадать с именем пользователя ИБ.

Пример из сообщения 8, который успешно заработал:


пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
КтоОткрыл = Справочники.Пользователи.НайтиПоКоду(пользователь.Имя);
КР = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(КтоОткрыл, "ОсновноеПодразделениеОрганизации");

В данном случае, если код элемента справочника "Пользователи" совпадает с именем пользователя информационной базы, этот метод сработает.

Вариант Б: Использование ПараметровСеанса.ТекущийПользователь (предпочтительный для сервера)

Параметр сеанса ТекущийПользователь (или аналогичный, например, ТекущийПользовательБСП) в типовых конфигурациях на основе БСП уже хранит ссылку на элемент справочника "Пользователи". Этот способ является наиболее рекомендованным для серверного кода, особенно при работе с запросами и механизмами ограничения доступа на уровне записей (RLS).

Пример из сообщения 9:


КР = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ОсновноеПодразделениеОрганизации");

Это самый чистый и правильный способ, поскольку ПараметрыСеанса.ТекущийПользователь уже имеет нужный тип СправочникСсылка.Пользователи.

Вариант В: Использование УправлениеПользователями.ОпределитьТекущегоПользователя

Некоторые конфигурации предоставляют специализированную функцию в общем модуле УправлениеПользователями, которая самостоятельно определяет текущего пользователя и возвращает его в виде ссылки на справочник "Пользователи".

Пример из сообщения 10:


ОсновноеПодразделение = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(УправлениеПользователями.ОпределитьТекущегоПользователя(), "ОсновноеПодразделениеОрганизации");

Этот способ также очень удобен, так как инкапсулирует логику получения правильного объекта пользователя.

Вариант Г: Поиск по уникальному идентификатору (надежный)

Если в справочнике "Пользователи" есть реквизит, хранящий уникальный идентификатор пользователя информационной базы (например, ИдентификаторПользователяИБ), мы можем найти нужный элемент по нему. Это один из самых надежных способов.


ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ПользовательСсылка = Справочники.Пользователи.НайтиПоУникальномуИдентификатору(ТекущийПользовательИБ.УникальныйИдентификатор);

Если ПользовательСсылка.Пустая() Тогда
    // Обработать ситуацию, когда пользователь ИБ не найден в справочнике
    Сообщить("Для текущего пользователя не найден соответствующий элемент в справочнике 'Пользователи'.");
Иначе
    КР = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПользовательСсылка, "ОсновноеПодразделениеОрганизации");
КонецЕсли;

Этот метод основан на том, что при синхронизации пользователей между информационной базой и справочником "Пользователи" в элементе справочника сохраняется уникальный идентификатор пользователя ИБ. Это обеспечивает корректную привязку.

Подход 2: Прямое обращение к регистру сведений "НастройкиПользователей"

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

Для этого мы можем использовать запрос:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    НастройкиПользователей.Значение
    |ИЗ
    |    РегистрСведений.НастройкиПользователей КАК НастройкиПользователей
    |ГДЕ
    |    НастройкиПользователей.Пользователь = &Пользователь
    |    И НастройкиПользователей.ИмяНастройки = &ИмяНастройки";

Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
Запрос.УстановитьПараметр("ИмяНастройки", "ОсновноеПодразделениеОрганизации");

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда
    ОсновноеПодразделение = Результат.Значение;
Иначе
    // Установка значения по умолчанию, если настройка не найдена
    ОсновноеПодразделение = Неопределено; 
КонецЕсли;

Обратите внимание, что здесь мы также используем ПараметрыСеанса.ТекущийПользователь, чтобы получить корректную ссылку на элемент справочника "Пользователи". Имя настройки, например, "ОсновноеПодразделениеОрганизации", должно соответствовать тому, как оно сохраняется в регистре.

Подход 3: Специфические функции для конкретных конфигураций

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

Для 1С:Зарплата и Управление Персоналом (ЗУП 3.0)

Для получения основной организации в ЗУП 3.0 (иногда и в других конфигурациях), могут использоваться следующие подходы (подробнее в справочнике методов конфигурации Зарплата и кадры):

  1. Использование функции ОрганизацияПоУмолчанию:

    Многие справочники имеют статические методы для получения значений по умолчанию. Для организаций это может быть:

    
    &НаСервере
    Процедура ОсновнаяОрганизацияНаСервере(ОсновнаяОрганизацияТекущегоПользователя)
        ОсновнаяОрганизацияТекущегоПользователя = Справочники.Организации.ОрганизацияПоУмолчанию(ПользователиИнформационнойБазы.ТекущийПользователь());
    КонецПроцедуры
    

    Здесь мы видим, что в качестве параметра передается ПользователиИнформационнойБазы.ТекущийПользователь(). Это означает, что функция ОрганизацияПоУмолчанию в данном случае способна работать с объектом типа "ПользовательИнформационнойБазы" или внутри себя преобразует его.

  2. Через специализированные модули:

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

    Объект.Организация = ЗарплатаКадры.ПерваяДоступнаяОрганизация();

    Или общий модуль, который может содержать функцию ОрганизацияПоУмолчанию:

    ОбщегоНазначения.ОбщийМодуль("Справочники.Организации").ОрганизацияПоУмолчанию;

Для 1С:Управление Небольшой Фирмой (УНФ)

В УНФ также могут использоваться специализированные функции, похожие на те, что мы рассматривали в "УправлениеПользователями":


ОрганизацияПоУмолчанию = УправлениеНебольшойФирмойПовтИсп.ПолучитьЗначениеПоУмолчаниюПользователя(
    Пользователи.ТекущийПользователь(), "ОсновнаяОрганизация");

Здесь используется Пользователи.Текущий() (или Пользователи.ТекущийПользователь(), как в примере), который возвращает объект типа "Пользователь", а не ссылку на элемент справочника. Важно уточнять, какой именно объект пользователя ожидает конкретная функция.

Для 1С:Бухгалтерия Предприятия (БП)

В БП 3.0 для получения основной организации или других настроек по умолчанию можно использовать функции модуля БухгалтерскийУчетПереопределяемый:


ОсновнаяОрганизация = БухгалтерскийУчетПереопределяемый.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация");

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

Пример использования для других настроек (например, касса, источник финансирования)

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


&НаСервере
Процедура ПолучитьНаСервере()
    ТекПользователь = ПараметрыСеанса.ТекущийПользователь; // Или другой подходящий способ получения ссылки на пользователя
    
    // Получение основного источника финансирования
    Объект.ИсточникФинансирования = ПользователиБКВызовСервераПовтИсп.ПолучитьЗначениеПоУмолчанию(ТекПользователь, "ОсновнойИсточникФинансирования");
    
    // Получение основной кассы
    Объект.Касса = ПользователиБКВызовСервераПовтИсп.ПолучитьЗначениеПоУмолчанию(ТекПользователь, "ОсновнаяКасса");
КонецПроцедуры

В этом примере мы видим, что для разных настроек используется одна и та же функция ПолучитьЗначениеПоУмолчанию, но с разными именами параметров.

Резюме и рекомендации

  1. Используйте типовые функции: Всегда старайтесь использовать существующие в конфигурации функции (например, УправлениеПользователями.ПолучитьЗначениеПоУмолчанию), так как они уже содержат проверенную логику и учитывают особенности конфигурации.
  2. Правильный объект пользователя: Особое внимание уделяйте типу объекта, представляющего пользователя, который вы передаете в функции. ПараметрыСеанса.ТекущийПользователь является наиболее универсальным и рекомендуемым способом получения ссылки на элемент справочника "Пользователи" для серверного кода и запросов.
  3. Проверяйте имена настроек: Убедитесь, что строковое имя настройки (например, "ОсновноеПодразделениеОрганизации") точно соответствует тому, как оно хранится в регистре сведений "НастройкиПользователей" или как его ожидает типовая функция.
  4. Специфика конфигурации: Имейте в виду, что для конкретных конфигураций (БП, ЗУП, УНФ и т.д.) могут существовать свои уникальные функции и подходы для получения наиболее востребованных настроек (например, основной организации).

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

← На главную