gifts2017

Подсистема сохранения и восстановления настроек динамических списков

Опубликовал Максим Зайцев (esodin) в раздел Программирование - Практика программирования

В 1с 8.2 существует прекрасный интерфейсный механизм — настройка динамического списка. Пользователь может в режиме предприятия настроить внешний вид списка по вкусу: задать отборы и группировки, установить сортировку, выделить определенные строки или ячейки при помощи условного оформления. Но есть один неприятный момент: при закрытии формы настройки не сохраняются. Предлагаемая подсистема является одним из вариантов решения этой проблемы.

 

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

Итак, «ближе к телу, как говорил Мопассан».

 

Возможности

  • - сохранение и восстановление настройки списка. Сохраняется отбор, сортировка, группировка, условное оформление;

  • - хранение произвольного количества вариантов настроек одного списка;

  • - автоматическое восстановление одной из настроек при открытии формы;

  • - автоматическое сохранение настройки при закрытии формы (для каждой настройки можно указать сохранять автоматически или нет).

  • - обмен настройками между пользователями. Каждая сохраненная настройка имеет владельца — пользователя. Сохранять можно только свои настройки, восстановить — настройки любого пользователя.
  • возможности подсистемы

Особенности


В большинстве случаев пользователю не хочется куда-то кликать, чего-то открывать, а тем более придумывать имя настройки. Пользователю нужно лишь чтобы сделанная настройка автоматически сохранялась и при следующем открытии формы автоматически восстанавливалась. Это предусмотрено: при первом закрытии формы будет создана настройка под именем «Основная», которая будет сохраняться и восстанавливаться автоматически.

Команды формы и кнопки для сохранения/восстановления настроек добавляются программно. Это избавляет от необходимости правки формы вручную и упрощает процесс обновления форм, в которых используется данный механизм.

 

Установка


Для установки объедините вашу конфигурацию с конфигурацией, прикрепленной к статье, по подсистеме УправлениеНастройкамиДинамическихСписков. Объекты, включенные в подсистему, имеют префикс унс.

установка

Для работы механизма в конфигурации должен быть справочник Пользователи, а также параметр сеанса ТекущийПользователь. Если в вашей конфигурации этих объектов нет:

  • - загрузите их из прикрепленной конфигурации;

  • - скопируйте в свою конфигурацию процедуру ОпределитьТекущегоПользователя из общего модуля УправлениеПользователями;

  • - добавьте вызов этой процедуры в предопределенную процедуру УстановкаПараметровСеанса в модуле сеанса. Примерно так:

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
   
ПараметрыСеанса.ТекущийПользователь = УправлениеПользователями.ОпределитьТекущегоПользователя();
КонецПроцедуры

Для того, чтобы включить управление настройками для элементов конкретной формы, нужно добавить в код формы следующие методы:

// по кнопке сохранения настройки
&НаКлиенте
Процедура СохранитьНастройкуДинамическогоСписка(Команда)
   
унсКлиент.СохранитьНастройку(ЭтаФорма, Команда.Имя);
КонецПроцедуры

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

// для восстановления настроек при открытии формы
&НаКлиенте
Процедура ПриОткрытии(Отказ)
   
унсКлиент.ПриОткрытииФормы( ЭтаФорма );
КонецПроцедуры

// для программного создания кнопок управления настройками
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

   
// 1 вариант: автоматический поиск таблиц с источником данных ДинамическийСписок
   
унсСервер.ПриСозданииНаСервере( ЭтаФорма );

   
//// 2 вариант: указываем через запятую имена элементов диалога (таблиц)
    //унсСервер.ПриСозданииНаСервере( ЭтаФорма, "Контрагенты,Товары" );
    //
    //// 3 вариант: передаем имена таблиц в виде массива
    //МассивОбрабатываемыеТаблицы = Новый Массив;
    //МассивОбрабатываемыеТаблицы.Добавить("Заказы");
    //МассивОбрабатываемыеТаблицы.Добавить("Товары");
    //унсСервер.ПриСозданииНаСервере( ЭтаФорма, МассивОбрабатываемыеТаблицы );

