Как правильно сохранить настройки другого пользователя через ХранилищеОбщихНастроек в 1С?

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

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

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

В чем заключается основная причина ошибки

Синтаксис метода сохранения выглядит следующим образом:


ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки, ОписаниеНастроек, Пользователь);

Параметр Пользователь имеет строковый тип. Типичная ошибка заключается в передаче в этот параметр строкового представления ссылки на справочник Пользователи (например, Ссылка.Наименование или полного ФИО сотрудника). В результате создается запись настроек для строки, которая не совпадает с системным именем учетной записи.

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

Если текущий пользователь («Вася») сохраняет настройки под своим сеансом, платформа неявно подставляет его системное имя ИмяПользователя(). Если же администратор при сохранении передает значение наименования из справочника (например, «Иванов Василий Петрович»), платформа трактует это как совершенно другого пользователя. В итоге сохраняются две независимые копии настроек.

Способы получения корректного имени пользователя

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

  1. Если требуется получить системное имя текущего сеанса:

    Используем встроенную функцию платформы ИмяПользователя():

    
    ИмяТекущего = ИмяПользователя();
    ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки, , ИмяТекущего);
    
  2. Если на форме выбран элемент справочника «Пользователи» (типовые конфигурации на базе БСП):

    В типовых конфигурациях (УТ 11, ERP, КА, УНФ, БП 3.0) связь справочника с объектом ПользовательИнформационнойБазы хранится через уникальный идентификатор. Для безопасного получения логина вызываем функцию БСП:

    
    ИмяПользователяИБ = Пользователи.ИмяПользователяИнформационнойБазы(СсылкаНаПользователя);
    Если ЗначениеЗаполнено(ИмяПользователяИБ) Тогда
        ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки, , ИмяПользователяИБ);
    КонецЕсли;
    
  3. Если логика пишется без использования БСП:

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

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

Особенности прав доступа и работа в расширениях

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

  1. Право «Администрирование данных»:

    Обычный пользователь без полных прав или без роли с правом АдминистрированиеДанных (или Администрирование) имеет доступ только к собственным настройкам. Если в коде, выполняемом обычным пользователем, явно указать пятый параметр (даже если передать его собственное имя), платформа может вызвать исключение нарушения прав доступа. Для обычных пользователей вызов метода должен производиться без передачи параметра Пользователь либо в привилегированном режиме.

  2. Безопасный режим расширений:

    Если код выполняется внутри расширения конфигурации, у которого включен «Безопасный режим», вызов УстановитьПривилегированныйРежим(Истина) игнорируется платформой. Чтобы администраторские алгоритмы управления чужими настройками отрабатывали корректно, у расширения в режиме «1С:Предприятие» должен быть отключен безопасный режим (снят соответствующий флаг в списке расширений) либо настроен соответствующий профиль безопасности.

  3. Кэширование настроек сеансом пользователя:

    Если администратор перезаписал настройки для пользователя, который в этот момент уже авторизован в системе, изменения могут не примениться мгновенно из-за клиентского кэширования. Пользователю потребуется закрыть соответствующую форму или перезапустить сеанс «1С:Предприятия».

Альтернативный вариант: хранение параметров в регистре сведений

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

Создадим регистр со следующей структурой:

  1. Измерения: Пользователь (Тип: СправочникСсылка.Пользователи), КлючНастройки (Тип: Строка).
  2. Ресурс: Значение (Тип: ХранилищеЗначения или Произвольный).

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

← На главную