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