КонецПроцедуры

// для сохранения настроек при закрытии формы
&НаКлиенте
Процедура ПриЗакрытии()
   
унсКлиент.При3акрытииФормы( ЭтаФорма );
КонецПроцедуры


Технические детали


Настройки сериализуются в структуру и хранятся в справочнике в реквизите типа ХранилищеЗначения.

В методе формы ПриСозданииНаСервере вызывается одноименная процедура общего модуля унсСервер. Она принимает два параметра: первый — форма, из которой вызвана; второй (необязательный) — списки, для которых нужно включить управление настройками. Второй параметр должен быть либо строкой, в которой через запятую перечислены имена элементов формы (таблиц); либо массивом строк, в котором каждый элемент является именем элемента формы (таблицы), связанного с динамическим списком. Если второй параметр не указан, то управление настройкам будет включено для всех найденных на форме динамических списков (т. е. элементов управления с источником данных типа ДинамическийСписок).

Важный момент: имя команд сохранения и восстановления настроек состоит из трех частей, разделенных символом подчеркивания («_»): действие (сохранение либо восстановление), ИмяЭлементаУправления, ИмяРеквизита. Это нужно для того, чтобы при нажатии на кнопку сохранения/восстановления настройки система могла распознать от какого списка на форме пришло событие и какой реквизит служит источником данных этого списка. Это накладывает ограничение: имя реквизита типа ДинамическийСписок и имя элемента управления, который с ним связан, не должны содержать символов подчеркивания («_»).

 

В прикрепленном архиве:

  1. 1Cv8.dt - демонстрационная база;

  2. 1Cv8.cf - конфигурация для объединения;

  3. readme.txt - инструкция по установке.

     

     

Другие публикации на данную тему:

http://infostart.ru/public/88010/

 

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

Наименование Файл Версия Размер Кол. Скачив.
Хранение настроек динамических списков.zip
.zip 97,32Kb
14.10.11
248
.zip 97,32Kb 248 Скачать

См. также

PowerTools от 1 000
Подписаться Добавить вознаграждение

Комментарии

1. Артур Аюханов (artbear) 14.10.11 10:57
Хорошая работа. Плюсую.
sergos3331; +1 Ответить
2. Александр Зубцов (iov) 14.10.11 15:17
Отличное оформление- грамотный подход к созданию подсистемы - однозначно плюс в карму!
sergos3331; +1 Ответить
3. Владимир Клименко (KliMich) 14.10.11 21:35
Грамотный подход. Такого в БСП (Библиотеке Стандартных Подсистем) не видел!
4. Noy A (Noy12) 14.10.11 22:13
Неплохо сработал. Уважуха
5. Сергей Ожерельев (Поручик) 14.10.11 22:17
(0) Чтоб мне так жить! Отличная вещь, даже не глядя. В первый же понедельник завнедрю в рабочий проект.
6. Георгий Перминов (Georgsius) 15.10.11 00:41
Спасибо, отличная работа!
7. Tanya Kuteleva (Vikt0r0vna) 18.10.11 11:33
8. Dem Dem (dem_mad) 19.10.11 13:42
И пришло то время, когда пользователи управляемых форм уже начинают придумывать всякие хотелки по удобству работы с интерфейсом. К сожалению, сама платформа некоторые вещи сама делать еще не умеет или просто не умеет. Данная работа помогла сэкономить много времени. Большущее спасибо автору!
9. Андрей Казанцев (ander_) 19.10.11 15:34
Молодец, поклал в копилку. Спасибо.
10. Сергей Ожерельев (Поручик) 20.10.11 09:54
Всегда самого напрягало отсутствие сохранить настройки списка.
11. Dmitry Chernykh (dim0n_la) 14.11.11 01:02
Подскажите, есть ли возможность сбросить все настройки списка. Так сказать вернуться к стандартной настройке, такой как она задана в конфигураторе. Очень интересна именно такая возможность.
12. Максим Зайцев (esodin) 29.11.11 17:39
(11) dim0n_la,
Кнопки "Сбросить все настройки" нет. Но возможность сбросить все настройки есть: создайте настройку "без настроек" и восстанавливайте ее при необходимости.
Меня смущает только "... как она задана в конфигураторе.". Возможно, вы в конфигураторе задаете настройки, которые зависят от каких-то параметров. Например, при открытии формы заказов в форму передаете параметр Контрагент, форма открывается с программно установленным отбором по этому контрагенту. В таком случае придется отказаться от автовосстановления настройки для того, чтобы работал ваш механизм отбора.
13. Dmitry Chernykh (dim0n_la) 29.11.11 18:33
(12)
esodin пишет:
создайте настройку "без настроек" и восстанавливайте ее при необходимости.

