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

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

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

Архитектурные причины различий между управляемыми и обычными формами

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

В обычных формах отчет функционирует иначе:

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

Способ 1. Программное сохранение через системное хранилище настроек

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

Перед загрузкой пользовательских настроек важно помнить обязательное правило: компоновщик настроек должен быть инициализирован схемой компоновки данных. Без инициализации сопоставление элементов коллекции будет некорректным.

Разберем код обработчика события ПриОткрытии обычной формы отчета:


Процедура ПриОткрытии()
    
    // 1. Обязательно инициализируем компоновщик настроек схемой
    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    
    // 2. Формируем ключи для поиска сохраненных данных
    КлючОбъекта = "ВнешнийОтчет_" + ЭтотОбъект.Метаданные().Имя;
    КлючНастроек = "ПользовательскиеНастройки";
    
    // 3. Загружаем сохраненную коллекцию из хранилища
    СохраненныеНастройки = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта, КлючНастроек);
    Если СохраненныеНастройки <> Неопределено Тогда
        КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(СохраненныеНастройки);
    КонецЕсли;

КонецПроцедуры

Теперь добавим код сохранения в обработчик события ПередЗакрытием или ПриЗакрытии формы:


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

КонецПроцедуры

Способ 2. Использование свойств отчета и хранилища вариантов

Проанализируем возможность работы со свойствами самого объекта отчета. Даже у внешнего отчета в палитре свойств есть параметры Хранилище вариантов и Хранилище настроек.

  1. Открываем внешний отчет в конфигураторе.
  2. Через главное меню или панель конфигуратора переходим в Действия → Свойства (для корня отчета).
  3. Находим свойства ХранилищеНастроек или ХранилищеВариантов.
  4. Указываем стандартное хранилище конфигурации (например, ХранилищеВариантовОтчетов или ХранилищеПользовательскихНастроекОтчетов, если они реализованы в составе типовой конфигурации).

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

Способ 3. Сохранение через события формы «ПередСохранениемЗначений»

Если форма отчета использует встроенную командную панель с сохранением значений формы, подключим сохранение пользовательских настроек через системную структуру:


Процедура ПередСохранениемЗначений(Отказ, СтруктураНастроек)
    
    // Помещаем пользовательские настройки СКД в сохраняемую структуру
    СтруктураНастроек.Вставить("ПользовательскиеНастройкиСКД", КомпоновщикНастроек.ПользовательскиеНастройки);

КонецПроцедуры

Процедура ПослеВосстановленияЗначений(СтруктураНастроек)
    
    Если СтруктураНастроек.Свойство("ПользовательскиеНастройкиСКД") Тогда
        НастройкиСКД = СтруктураНастроек.ПользовательскиеНастройкиСКД;
        Если НастройкиСКД <> Неопределено Тогда
            КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(НастройкиСКД);
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Отображение пользовательских настроек на обычной форме

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

  1. Размещаем на форме элемент управления Табличное поле.
  2. В свойстве Тип значения выбираем ПользовательскиеНастройкиКомпоновкиДанных.
  3. В поле Данные прописываем путь: КомпоновщикНастроек.ПользовательскиеНастройки.
  4. Нажимаем автоматическое создание колонок — платформа сформирует табличную часть со всеми доступными пользовательскими элементами.

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

← На главную