В процессе разработки часто возникает задача предоставить пользователю возможность гибко настраивать фильтрацию данных в справочниках (например, для автовыгрузки прайс-листов), при этом сохраняя эти настройки для последующего использования. Рассмотрим, как реализовать этот функционал и как корректно выводить нужные данные в отчет или таблицу значений.
Чтобы настройки пользователя не пропадали при закрытии формы, необходимо сохранить объект КомпоновщикНастроек.Настройки в реквизит справочника, имеющий тип ХранилищеЗначения. Рассмотрим, как это сделать правильно.
Для начала создадим реквизит справочника с типом ХранилищеЗначения. При записи элемента справочника в обработчике на сервере мы можем сохранить настройки следующим образом:
// Сохранение настроек при записи объекта
Объект.НастройкиХранилище = Новый ХранилищеЗначения(КомпоновщикНастроек.Настройки);
Объект.Записать();
Если у вас возникла сложность с тем, что настройки не сохраняются в объекте формы, убедитесь, что вы работаете с актуальным экземпляром данных на сервере. При чтении настроек, например, в регламентном задании или при открытии формы, используйте следующий подход:
// Восстановление настроек
Если Объект.НастройкиХранилище <> Неопределено Тогда
Настройки = Объект.НастройкиХранилище.Получить();
Если Настройки <> Неопределено Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
КонецЕсли;
КонецЕсли;
Важно помнить, что КомпоновщикНастроек должен быть корректно инициализирован с использованием ИсточникДоступныхНастроекКомпоновкиДанных, который ссылается на вашу схему компоновки данных.
Часто после инициализации СКД мы обнаруживаем, что в итоговой таблице значений присутствуют не все нужные нам поля. Если вы используете ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений, система выводит только те поля, которые явно выбраны в настройках СКД. Если нужные поля (например, Код или Артикул) отсутствуют в выборе пользователя, они не попадут в результат.
Чтобы гарантировать наличие нужных колонок, можно принудительно добавить их в Настройки.Выбор перед выполнением макета компоновки:
// Получаем настройки из компоновщика
Настройки = КомпоновщикНастроек.Настройки;
// Программно добавляем необходимое поле
ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПоле.Использование = Истина;
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Код"); // Имя поля из запроса СКД
// Далее выполняем компоновку
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД, Настройки,,,
Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
КомпоновщикНастроек через ИсточникДоступныхНастроекКомпоновкиДанных. Это гарантирует, что пользовательские настройки будут корректно связаны с полями схемы.СериализаторXDTO, чтобы вывести настройки в XML-строку. Это наглядно покажет, какие отборы и выбранные поля реально записаны в хранилище.ВариантыОтчетов. Она позволяет сохранять множество вариантов настроек для одного объекта без ручного программирования сериализации.Настройки.Выбор.Элементы перед принудительным добавлением полей.Применяя эти методы, вы сможете создать надежный механизм сохранения пользовательских фильтров и обеспечить стабильный результат формирования табличных данных, что значительно упростит работу пользователей с настройками автовыгрузок и отчетов.