Спасибо, такой вариант рассматривал, но он не подходит. Нужно именно получить настройку "как она задана загрузилась бы, зайди пользователь сейчас в предприятие в первый раз", скажем так.
Нужен именно такой вариант.
Никаких параметров не передается, просто в конфигураторе я настраиваю, к примеру, цвет строк проведенных документов зелененькими. Пользователи работают так 2 дня, соответственно эта настройка у них сохранилась, и каждый раз восстанавливается предприятием сама. Но теперь я ещё добавляю в конфигураторе настройку, которая подсвечивает все помеченные на удаление - красненьким, обновляю, но у пользователей при новом входе ничего не обновилось. Для того чтобы настройки применились, им нужно каждому у себя удалить всё оформление, закрыть форму и снова открыть. Неудобно!
14. Максим Зайцев (esodin) 30.11.11 13:01
(13) dim0n_la,

Итак.

Что происходит.
На форме динамический список. У пользователей есть автоматически сохраняемые и восстанавливаемые "основные" настройки этого списка. Вы в конфигураторе мышкой (не программно ПриОткрытии) изменяете условное оформление списка. Пользователи этих изменений не видят, т.к. у них при открытии формы восстанавливается "основная" настройка. Чтобы увидеть изменения пользователь должен 1. в настройках дин. списка удалить все элементы условного оформления; 2. снять у настройки "основная" галку "открывать" или вообще удалить эту настройку 3. Закрыть / открыть форму.

Как платформа управляет настройками дин. списка.
Рассмотрим случай когда на форме есть дин. список, для него не используется подсистема управления настройками. Настройки, заданные в конфигураторе "мышкой", будем называть "настройки разработчика". Настройки, заданные в режиме предприятия, будем называть "настройки пользователя". Ситуация следующая: заданы настройки разработчика, пользователь открыл форму, изменил все настройки (отбор, сортировка, группировка, УО). Какие настройки будут установлены при следующем открытии формы:
Отбор: сначала восстанавливаются настройки пользователя со сброшенными галочками использования, затем восстанавливаются настройки разработчика. В случае конфликта приоритет у настроек разработчика.
Сортировка и группировка: восстанавливаются настройки разработчика.
Условное оформление: восстанавливаются настройки пользователя. Получается, если пользователь изменил настройки УО (или не изменил, а просто открыл настройку списка, нажал ОК, без изменения настроек), то изменения в настройках разработчика не повлияют на настройки списка, восстановленные платформой. Настройки разработчика установятся только если в настройках пользователя список элементов УО пустой. Вот это как раз наша ситуация.

