Как получить и скопировать все сохраненные настройки пользователя в 1С без знания ключей?

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

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

Архитектура хранения настроек СохранитьЗначение в платформе 1С

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

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

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

Программный обход и копирование настроек через ХранилищеОбщихНастроек

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


// Создаем объект отбора по пользователю-источнику
Отбор = Новый ОтборХранилищаНастроек;
Отбор.Пользователь = ИмяПользователяДонора;

// Получаем выборку всех сохраненных параметров пользователя
Выборка = ХранилищеОбщихНастроек.Выбрать(Отбор);

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

Разберем по шагам, как выгрузить эти настройки в таблицу значений для интерактивного выбора (например, для отображения пользователю списка настроек с возможностью выбора нужных флажками):


Функция ПолучитьТаблицуНастроекПользователя(ИмяПользователя) Экспорт

    ТЗНастроек = Новый ТаблицаЗначений;
    ТЗНастроек.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Булево"));
    ТЗНастроек.Колонки.Добавить("КлючОбъекта", Новый ОписаниеТипов("Строка"));
    ТЗНастроек.Колонки.Добавить("КлючНастройки", Новый ОписаниеТипов("Строка"));
    ТЗНастроек.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
    ТЗНастроек.Колонки.Добавить("Значение");

    Отбор = Новый ОтборХранилищаНастроек;
    Отбор.Пользователь = ИмяПользователя;

    Выборка = ХранилищеОбщихНастроек.Выбрать(Отбор);

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

    Возврат ТЗНастроек;

КонецФункции

Права доступа и безопасность при работе с чужими настройками

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

  1. Роль и право доступа: Для чтения и изменения настроек других пользователей у текущего сеанса (администратора) должно быть включено право роли «Сохранение данных пользователя» (SaveUserData). Если данного права нет, платформа сгенерирует исключение о нарушении прав доступа при попытке указать чужое имя пользователя в параметрах методов Загрузить, Сохранить или Выбрать.
  2. Миф об изолированности: Хранилище настроек не является недоступным «черным ящиком» или уязвимостью в безопасности. Администратор с соответствующими правами имеет полный программный доступ ко всем системным таблицам настроек информационной базы без необходимости прямого чтения таблиц СУБД.

Обзор системных хранилищ платформы 1С

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

  1. ХранилищеОбщихНастроек — хранит общие настройки конфигурации, данные процедур СохранитьЗначение, пользовательские структуры и произвольные соответствия.
  2. ХранилищеСистемныхНастроек — содержит параметры интерфейса, геометрию и положение окон, состав и видимость командных панелей, историю выбора.
  3. ХранилищеНастроекДанныхФорм — сохраняет значения реквизитов управляемых и обычных форм между сеансами работы.
  4. ХранилищеПользовательскихНастроекОтчетов и ХранилищеВариантовОтчетов — содержат пользовательские варианты отчетов системы компоновки данных (СКД), сохраненные отборы и оформление.
  5. ХранилищеПользовательскихНастроекДинамическихСписков — отвечает за персональные фильтры, сортировки, группировки и условное оформление списков документов и справочников.

Альтернативные и готовые инструменты переноса

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

  1. Типовой механизм БСП «Копирование настроек»: В конфигурациях на базе Библиотеки стандартных подсистем (1С:ERP, КА, УТ, БП, ЗУП) доступна обработка в разделе «Администрирование -> Настройки пользователей и прав -> Персональные настройки пользователей -> Копирование настроек». Она позволяет в интерактивном режиме скопировать настройки отчетов, списков и внешнего вида форм между пользователями.
  2. Редактор хранилищ настроек (Инструменты разработчика / ИР): Специализированная внешняя обработка или расширение из комплекта «Инструменты разработчика», позволяющая просматривать, фильтровать, редактировать, экспортировать и удалять записи из любых системных хранилищ информационной базы.

Важные практические рекомендации

При выполнении массового переноса настроек обратим внимание на два критических нюанса:

  1. Кэширование в активных сеансах: Если пользователь-приемник в момент копирования находится в системе, платформа кэширует его настройки в памяти сеанса. При завершении работы сеанс пользователя может перезаписать сохраненные администратором данные старыми значениями из памяти. Рекомендуется выполнять перенос при завершенном сеансе пользователя-приемника.
  2. Перенос ссылочных данных между базами: Если настройки содержат ссылки на элементы справочников или документы, копирование таких данных корректно работает только в рамках одной информационной базы. При попытке перенести настройки через файл в другую базу ссылки на объекты могут стать битыми (получат статус «Объект не найден») из-за несовпадения уникальных идентификаторов (GUID).
← На главную