Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Сохранение/восстановление настроек динамического списка          
Vofka Подменю пользователя
сообщение 09.08.11, 13:57
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

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

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

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

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


[необходимо зарегистрироваться для просмотра ссылки]

[необходимо зарегистрироваться для просмотра ссылки]

Спасибо сказали: nimasu,

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 24.04.24, 15:39
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!