Что делать.
Вариант без доработки подсистемы вы сами подсказали: в режиме предприятия удалить настройки УО, удалить основную сохраненную настройку, закрыть/открыть форму. Это неудобно. Нужно дорабатывать подсистему. Вижу два приемлемых варианта доработки.
1. Сделать настройку "Стандарт". Подсистема при закрытии формы будет сохранять текущую настройку, затем очищать настройки списка. При следующем открытии формы платформа установит настройки разработчика, затем подсистема запомнит эти настройки под именем "стандарт", после чего восстановит пользовательскую настройку с галкой "открывать". В вашем случае получается так: вы меняете в конфигураторе настройку, пользователь открывает форму, видит свою основную настройку, затем жмет "восстановить настройку", выбирает настройку "Стандарт", видит ту настройку, которую вы установили в конфигураторе.
2. Сделать возможность сохранения настроек не для конкретного пользователя, а для группы пользователей или для всех пользователей. Заводим роль унсАдминистратор. Пользователь с этой ролью может управлять настройками других пользователей, настройками "для групп пользователей" и настройками "для всех пользователей". Пользователь без этой роли может сохранять только свои настройки, а настройки своей группы или всех пользователей только восстанавливать. При открытии формы подсистема отбирает все настройки с признаком Открывать "для всех пользователей", "для группы пользователя", "для текущего пользователя" и выбирает из них настройку "с большей конкретизацией": если есть настройка "для всех пользователей" и есть настройка "для текущего пользователя", то будет восстановлена настройка "для текущего пользователя"; если есть настройка для группы 1-го уровня и для группы 2-го уровня, то будет восстановлена настройка для группы второго уровня. В вашем случае вам в режиме предприятия нужно будет создать общую настройку для всех пользователей. В конфигураторе настраивать ничего не будем. К примеру вам нужно сделать чтобы подсвечивались документы, помеченные на удаление. Вы в режиме предприятия восстанавливаете настройку для всех пользователей (или создаете ее). В УО задаете подсветку для помеченных, сохраняете настройку как "настройку для всех пользователей", говорите пользователям восстановить общую настройку. Причем, если у пользователя нет собственной сохраненной настройки, то общая настройка будет установлена автоматически.
Мне больше нравится второй вариант. Идея не моя, такую доработку предложил Gluk_1C. Думаю её реализовать на выходных.
15. Dmitry Chernykh (dim0n_la) 30.11.11 13:19
(14)Большое спасибо за развернутый ответ. И первый и второй вариант вполне имеет право на жизнь. Уже рассматривал для себя их оба. Думаю второй вариант мне больше подходит, но не полностью, а только в части возможности распространения настройки на всех пользователей, чтобы они могли ее увидеть и при желании переключиться.
16. Максим Зайцев (esodin) 30.11.11 13:25
(15)
Хорошо. Сделаю второй вариант - настройки для всех пользователей и для группы пользователей. Выложу как следующую версию. Ориентировочно - на ближайших выходных.
17. roha (roha) 05.12.11 19:55
Сегодня подключил дынный модуль, работает отлично.
Есть следующие вопросы, можна ли сделать так чтоб сохранялися так же настройки колонок (видимость,порядок) с возможностью востановления другим пользователем (то что изменяется через "Изменить Форму"), хть ети настройки и сохраняет платформа но они часто вылетают + есть необходимость копировать настройки колонок и расположения другим пользователям
19. Егор Гусев (EgorGGG) 03.04.12 10:39
Ребята!

Подсистема реально нужная!
Но не хотелось бы снимать конфигурацию с поддержки, можно ли «заставить» платформу сохранять хотя бы последний вариант динамического списка стандартными способами?

Если все таки снять конфиг с поддержки и только объединить конфигурации по инструкции, то реально избежать дальнейших проблем при обновлении??
20. Константин Матвеев (koka) 21.05.12 21:54
Хорошая, удобная доработка. Однозначно плюс. Только желательно в начале публикации указать, что заточена для управляемого приложения, чтобы коллеги сразу понимали ограничения.
21. Юрий Пермитин (YPermitin) 29.05.12 08:20
Огромное спасибо за труд! Разработка очень помогла при решении задачи сохранения настроек. Все грамотно выполнено.
22. friend0 26.09.12 19:48
Отличная вещь! Начинаю воевать с управляемыми формами - очень помогло. Вот только столкнулся с одной проблемой:

