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

29.07.11

Разработка - Работа с интерфейсом

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

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

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

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

 

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

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

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

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61793    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54398    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16695    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10734    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9607    151    acces969    31    

118

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3665    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12077    1    5    

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

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

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


да

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


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

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

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

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

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

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

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


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

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	глНастройкиСписковСервер.ВосстановитьНастройкиСписка(Список,Настройки.Получить("ФормаСписка"));
КонецПроцедуры
Показать
kholkin; MissionOnly; +2 Ответить
18. Stepa86 1521 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(чтение, Тип("НастройкиКомпоновкиДанных"))); 
			
		КонецЕсли;
		
	Иначе
		
		ДесериализоватьГруппировки(        пСоответствие[ префиксКлюча + "Группировка" ]        , пСписок.Группировка);
		ДесериализоватьОтбор(              пСоответствие[ префиксКлюча + "Отбор" ]              , пСписок.Отбор);
		ДесериализоватьПорядок(            пСоответствие[ префиксКлюча + "Порядок" ]            , пСписок.Порядок);
		ДесериализоватьУсловноеОформление( пСоответствие[ префиксКлюча + "УсловноеОформление" ] , пСписок.УсловноеОформление);
				
	КонецЕсли;	
	
	пСоответствие.Удалить(префиксКлюча + "Настройки");
	пСоответствие.Удалить(префиксКлюча + "Группировка");
	пСоответствие.Удалить(префиксКлюча + "Отбор");
	пСоответствие.Удалить(префиксКлюча + "Порядок");
	пСоответствие.Удалить(префиксКлюча + "УсловноеОформление");
	
КонецПроцедуры
Показать
27. a_inves 16.03.17 12:55 Сейчас в теме
(18)

Если упКэш.Это8_3() Тогда

Пытался вставить в Бух. 3.0 - ругается на упКэш.Это8_3() ...
19. Широкий 692 12.12.13 19:09 Сейчас в теме
Зачем ты настройки в xml сериализуешь?
20. Stepa86 1521 12.12.13 20:21 Сейчас в теме
(19) а я чот на автомате... завтра посмотрю как работает без сериализации
21. Stepa86 1521 13.12.13 08:26 Сейчас в теме
(19) Действительно работает и без сериализации. Теперь стало вообще не интересно
22. vasiliy_b 284 21.02.14 14:01 Сейчас в теме
Внимательно код не изучал. Есть ли проверка, на случай удаления реквизита, который был сохранен в настройках ранее?
23. instik01 01.09.14 02:49 Сейчас в теме
В версии 8.3 сохраняются настройки типа "режим просмотра", а есть ли возможность в версии 8.2 задать настройки так, чтобы программа сохраняла "режим просмотра" последний установленный (или хотя бы при открытии объекта, например "номенклатура" режим просмотра устанавливался на "дерево")?
24. fixin 4252 06.05.16 19:40 Сейчас в теме
почерпнул информацию о данных формы, хоть этим пригодилось.

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


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

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


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


Показать
25. mwoleg 54 02.10.16 12:28 Сейчас в теме
Антон, добрый день!

Спасибо огромное!
Для УПП, в которой управляемые формы как что-то неестественное и потустороннее, твой метод самый действенный и боевой!!!
28. jmi 2 24.06.17 15:35 Сейчас в теме
Отлично кроме момента. Платформа 1С:Предприятие 8.3 (8.3.9.1850) в управляемой форме с несколькими динамическими списками
вышла ошибка (см прикл файл) в функции ДесериализоватьУсловноеОформление:


Нужно добавить пропускать заполнение параметра ДоступныеЗначения

			Для Индекс = 0 по ПолеУсловногоОформленияXML.Оформление.ДоступныеПараметры.Элементы.Количество()-1 Цикл
					ЗаполнитьЗначенияСвойств(ПолеУсловногоОформления.Оформление.ДоступныеПараметры.Элементы[Индекс],
					ПолеУсловногоОформленияXML.Оформление.ДоступныеПараметры.Элементы[Индекс],,"ДоступныеЗначения");
				КонецЦикла;
Прикрепленные файлы:
29. Stepa86 1521 24.06.17 16:07 Сейчас в теме
(28) 8.3 умеет штатно сохранять/восстанавливать настройки списков. Этот костыль там не нужен
30. jmi 2 24.06.17 16:10 Сейчас в теме
(29) у меня не работает штатное. Скорее всего потому что конфигурация "Управление торговлей", редакция 10.3" и там совместимость стоит с 8,2. Отборы сохраняются кроме например галки использовать да /нет
31. jmi 2 24.06.17 16:42 Сейчас в теме
И еще момент на форме три динамических списка (форма регистра сведений). Так вот настройки Динам. списка который основной реквизит сохраняет, других нет, а именно не сохраняются флажки использовать например в отборе
32. iiupavlikhin 21.12.17 11:16 Сейчас в теме
Всем привет.
Мне недавно понадобилось сделать динамический список в документе. Отборы динамического списка должны сохраняться прямо в документе (реквизит ОтборЗатратыРаспределенные с типом хранилище значения), т.к. в каждом документе отборы уникальны. И, соответственно, они должны подгружаться при открытии документа, что бы пользователь видел, что он там отбирал, и на основании каких данных динамического списка были заполнены табличные части документа.


Сперва о сохранении настроек, тут всё элементарно. Используем процедуру ПослеЗаписиНаСервере. Пытался сделать перед записью через РеквизитФормыВЗначение, но, почему-то, не получалось.

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


Теперь восстанавливаем настройки при открытии документа:

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


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

Показать


Работает даже со сложными отборами с группировками "и, или, не"...
zba; sapervodichka; +2 Ответить
33. G_108408780541402684893 08.11.23 10:07 Сейчас в теме
А есть такая же приблуда для обычной формы и не динамического списка?? В документах на УФ работает, в Справочнике обычная форма ругается, что нет ИмяФормы.
Оставьте свое сообщение