В практике разработки и администрирования 1С часто возникает задача переноса персональных настроек от одного пользователя другому. Особенно остро вопрос встает, когда данные были записаны через глобальные методы СохранитьЗначение и ВосстановитьЗначение, либо когда список ключей настроек заранее неизвестен (например, если настройки создавались внешними обработками или динамическим кодом). Разберем, как устроено системное хранение таких настроек в платформе 1С:Предприятие 8, почему стандартные попытки отбора могут возвращать пустой результат и как правильно реализовать программное копирование данных.
Методы СохранитьЗначение и ВосстановитьЗначение исторически появились в обычном приложении, однако в современных версиях платформы 8.2 и 8.3 они работают поверх системного объекта ХранилищеОбщихНастроек. Понимание того, как платформа транслирует вызовы этих методов, позволяет легко управлять данными:
СохранитьЗначение(ИмяКлюча, Значение) платформа преобразует в системный вызов: ХранилищеОбщихНастроек.Сохранить(ИмяКлюча, "", Значение, , ИмяПользователя).КлючОбъекта, а системное свойство КлючНастроек остается пустой строкой "".Отбор.Вставить("КлючОбъекта", ""), выборка всегда вернет пустой результат, так как в поле КлючОбъекта содержатся реальные имена сохраненных параметров.Проанализируем, как правильно сформировать выборку, чтобы гарантированно извлечь все сохраненные значения конкретного пользователя.
Для того чтобы прочитать абсолютно все настройки пользователя-донора без предварительного знания имен ключей, необходимо использовать объект ОтборХранилищаНастроек с фильтрацией исключительно по имени пользователя. Рассмотрим рабочий пример кода для копирования настроек от одного пользователя другому:
// Создаем объект отбора по пользователю-источнику
Отбор = Новый ОтборХранилищаНастроек;
Отбор.Пользователь = ИмяПользователяДонора;
// Получаем выборку всех сохраненных параметров пользователя
Выборка = ХранилищеОбщихНастроек.Выбрать(Отбор);
Пока Выборка.Следующий() Цикл
// Ключ настройки находится в свойстве КлючОбъекта
ТекущийКлючОбъекта = Выборка.КлючОбъекта;
ТекущийКлючНастройки = Выборка.КлючНастройки;
// Считываем сохраненное значение для пользователя-донора
ЗначениеНастройки = ХранилищеОбщихНастроек.Загрузить(
ТекущийКлючОбъекта,
ТекущийКлючНастройки,
,
ИмяПользователяДонора
);
// Сохраняем значение пользователю-приемнику
ХранилищеОбщихНастроек.Сохранить(
ТекущийКлючОбъекта,
ТекущийКлючНастройки,
ЗначениеНастройки,
,
ИмяПользователяПриемника
);
КонецЦикла;
Разберем по шагам, как выгрузить эти настройки в таблицу значений для интерактивного выбора (например, для отображения пользователю списка настроек с возможностью выбора нужных флажками):
Функция ПолучитьТаблицуНастроекПользователя(ИмяПользователя) Экспорт
ТЗНастроек = Новый ТаблицаЗначений;
ТЗНастроек.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Булево"));
ТЗНастроек.Колонки.Добавить("КлючОбъекта", Новый ОписаниеТипов("Строка"));
ТЗНастроек.Колонки.Добавить("КлючНастройки", Новый ОписаниеТипов("Строка"));
ТЗНастроек.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
ТЗНастроек.Колонки.Добавить("Значение");
Отбор = Новый ОтборХранилищаНастроек;
Отбор.Пользователь = ИмяПользователя;
Выборка = ХранилищеОбщихНастроек.Выбрать(Отбор);
Пока Выборка.Следующий() Цикл
СтрокаТЗ = ТЗНастроек.Добавить();
СтрокаТЗ.Пометка = Истина;
СтрокаТЗ.КлючОбъекта = Выборка.КлючОбъекта;
СтрокаТЗ.КлючНастройки = Выборка.КлючНастройки;
СтрокаТЗ.Представление = Выборка.Представление;
// Получаем само значение
СтрокаТЗ.Значение = ХранилищеОбщихНастроек.Загрузить(
Выборка.КлючОбъекта,
Выборка.КлючНастройки,
,
ИмяПользователя
);
КонецЦикла;
Возврат ТЗНастроек;
КонецФункции
При выполнении операций чтения и записи чужих пользовательских настроек необходимо учитывать требования подсистемы безопасности 1С:
SaveUserData). Если данного права нет, платформа сгенерирует исключение о нарушении прав доступа при попытке указать чужое имя пользователя в параметрах методов Загрузить, Сохранить или Выбрать.В зависимости от того, в каком интерфейсе и какими механизмами были сохранены пользовательские данные, платформа 1С предоставляет несколько специализированных менеджеров хранилищ. Все они поддерживают одинаковый синтаксис методов Выбрать(), Загрузить(), Сохранить() и Удалить():
ХранилищеОбщихНастроек — хранит общие настройки конфигурации, данные процедур СохранитьЗначение, пользовательские структуры и произвольные соответствия.ХранилищеСистемныхНастроек — содержит параметры интерфейса, геометрию и положение окон, состав и видимость командных панелей, историю выбора.ХранилищеНастроекДанныхФорм — сохраняет значения реквизитов управляемых и обычных форм между сеансами работы.ХранилищеПользовательскихНастроекОтчетов и ХранилищеВариантовОтчетов — содержат пользовательские варианты отчетов системы компоновки данных (СКД), сохраненные отборы и оформление.ХранилищеПользовательскихНастроекДинамическихСписков — отвечает за персональные фильтры, сортировки, группировки и условное оформление списков документов и справочников.Если нет необходимости писать собственный обработчик с нуля, можно воспользоваться готовыми решениями:
При выполнении массового переноса настроек обратим внимание на два критических нюанса: