gifts2017

Сохранение/восстановление настроек динамического списка

Опубликовал Антон Степанов (Stepa86) в раздел Программирование - Работа с интерфейсом

Один из пороков программ - забывчивость. Пользователь настраивал настраивал под себя интерфейс, закрыл форму, открыл и вуаля... настраивай все заново. Так можно и монитор сломать. Проблему усугубляет отсутствие стандартного механизма сохранения/восстановления настроек динамических списков. Под катом решение проблемы.

Идея не моя, я ее только докрутил под себя. Вычитал основу тут.

 

Основные моменты и предпосылки:

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);
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЕсли;

КонецФункции
// ДесериализоватьУсловноеОформление()

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
НастройкиСервер
.txt 16,76Kb
27.02.13
77
.txt 16,76Kb 77 Скачать

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Oleg (mwoleg) (1.00 $m)
Подписаться Добавить вознаграждение

Комментарии

0. Антон Степанов (Stepa86) 02.08.11 13:48
Один из пороков программ - забывчивость. Пользователь настраивал настраивал под себя интерфейс, закрыл форму, открыл и вуаля... настраивай все заново. Так можно и монитор сломать. Проблему усугубляет отсутствие стандартного механизма сохранения/восстановления настроек динамических списков. Под катом решение проблемы.

Перейти к публикации

1. sumixam (sumixam) 02.08.11 13:48
выдает ошибку
{ОбщийМодуль.ксНастройкаСервер.Модуль(9,1)}: Переменная не определена (ХранилищеНастроекДанныхФорм)
<<?>>ХранилищеНастроекДанныхФорм.Сохранить( пФорма.ИмяФормы,, Настройки ); (Проверка: Тонкий клиент)
{ОбщийМодуль.ксНастройкаСервер.Модуль(15,13)}: Переменная не определена (ХранилищеНастроекДанныхФорм)
Настройки = <<?>>ХранилищеНастроекДанныхФорм.Загрузить( пФорма.ИмяФормы ); (Проверка: Тонкий клиент)
2. Антон Степанов (Stepa86) 02.08.11 14:40
(1) Модуль ксНастройкаСервер должен быть только серверным, а у тебя он еще и клиентский
3. sumixam (sumixam) 02.08.11 14:58
ну теперь всё заработало спасибо классная вешь :D
4. Agregad (Agregad) 05.08.11 07:08
Надо делать универсальнее. Для каждого пользователя свои настройки. Судя по коду у всех пользователей одни настройки.
5. Антон Степанов (Stepa86) 05.08.11 07:52
(4) 1) у каждого пользователя для каждой формы свои настройки, можешь глянуть в СП метод Сохранить для ХранилищаНастроекДанныхФормы
2) я против универсализации, мне нравятся простые изолированные механизмы, которые решают конкретную задачу
3) Механизм изначально был создан под собственное хранилище данных со своим справочником, где хранились настройки с возможностью поделится и своими формами сохранения/восстановления. В таком виде никто не стал пользоваться сохранением из за необходимости чего то там настраивать и меньшей прозрачности
6. Алексей Захаров (almas) 08.08.11 21:57
Привет! Помоги решить обратную задачу: есть табличная часть в 30 колонок. пользователь сдуру сдвинул колонку. Закрыл, открыл документ колонка не вернулась в нормальное положение.
Установка Ширины колонки при создании на сервере не помогает.
Очистка хеша --- не вариант. Поможет, но сие считаю неправильным подходом...
7. Антон Степанов (Stepa86) 09.08.11 07:43
(6) если упр. форма, то там в настройках формы есть кнопка для сброса настроек формы в по-умолчание, если обычная, то у табличного поля в настройках списка тоже есть такая кнопка
8. Ivan Shtukaturov (alaudit) 22.09.11 09:27
Хотел внедрить в фирме, но когда начал объянснять бухам, энтузиазма не последовало, хотя до этого часто сетовали на забывчивость 8,2 в списках- перескоку на первый элемент в таблицах документов, справочников и т.п. )))
9. Антон Степанов (Stepa86) 22.09.11 09:43
(8) "Если бы я спросил людей, чего они хотят, они бы попросили более быструю лошадь." (с) Генри Форд
10. torlink (TorLink) 13.12.12 11:10
Я так понимаю, что сохраняются текущие настройки. А как бы сделать чтоб была возможность выбора вариантов, в идеале конечно на подобие отчетов "выбрать/сохранить вариант."
11. Антон Степанов (Stepa86) 13.12.12 12:05
(10)
Я так понимаю, что сохраняются текущие настройки.


да

А как бы сделать чтоб была возможность выбора вариантов, в идеале конечно на подобие отчетов "выбрать/сохранить вариант."


