Понадобилось сохранять между сеансами настройки структуры СКД и отборы. Такое может понадобится если, например, в каждом экземпляре отчёта у вас разные отборы и параметры, но хочется иметь возможность сохранять группировки.
В моём случае это был подбор товаров в документ. Параметры заполнялись автоматом из документа, но структуру и отбор пользователь должен был иметь возможность менять, сохранять и загружать.
Прочитав в справке, что ГруппировкаКомпоновкиДанных может быть сериализован в/из XDTO. я обрадовался, но ненадолго, т.к. загрузить отдельно настройки группировок невозможно (если для настройек есть метод ЗагрузитьНастройки() то для частей настроек таких методов нет, а как было бы удобно ЗагрузитьНастройкиГруппировок() например )
Осталось два варианта
1) Прочитать из XDTO группировки и отборы, перебрать их и создать
Тут нет ничего сложного. делается это примерно так
КоллекцияСтруктуры=Настройки.Структура;
ГруппировкаКомпоновкиДанных=КоллекцияСтруктуры.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ПоляГруппировки=ГруппировкаКомпоновкиДанных.ПоляГруппировки;
КоллекцияПолей=ПоляГруппировки.Элементы;
ПолеГруппировки=КоллекцияПолей.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Поле=Новый ПолеКомпоновкиДанных("Номенклатура");
ПолеГруппировки.ТипГруппировки=ТипГруппировкиКомпоновкиДанных.Иерархия;
и если бы мне нужно было сохранять только группировки или только отборы, то я бы так и поступил.
Но раз мне по сути нужно оставить "как есть" только параметры, а загружать "всё остальное"
то пришла идея:
2) Сохранять все настройки, загружать все настройки и подменять в них параметры.
&НаКлиенте
Процедура СохранитьНастройкиВФайл(Команда)
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогВыбораФайла.Заголовок = "Сохранить в файл (Относительный путь)";
ДиалогВыбораФайла.Фильтр ="Файл настроек(*.xml)|*.xml";
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
Если ДиалогВыбораФайла.Выбрать() Тогда
ФайлНастроек=ДиалогВыбораФайла.ПолноеИмяФайла;
Иначе
Возврат;
КонецЕсли;
Текстxml=ПолучитьТекстXML( Объект.КомпоновщикНастроек.настройки);
Док=Новый ТекстовыйДокумент;
Док.УстановитьТекст(Текстxml);
Док.Записать(ФайлНастроек);
КонецПроцедуры
&НаКлиенте
Процедура ВосстановитьНастройкиИзФайла(Команда)
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.Заголовок = "Выберите Файл";
ДиалогВыбораФайла.Фильтр ="Файл настроек(*.xml)|*.xml";
ДиалогВыбораФайла.ПредварительныйПросмотр = Ложь;
Если ДиалогВыбораФайла.Выбрать() Тогда
ФайлНастроек=ДиалогВыбораФайла.ПолноеИмяФайла;
Иначе
Возврат;
КонецЕсли;
Док=Новый ТекстовыйДокумент;
Док.Прочитать(ФайлНастроек);
Текстxml=Док.ПолучитьТекст();
ПолучитьНастройкуИзXML(Текстxml,Объект.КомпоновщикНастроек.настройки);
КонецПроцедуры
&НаСервере
Функция ПолучитьТекстXML (Знач Настройки) Экспорт
Текст = "";
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Настройки, "settingsComposition", "http://v8.1c.ru/8.1/data-composition-system/settings");
Текст = ЗаписьXML.Закрыть();
Возврат Текст;
КонецФункции
&НаСервере
Процедура ПолучитьНастройкуИзXML (ТекстXML,Знач Настройки) Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(ТекстXML);
Настр=СериализаторXDTO.ПрочитатьXML(ЧтениеXML,Тип("НастройкиКомпоновкиДанных"));
Для Каждого ЭлементСтруктуры Из Настр.ПараметрыДанных.Элементы Цикл
ЭлНастройки=Настройки.ПараметрыДанных.Элементы.Найти(ЭлементСтруктуры.Параметр);
Если ЭлНастройки=Неопределено Тогда
Сообщить("Не верные параметры настроек");
Продолжить;
КонецЕсли;
ЭлементСтруктуры.Значение= ЭлНастройки.Значение;
ЭлементСтруктуры.Использование=ЭлНастройки.Использование;
КонецЦикла;
Объект.КомпоновщикНастроек.ЗагрузитьНастройки(Настр);
КонецПроцедуры
P.S. Я буду рад, если мне подскажут менее "велосипедное решение"
Прикрепляю файл с примером сохранения настроек. Внешняя обработка подключается как обработка заполнения к заказу покупателя в УТ11, имеет простейшую схему СКД. При вызове заполняются параметры, на форме есть кнопки сохранения и восстановления всего кроме параметров.