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

У реквизитов элемента справочника нет типа "Компоновщик настроек компоновки данных", как быть?
возможно у кого-то есть идеи?
---
Сохраняйте компоновщик в реквизите с типом "ХранилищеЗначения".
---
Сохраняйте компоновщик в реквизите с типом "ХранилищеЗначения".
---
Добавил в список реквизитов справочника реквизит ДанныеОтбораР с типом Хранилище Значения.
В событии формы "при создании на сервере" написал следующий код:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

 ЭлементСправочника = ОБъект.Ссылка.ПолучитьОбъект();
  ХранилищеЗначения = ЭлементСправочника.ДанныеОтбораР;
  Если ХранилищеЗначения.Получить() = неопределено
  тогда
//Получим схему из обработки
  ОбъектТМП = РеквизитФормыВЗначение("Объект");
  СхемаКомпоновки = ОбъектТМП.ПолучитьМакет("СхемаКомпоновкиДляОтбора");

 //Берем настройки по умолчанию из схемы
  НастройкиКомпоновки = СхемаКомпоновки.НастройкиПоУмолчанию;

 //Инициализируем наш отбор
  Адрес = Новый УникальныйИдентификатор();
  URLСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновки, Адрес);
  ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(URLСхемы);

  ДанныеОтбора.Инициализировать(ИсточникНастроек);
  ДанныеОтбора.ЗагрузитьНастройки(НастройкиКомпоновки);

Иначе

  ДанныеОтбора = ХранилищеЗначения;;

  КонецЕсли;

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

В событии "При записи на сервере" добавил это, чтобы данные сохранялись в реквизит. Но что-то не работает. Ошибки никакой не выдает, отладчик по всем полям проходит. Что я не так сделал?

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)

  ТекущийОбъект.ДанныеОтбораР = ЭтотОбъект.ДанныеОтбора;

КонецПроцедуры
---
Обработчик события "ПриЗаписиНаСервере" выполняется уже после того, как данные объекта записаны в информационную базу. Т.о. данные отбора не попадают в базу. Поэтому объект нужно заполнять до записи, т.е. в обработчике "ПередЗаписьюНаСервере". При этом неверно сохраняете отбор в реквизите. Следует так:

```1c
    ТекущийОбъект.ДанныеОтбораР = Новый ХранилищеЗначения(ЭтотОбъект.ДанныеОтбора);
```
---
ТекущийОбъект.ДанныеОтбораР = Новый ХранилищеЗначения(ЭтотОбъект.ДанныеОтбора);

А вот тут теперь такая ошибка вылезла.

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

а в чтении уже обрабатываем этот отбор:

Если ХранилищеЗначения.Получить()<> Неопределено тогда
  ДанныеДляОтбора = ХранилищеЗначения.Получить();
  Для Каждого Строка из ДанныеДляОтбора.Элементы Цикл
  СтрокаОтбора = ДанныеОтбора.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
  ЗаполнитьЗначенияСвойств(СтрокаОтбора, Строка);
 КонецЦикла;
  КонецЕсли;

И так взлетело.

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

Отлично. Много времени потратил, что бы с этим справиться. Но все получилось как тут написано, только с небольшими корректировками.

Событие должно быть ПередЗаписьюНаСервере в событиях формы. И в Храниище я поместил целиком настройки. А при чтении их целиком прочитал.

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

    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

    КонецПроцедуры
```
---
Для копирования элементов отбора хорошо подходит процедура КомпоновкаДанныхКлиентСервер.СкопироватьЭлементы - в типовых УТ, БП она есть, хотя в документации по БСП нет...
---
Ну и чтение сохраненных настроек я бы порекомендовал немного подправить. Сохраненные ранее отборы лучше читать в обработчике "ПриЧтенииНаСервере". В обработчике же "ПриСозданииНаСервере" инициализировать компоновщик только в том случае, если ссылка пустая, т.е. этот новый объект (в этом случае событие "ПриЧтенииНаСервере" не срабатывает).