Обычно этого не нужно. Но особых сложностей в реализации быть не должно. Я у нас делал как используя платформенный механизм сохранения, так и без него. В форме списка задачи можно посмотреть реализацию.
12. torlink (TorLink) 13.12.12 12:56
Уточните пожалуйста, что за список задач, не вижу в конфигурации такого. Где можно посмотреть оба варианта реализации? Спасибо.
13. Антон Степанов (Stepa86) 13.12.12 13:08
(12) в конфигурации на объекте Задача.упЗадача.ФормаСписка. Там есть сохранения через платформенное сохранение в списке и самописное через механизм статистик (на левой панели они)
Прикрепленные файлы:
14. torlink (TorLink) 04.02.13 12:28
(13) Stepa86, Автоматом восстанавливается, а вот с вариантами не получается почему-то.
Из вашей конфы я понял, что вызывается "ПриЗагрузкеДанныхИзНастроек". Но вы там используете Хранилище настроек, без него Варианты настроек не реализовать? Чтоб использовались типовые формы и механизмы сохранения/восстановления!!
15. Антон Степанов (Stepa86) 04.02.13 13:13
(14) на хранилище настроек собственно и хранятся настройки формы. Можно и без него, но тогда придется весь этот механизм самому писать
mwoleg; TorLink; +2 Ответить 1
16. torlink (TorLink) 04.02.13 14:59
17. Роман Зиновьев (Широкий) 12.12.13 14:37
Сваял свой вариант:
Общий модуль "глНастройкиСписковСервер" (сервер, вызов сервера)
Функция ВернутьНастройкиСписка(Список) Экспорт
	СтруктураНастроек=Новый Соответствие;
	СтруктураНастроек.Вставить("Группировка",Список.Группировка);
	СтруктураНастроек.Вставить("Отбор",Список.Отбор);
	СтруктураНастроек.Вставить("Порядок",Список.Порядок);
	СтруктураНастроек.Вставить("УсловноеОформление",Список.УсловноеОформление);
	
	Возврат СтруктураНастроек;
КонецФункции

Процедура ЗаполнитьСвойстваНастройкиОформление(ЭлементыПриемник,ЭлементыИсточник)
	Для Индекс=0 По ЭлементыИсточник.Количество()-1 Цикл
		ЗаполнитьЗначенияСвойств(ЭлементыПриемник[Индекс],ЭлементыИсточник[Индекс]);
	КонецЦикла;	
КонецПроцедуры

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

Процедура ЗаполнитьСвойстваНастройкиПоля(ЭлементыПриемник,ЭлементыИсточник)
	Для Каждого ЭлементИсточник Из ЭлементыИсточник Цикл
		ЭлементПриемник=ЭлементыПриемник.Добавить();
			
		ЗаполнитьЗначенияСвойств(ЭлементПриемник,ЭлементИсточник);
    КонецЦикла;
КонецПроцедуры	

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

Процедура ЗаполнитьСвойстваНастройкиУсловноеОформление(ЭлементыПриемник,ЭлементыИсточник)
	Для Каждого ЭлементИсточник Из ЭлементыИсточник Цикл
		ЭлементПриемник=ЭлементыПриемник.Добавить();
		
		ЗаполнитьЗначенияСвойств(ЭлементПриемник,ЭлементИсточник);
		
		ЗаполнитьСвойстваНастройкиОформление(ЭлементПриемник.Оформление.Элементы,ЭлементИсточник.Оформление.Элементы);
		ЗаполнитьСвойстваНастройкиОтбор(ЭлементПриемник.Отбор.Элементы,ЭлементИсточник.Отбор.Элементы);
		ЗаполнитьСвойстваНастройкиПоля(ЭлементПриемник.Поля.Элементы,ЭлементИсточник.Поля.Элементы);
    КонецЦикла;
КонецПроцедуры	

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


Форма списка (АвтоматическоеСохранениеДанныхФормыВНастройках = Использовать, СохранениеДанныхФормыВНастройках = Использовать список)
&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
	Настройки.Вставить("ФормаСписка",глНастройкиСписковСервер.ВернутьНастройкиСписка(Список));
КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	глНастройкиСписковСервер.ВосстановитьНастройкиСписка(Список,Настройки.Получить("ФормаСписка"));
КонецПроцедуры
...Показать Скрыть
18. Антон Степанов (Stepa86) 12.12.13 15:54
(17) в 8.3 стало еще проще.

1) Настройки теперь сохраняются и восстанавливаются самостоятельно

2) аналогичный код теперь выглядит так:

