Идея не моя, я ее только докрутил под себя. Вычитал основу тут.
Основные моменты и предпосылки:
1) Преобразуем настройки списков так, чтобы их можно было сохранять
2) в 95% случаев при открытии формы нам нужно, чтобы восстановилось последнее состояние формы, а не по умолчанию или список выбора сохраненной настройки(которую еще и сохранить до этого нужно было)
3) Списки в основном учавствуют в формах списка и выбора, где нет других полей к сохранению, поэтому к стандартному механизму с методами ПриСохраненииДанныхВНастройкахНаСервере и ПриЗагрузкеДанныхИзНастроекНаСервере больно то не подрубишся
После небольшой работы мозгами получилось следующее:
в форме пишем такой код:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ксНастройкиСервер.ВосстановитьНастройкиСписка( ЭтаФорма );
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии()
СохранитьНастройкиСписка();
КонецПроцедуры
Процедура СохранитьНастройкиСписка()
ксНастройкиСервер.СохранитьНастройкиСписка( ЭтаФорма );
КонецПроцедуры
или аналогично внедряем в методы ПриСохраненииДанныхВНастройкахНаСервере и ПриЗагрузкеДанныхИзНастроекНаСервере одноименные процедуры.
Внедряем в конфигурацию общий модуль ксНастройкаСервер с таким содержанием:
//ПРИМЕР ВЫЗОВА ИЗ ФОРМЫ ДЛЯ АВТОНАСТРОЕК
//
//&НаСервере
//Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//
// ксНастройкиСервер.ВосстановитьНастройкиСписка( ЭтаФорма );
//
//КонецПроцедуры
//
//&НаКлиенте
//Процедура ПриЗакрытии()
//
// СохранитьНастройкиСписка();
//
//КонецПроцедуры
//
//Процедура СохранитьНастройкиСписка()
//
// ксНастройкиСервер.СохранитьНастройкиСписка( ЭтаФорма );
//
//КонецПроцедуры
//////////////////////////////////////////////////////////////////////////////////////
//СОХРАНЕНИЕ И ВОССТАНОВЛЕНИЕ НАСТРОЕК ДИН. СПИСКАМ
Процедура СохранитьНастройкиСписка( пФорма, пИмяСписка = "" ) Экспорт
Настройки = Новый Соответствие;
ПриСохраненииДанныхВНастройках( Настройки, пФорма, пИмяСписка );
ХранилищеНастроекДанныхФорм.Сохранить( пФорма.ИмяФормы,, Настройки );
КонецПроцедуры
Процедура ВосстановитьНастройкиСписка( пФорма, пИмяСписка = "" ) Экспорт
Настройки = ХранилищеНастроекДанныхФорм.Загрузить( пФорма.ИмяФормы );
Если ТипЗнч( Настройки ) = Тип( "Соответствие" ) Тогда
ПриЗагрузкеДанныхИзНастроек( Настройки, пФорма, пИмяСписка );
КонецЕсли;
КонецПроцедуры
Процедура ПриСохраненииДанныхВНастройках( Настройки , пФорма, пИмяСписка = "" ) Экспорт
имяСписка = "Список";
Если ЗначениеЗаполнено( пИмяСписка ) Тогда
имяСписка = пИмяСписка;
КонецЕсли;
УстановитьНастройкиДинСпискаВСоответствиие( Настройки, пФорма[имяСписка], пИмяСписка );
КонецПроцедуры
Процедура УстановитьНастройкиДинСпискаВСоответствиие( пСоответствие, пСписок, пИмяСписка = "" )
префиксКлюча = ПрефиксКлючаНастроекСписка( пИмяСписка );
пСоответствие.Вставить( префиксКлюча + "Группировка" , СериализоватьГруппировки( пСписок.Группировка ) );
пСоответствие.Вставить( префиксКлюча + "Отбор" , СериализоватьОтбор( пСписок.Отбор ) );
пСоответствие.Вставить( префиксКлюча + "Порядок" , СериализоватьПорядок( пСписок.Порядок ) );
пСоответствие.Вставить( префиксКлюча + "УсловноеОформление", СериализоватьУсловноеОформление( пСписок.УсловноеОформление ) );
КонецПроцедуры
Функция ПрефиксКлючаНастроекСписка( пИмяСписка )
префиксКлюча = "";
Если ЗначениеЗаполнено( пИмяСписка ) Тогда
префиксКлюча = пИмяСписка + "_";
КонецЕсли;
Возврат префиксКлюча;
КонецФункции
Процедура ПриЗагрузкеДанныхИзНастроек( Настройки , пФорма, пИмяСписка = "" ) Экспорт
имяСписка = "Список";
Если ЗначениеЗаполнено( пИмяСписка ) Тогда
имяСписка = пИмяСписка;
КонецЕсли;
УстановитьНастройкиИзСоответствияВДинСписок( Настройки, пФорма[имяСписка], пИмяСписка );
КонецПроцедуры
Процедура УстановитьНастройкиИзСоответствияВДинСписок( пСоответствие, пСписок, пИмяСписка = "" )
префиксКлюча = ПрефиксКлючаНастроекСписка( пИмяСписка );
ДесериализоватьГруппировки( пСоответствие[ префиксКлюча + "Группировка" ] , пСписок.Группировка);
ДесериализоватьОтбор( пСоответствие[ префиксКлюча + "Отбор" ] , пСписок.Отбор);
ДесериализоватьПорядок( пСоответствие[ префиксКлюча + "Порядок" ] , пСписок.Порядок);
ДесериализоватьУсловноеОформление( пСоответствие[ префиксКлюча + "УсловноеОформление" ] , пСписок.УсловноеОформление);
КонецПроцедуры
// Группировки
Функция СериализоватьГруппировки(пГруппировки)
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьНачалоЭлемента("Группировки");
Для Каждого цЭлементГруппировки Из пГруппировки.Элементы Цикл
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, цЭлементГруппировки);
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
Возврат ЗаписьXML.Закрыть();
КонецФункции // СериализоватьГруппировки()
Процедура ДесериализоватьГруппировки(пНастройки_Группировка, пГруппировка)
пГруппировка.Элементы.Очистить();
Если пНастройки_Группировка <> Неопределено Тогда
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(пНастройки_Группировка);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Группировки" Тогда
ЧтениеXML.Прочитать();
Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя <> "Группировки" Цикл
ПолеГруппировкиXML = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ПолеГруппировки = пГруппировка.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(ПолеГруппировки, ПолеГруппировкиXML);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ДесериализоватьГруппировки()
// Порядок
Функция СериализоватьПорядок(пПорядок)
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьНачалоЭлемента("Порядок");
Для Каждого цЭлементПорядка Из пПорядок.Элементы Цикл
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, цЭлементПорядка);
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
Возврат ЗаписьXML.Закрыть();
КонецФункции // СериализоватьПорядок()
Функция ДесериализоватьПорядок(пНастройки_Порядок, пПорядок)
пПорядок.Элементы.Очистить();
Если пНастройки_Порядок <> Неопределено Тогда
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(пНастройки_Порядок);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Порядок" Тогда
ЧтениеXML.Прочитать();
Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя <> "Порядок" Цикл
ПолеПорядкаXML = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ПолеПорядка = пПорядок.Элементы.Добавить(ТипЗнч(ПолеПорядкаXML));
ЗаполнитьЗначенияСвойств(ПолеПорядка, ПолеПорядкаXML);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецФункции // ДесериализоватьПорядок()
// Отборы
Функция СериализоватьОтбор(пОтбор)
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьНачалоЭлемента("Отборы");
Для Каждого цЭлементОтбора Из пОтбор.Элементы Цикл
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, цЭлементОтбора);
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
Возврат ЗаписьXML.Закрыть();
КонецФункции // СериализоватьОтбор()
Процедура ДесериализоватьОтбор(пНастройки_Отбор, пОтбор)
пОтбор.Элементы.Очистить();
Если пНастройки_Отбор <> Неопределено Тогда
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(пНастройки_Отбор);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "Отборы" Тогда
ЧтениеXML.Прочитать();
Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя <> "Отборы" Цикл
ПолеОтбораXML = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ПолеОтбора = пОтбор.Элементы.Добавить(ТипЗнч(ПолеОтбораXML));
СкопироватьЭлементыОтбораРекурсивно(ПолеОтбораXML, ПолеОтбора);
//ПолеОтбора.Поле = ПолеОтбораXML.Поле;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ДесериализоватьОтбор()
Процедура СкопироватьЭлементыОтбораРекурсивно(пОтборОткуда, пОтборКуда);
ЗаполнитьЗначенияСвойств(пОтборКуда, пОтборОткуда);
Если ТипЗнч(пОтборОткуда) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
Для Каждого ЭлементОтбора Из пОтборОткуда.Элементы Цикл
НовыйЭлементОтбора = пОтборКуда.Элементы.Добавить(ТипЗнч(ЭлементОтбора));
СкопироватьЭлементыОтбораРекурсивно(ЭлементОтбора, НовыйЭлементОтбора);
КонецЦикла;
КонецЕсли;
КонецПроцедуры // СкопироватьЭлементыОтбораРекурсивно()
// Условное оформление
Функция СериализоватьУсловноеОформление(пУсловноеОформление)
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьНачалоЭлемента("УсловноеОформление");
Для Каждого цЭлементУсловногоОформления Из пУсловноеОформление.Элементы Цикл
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, цЭлементУсловногоОформления);
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента();
Возврат ЗаписьXML.Закрыть();
КонецФункции // СериализоватьУсловноеОформление()
Функция ДесериализоватьУсловноеОформление(пНастройки_УсловноеОформление, пУсловноеОформление)
пУсловноеОформление.Элементы.Очистить();
Если пНастройки_УсловноеОформление <> Неопределено Тогда
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(пНастройки_УсловноеОформление);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ЧтениеXML.Имя = "УсловноеОформление" Тогда
ЧтениеXML.Прочитать();
Пока ЧтениеXML.ТипУзла <> ТипУзлаXML.КонецЭлемента И ЧтениеXML.Имя <> "УсловноеОформление" Цикл
ПолеУсловногоОформленияXML = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ПолеУсловногоОформления = пУсловноеОформление.Элементы.Добавить();
ЗаполнитьЗначенияСвойств(ПолеУсловногоОформления, ПолеУсловногоОформленияXML);
Для Индекс = 0 по ПолеУсловногоОформленияXML.Оформление.ДоступныеПараметры.Элементы.Количество()-1 Цикл
ЗаполнитьЗначенияСвойств(ПолеУсловногоОформления.Оформление.ДоступныеПараметры.Элементы[Индекс],
ПолеУсловногоОформленияXML.Оформление.ДоступныеПараметры.Элементы[Индекс]);
КонецЦикла;
Для Индекс = 0 по ПолеУсловногоОформленияXML.Оформление.Элементы.Количество()-1 Цикл
ЗаполнитьЗначенияСвойств(ПолеУсловногоОформления.Оформление.Элементы[Индекс],
ПолеУсловногоОформленияXML.Оформление.Элементы[Индекс]);
КонецЦикла;
Для каждого ЭлементОтбораXML ИЗ ПолеУсловногоОформленияXML.Отбор.Элементы Цикл
ЭлементОтбора = ПолеУсловногоОформления.Отбор.Элементы.Добавить(ТипЗнч(ЭлементОтбораXML));
СкопироватьЭлементыОтбораРекурсивно(ЭлементОтбораXML, ЭлементОтбора);
КонецЦикла;
Для каждого ПолеXML ИЗ ПолеУсловногоОформленияXML.Поля.Элементы Цикл
Поле = ПолеУсловногоОформления.Поля.Элементы.Добавить();
ЗаполнитьЗначенияСвойств(Поле, ПолеXML);
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецФункции // ДесериализоватьУсловноеОформление()