Как в 1С программно получить сохраненные настройки управляемой формы

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

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

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

Куда и в каком формате сохраняются данные формы

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

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

Почему метод ПолучитьСписок возвращает пустой список

Проанализируем распространенную ошибку: попытку вызвать метод ПолучитьСписок менеджера хранилища настроек. Метод ХранилищеСистемныхНастроек.ПолучитьСписок(КлючОбъекта) предназначен для получения списка сохраненных именованных вариантов настроек (например, вариантов отчетов или сохраненных именованных схем). Элементы возвращаемого списка значений содержат ключи настроек.

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

Способ 1. Прямое чтение через метод Загрузить (рекомендуемый)

Самый быстрый и правильный способ получить сохраненные данные формы без избыточных циклов — использовать метод Загрузить() системного хранилища. Разберем реализацию этого способа на примере:


КлючОбъекта = "Обработка.ПомощникПродаж.Форма.Форма/ТекущиеДанные";
КлючНастроек = ""; // Для автоматически сохраняемых данных всегда используется пустая строка

ДанныеНастроек = ХранилищеСистемныхНастроек.Загрузить(КлючОбъекта, КлючНастроек);

Если ДанныеНастроек <> Неопределено И ТипЗнч(ДанныеНастроек) = Тип("Соответствие") Тогда
    // Получаем конкретное значение по пути к данным реквизита
    ЗначениеСклада = ДанныеНастроек["Объект.Склад"];
    
    // При необходимости можно обойти все сохраненные реквизиты формы
    Для Каждого ЭлементНастройки Из ДанныеНастроек Цикл
        ИмяРеквизита = ЭлементНастройки.Ключ;
        ЗначениеРеквизита = ЭлементНастройки.Значение;
    КонецЦикла;
КонецЕсли;

Этот метод не выполняет поиск по таблице настроек, а мгновенно извлекает объект Соответствие по точному совпадению ключа объекта и ключа настройки.

Способ 2. Получение настроек через выборку

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


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

Выборка = ХранилищеСистемныхНастроек.Выбрать(Отбор);
Пока Выборка.Следующий() Цикл
    Если ТипЗнч(Выборка.Настройки) = Тип("Соответствие") Тогда
        ЗначениеСклада = Выборка.Настройки["Объект.Склад"];
        Сообщить("Сохраненный склад: " + ЗначениеСклада);
    КонецЕсли;
КонецЦикла;

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

Работа с настройками через штатные события управляемой формы

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

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

Важные нюансы и ограничения

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

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