Процедура УстановитьНастройкиДинСпискаВСоответствие( пСоответствие, пСписок, пИмяСписка = "" ) Экспорт
	
	префиксКлюча = ПрефиксКлючаНастроекСписка( пИмяСписка );
	
	Если упКэш.Это8_3() Тогда
		
		запись = Новый ЗаписьXML;
		запись.УстановитьСтроку();
		
		СериализаторXDTO.ЗаписатьXML( запись, пСписок.КомпоновщикНастроек.Настройки, "Settings", "http://v8.1c.ru/8.1/data-composition-system/settings" );
		
		пСоответствие.Вставить( префиксКлюча + "Настройки", запись.Закрыть() );
		
	Иначе
		
		пСоответствие.Вставить( префиксКлюча + "Группировка"       , СериализоватьГруппировки(        пСписок.Группировка ) );
		пСоответствие.Вставить( префиксКлюча + "Отбор"             , СериализоватьОтбор(              пСписок.Отбор ) );
		пСоответствие.Вставить( префиксКлюча + "Порядок"           , СериализоватьПорядок(            пСписок.Порядок ) );
		пСоответствие.Вставить( префиксКлюча + "УсловноеОформление", СериализоватьУсловноеОформление( пСписок.УсловноеОформление ) );
		
	КонецЕсли;
	
	
	
КонецПроцедуры

Процедура УстановитьНастройкиИзСоответствияВДинСписок( пСоответствие, пСписок, пИмяСписка = "" ) Экспорт
	
	префиксКлюча = ПрефиксКлючаНастроекСписка( пИмяСписка );
	
	Если упКэш.Это8_3() Тогда
		
		значениеНастроек = пСоответствие[ префиксКлюча + "Настройки" ];
		
		Если ЗначениеЗаполнено( значениеНастроек ) Тогда
			
			чтение = Новый ЧтениеXML;
			чтение.УстановитьСтроку( значениеНастроек );
			пСписок.КомпоновщикНастроек.ЗагрузитьНастройки( СериализаторXDTO.ПрочитатьXML(чтение, Тип("НастройкиКомпоновкиДанных"))); 
			
		КонецЕсли;
		
	Иначе
		
		ДесериализоватьГруппировки(        пСоответствие[ префиксКлюча + "Группировка" ]        , пСписок.Группировка);
		ДесериализоватьОтбор(              пСоответствие[ префиксКлюча + "Отбор" ]              , пСписок.Отбор);
		ДесериализоватьПорядок(            пСоответствие[ префиксКлюча + "Порядок" ]            , пСписок.Порядок);
		ДесериализоватьУсловноеОформление( пСоответствие[ префиксКлюча + "УсловноеОформление" ] , пСписок.УсловноеОформление);
				
	КонецЕсли;	
	
	пСоответствие.Удалить(префиксКлюча + "Настройки");
	пСоответствие.Удалить(префиксКлюча + "Группировка");
	пСоответствие.Удалить(префиксКлюча + "Отбор");
	пСоответствие.Удалить(префиксКлюча + "Порядок");
	пСоответствие.Удалить(префиксКлюча + "УсловноеОформление");
	
КонецПроцедуры
...Показать Скрыть
19. Роман Зиновьев (Широкий) 12.12.13 19:09
Зачем ты настройки в xml сериализуешь?
20. Антон Степанов (Stepa86) 12.12.13 20:21
(19) а я чот на автомате... завтра посмотрю как работает без сериализации
21. Антон Степанов (Stepa86) 13.12.13 08:26
(19) Действительно работает и без сериализации. Теперь стало вообще не интересно
22. Василий Зайцев (vasiliy_b) 21.02.14 14:01
Внимательно код не изучал. Есть ли проверка, на случай удаления реквизита, который был сохранен в настройках ранее?
23. INST Deniskin (instik01) 01.09.14 02:49
В версии 8.3 сохраняются настройки типа "режим просмотра", а есть ли возможность в версии 8.2 задать настройки так, чтобы программа сохраняла "режим просмотра" последний установленный (или хотя бы при открытии объекта, например "номенклатура" режим просмотра устанавливался на "дерево")?
24. Осипов Сергей (fixin) 06.05.16 19:40
почерпнул информацию о данных формы, хоть этим пригодилось.

А я лично делаю так для сохранения табличных частей отчета:
:


&НаКлиенте
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
	
	СохранитьНастройки(Отказ, СтандартнаяОбработка);
КонецПроцедуры

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


&НаСервере
Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки)
	ДопНастройки = ХранилищеНастроекДанныхФорм.Загрузить("Отчет.ОтчетПоПродажамОстаткамДляЗаказов", "НастройкиТаблицыВидовНоменклатуры");
	Попытка
		ТЗ = ЗначениеИзСтрокиВнутр(ДопНастройки["ТабличнаяЧастьВидыНоменклатуры"]);
		Отчет.ТабличнаяЧастьВидыНоменклатуры.Загрузить(ТЗ)
	Исключение
	КонецПопытки;
КонецПроцедуры


...Показать Скрыть
25. Oleg (mwoleg) 02.10.16 12:28
Антон, добрый день!

Спасибо огромное!
Для УПП, в которой управляемые формы как что-то неестественное и потустороннее, твой метод самый действенный и боевой!!!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа