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

29.07.11

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
НастройкиСервер
.txt 16,76Kb
93
93 Скачать (1 SM) Купить за 1 850 руб.

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

 

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

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 Платные (руб)

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

6000 руб.

16.01.2015    62987    44    59    

82

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

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

2400 руб.

29.06.2020    18859    26    6    

41

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

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

1500 руб.

06.10.2020    10231    7    7    

10

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    16840    mrXoxot    43    

121

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    7375    smielka    37    

100

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

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

27.12.2023    14803    916    elcoan    47    

117

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

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

2 стартмани

10.04.2023    11916    162    acces969    31    

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

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

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


да

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


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

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

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

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

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

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

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


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

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	глНастройкиСписковСервер.ВосстановитьНастройкиСписка(Список,Настройки.Получить("ФормаСписка"));
КонецПроцедуры
Показать
kholkin; MissionOnly; +2 Ответить
18. Stepa86 1531 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. Широкий 693 12.12.13 19:09 Сейчас в теме
Зачем ты настройки в xml сериализуешь?
20. Stepa86 1531 12.12.13 20:21 Сейчас в теме
(19) а я чот на автомате... завтра посмотрю как работает без сериализации
21. Stepa86 1531 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 4273 06.05.16 19:40 Сейчас в теме
почерпнул информацию о данных формы, хоть этим пригодилось.

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


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

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


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


Показать
25. mwoleg 55 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 1531 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 Сейчас в теме
А есть такая же приблуда для обычной формы и не динамического списка?? В документах на УФ работает, в Справочнике обычная форма ругается, что нет ИмяФормы.
Оставьте свое сообщение