Как сохранить настройки отбора компоновщика данных в реквизитах справочника?

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

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

Понимание проблемы сериализации

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

Шаг 1: Подготовка реквизитов

Для хранения настроек создайте в справочнике реквизит с типом ХранилищеЗначения. Именно в него мы будем помещать сериализуемые настройки отбора.

Шаг 2: Реализация сохранения настроек

Для сохранения данных используйте событие ПередЗаписьюНаСервере. Важно делать это именно до того, как данные попадут в базу. Использование ПриЗаписиНаСервере приведет к тому, что изменения не сохранятся, так как запись в базу уже произошла.

Рассмотрим пример кода для сохранения настроек:


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    // Сохраняем объект настроек в хранилище значений
    ТекущийОбъект.НастройкиСКД = Новый ХранилищеЗначения(ЭтотОбъект.КомпоновщикСхемы.Настройки);
КонецПроцедуры

Шаг 3: Восстановление настроек при чтении

Для загрузки сохраненных настроек лучше всего подходит событие ПриЧтенииНаСервере. Это обеспечивает корректное восстановление данных при каждом открытии формы. В событии ПриСозданииНаСервере стоит выполнять лишь первичную инициализацию, если объект новый и настроек еще не существует.

Разберем логику восстановления:


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    СохраненнаяНастройка = ТекущийОбъект.НастройкиСКД.Получить();
    Если ЗначениеЗаполнено(СохраненнаяНастройка) Тогда
        КомпоновщикСхемы.ЗагрузитьНастройки(СохраненнаяНастройка);
    КонецЕсли;
КонецПроцедуры

Рекомендации и важные нюансы

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

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

← На главную