Делаю навороченную форму списка справочника. В ней у меня несколько динамических списков - один основной, и парочка информационных. Для основного списка использую командную панель формы, для информационных вообще не делаю, чтоб не загромождать. И вот вопрос - как мне вытащить кнопки сохранения/восстановления на панель формы? Тыкался-тыкался ничего не придумал, кроме как допилить функцию унсСервер.ПриСозданииНаСервере третьим параметром, чтоб добавляло в панель формы даже если динамический список не один. Это, конечно, коряво, но работает, если во втором параметре один элемент.

А вообще, наверное, надо будет массив на таблицу значений заменить и в ней указывать добавлять ли на командную панель формы и в контекстное меню. Насколько я понимаю, сейчас контекстное меню вообще не используется? А то вещь-то удобная.
23. Максим Рак (Stitchi) 22.01.13 17:14
Странно, что публикация не доступа для скачивания...
24. Walter (WalterMort) 29.01.13 02:10
Платформенная фишка:

УправляемаяФорма.ПриСохраненииДанныхВНастройкахНаСервере (ManagedForm.OnSaveDataInSettingsAtServer)
УправляемаяФорма (ManagedForm)
ПриСохраненииДанныхВНастройкахНаСервере (OnSaveDataInSettingsAtServer)
Синтаксис:

ПриСохраненииДанныхВНастройкахНаСервере(<Настройки>)
Параметры:

<Настройки>

Тип: Соответствие.
Настройки формы.
Описание:

В обработчик передается объект-соответствие, в который будут сохраняться настройки. В объекте уже заполнены значения реквизитов, которые требовалось сохранять.
В обработчике можно добавить в объект настроек какую-либо информацию. Например, поместить в реквизит настроек отбор. <========== ЧИТАТЬ ТУТ.
25. Aleksandr Filonov (AleksSF) 25.02.13 23:41
Не совсем понятно как увязывается справочник Пользователи со встроенным списком пользователей. Их нужно вручную дублировать или я что-то пропустил
26. Макс Савостин (mc1c80) 31.07.13 09:45
Спасибо большое. Очень помогло.
27. Геннадий Зимин (kenza) 14.08.13 10:18
(16) esodin, Добрый день! Хорошая разработка, благодарю. Но хотел бы узнать когда доделаете возможность установки всем пользователям или группе пользователей одинаковой настройки. Еще бы хотелось бы вариант установки жесткой настройки формы, чтобы была возможность некоторым пользователям отключать возможность настройки форм, но это уже как нибудь сам попробую решить. Больше интересует возможность группового применения настроек )
28. Sasha Забол (zba) 25.09.13 18:39
Блин вообще уважуха тебе, прям нуу прям вообще, сэкономил мне н-ое количество часов, а то и дней моей жизни.
29. Женька Ture (ture) 27.04.14 10:07
После полугода использования, пришлось влезать и переделывать почти по всем пунктам.
База в почти 2 тб на 500 активных юзаков вешается.

Вылезли все глупости с ростом активных юзверей.

этот "разработчик" приоткрытии ставит отборы, которые идут следом за отборами присозданиенасеревре, т.е. база колбасит дважды.

этот "разработчик" навязывает свои "последние" отборы автоматом, а глупые зверьки и без того боятся и не понимают программу. это все надо вырубать, т.к. последние отборы часто бесполезны, т.к. зверьки работают во вкладках УФ, а вот нагрузка отборов мимо индексов, которую надо будет сразу после открытия зверьку менять, нагружает сервак до нельзя.

а вот текущую строку "разработчик" не догадался сохранять. хотя и это не нужно моим юзверям, т.к. часто им надо в конец списка.
30. Андрей Шойко (AndreyS55) 05.07.16 13:45
Отличная подсистемка, автору + за идею и исполнение.
31. Андрей Шойко (AndreyS55) 05.07.16 13:53
(29) ture, и что что пришлось переписывать? Я тоже немного подработал напильником под себя, и оптимизировал. Не вижу ни одной причины писать "разработчик" в кавычках. Тем более подсистема бесплатная.
PhoenixAOD; +1 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа