Визуально то, что было, и то, как хотел заказчик, можно увидеть из скриншотов.
Теперь распишем программную реализацию.
Сперва рассмотрим заполнение этого подменю пунктами с названиями настроек. В этом нам поможет событие динамического списка "ПриОбновленииСоставаПользовательскихНастроекНаСервере":
&НаСервере Процедура СписокПриОбновленииСоставаПользовательскихНастроекНаСервере(СтандартнаяОбработка) // Сперва очищаем кнопки подменю Лис_Настройки УдалитьКнопкиИзФормы(); Лис_ИдентификаторыКомандНастроек.Очистить(); // Первой кнопкой делаем "Сброс настроек" ДобавитьКомандуНаФорму(Новый Структура("Представление", "--Сброс--")); СписокНастроек = ХранилищеПользовательскихНастроекДинамическихСписков.ПолучитьСписок("Документ.ЗаказКлиента.Форма.ФормаСпискаДокументов.Список"); Для Каждого ТекНастройка Из СписокНастроек Цикл ДобавитьКомандуНаФорму(ТекНастройка); НоваяСтрока = Лис_ИдентификаторыКомандНастроек.Добавить(); НоваяСтрока.Команда = ТекНастройка.Представление; НоваяСтрока.Идентификатор = ТекНастройка.Значение; КонецЦикла; КонецПроцедуры &НаСервере Процедура УдалитьКнопкиИзФормы() КомандыКУдалению = Новый Массив; ЭлементыКУдалению = Новый Массив; Для Каждого ТекКоманда Из Команды Цикл Если Лев(ТекКоманда.Имя, 16) = "КомандаНастройка" Тогда КомандыКУдалению.Добавить(ТекКоманда); КонецЕсли; КонецЦикла; Для Каждого ТекЭлемент Из Элементы Цикл Если Лев(ТекЭлемент.Имя, 16) = "КомандаНастройка" И ТипЗнч(ТекЭлемент) = Тип("КнопкаФормы") Тогда ЭлементыКУдалению.Добавить(ТекЭлемент); КонецЕсли; КонецЦикла; Для Каждого ТекКоманда Из КомандыКУдалению Цикл Команды.Удалить(ТекКоманда); КонецЦикла; Для Каждого ТекЭлемент Из ЭлементыКУдалению Цикл Элементы.Удалить(ТекЭлемент); КонецЦикла; КонецПроцедуры
Здесь:
Лис_Настройки - группа-подменю, добавленная на командную панель списка, в моем случае имеет заголовок "Фильтры".
Лис_ИдентификаторыКомандНастроек - таблица значений в реквизитах формы. Имеет в колонки:
1) Команда - тип "Строка". Содержит название команды.
2) Идентификатор - тип "Строка". Содержит идентификатор этой команды.
Если необходимо, чтобы состав настроек в нашем подменю обновлялся автоматически после сохранения новой настройки, то вызов "СписокПриОбновленииСоставаПользовательскихНастроекНаСервере" следует поместить в обработчик события этого списка "ПриСохраненииПользовательскихНастроекНаСервере".
Далее идет процедура программного наполнения подменю командами:
&НаСервере Процедура ДобавитьКомандуНаФорму(ТекНастройка) Если ТипЗнч(ТекНастройка) = Тип("Структура") Тогда ИмяКоманды = "КомандаНастройкаСбросНастроек"; Иначе ИмяКоманды = "КомандаНастройка" + Формат(ТекНастройка.ПолучитьИдентификатор(), "ЧГ="); КонецЕсли; Команда = Команды.Добавить(ИмяКоманды); Команда.Заголовок = ТекНастройка.Представление; Команда.Действие = "КомандаПрименениеНастройкиПользователя"; НовыйЭлемент = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), Элементы.Лис_Настройки); НовыйЭлемент.ИмяКоманды = ИмяКоманды; НовыйЭлемент.Заголовок = ТекНастройка.Представление; КонецПроцедуры
Теперь рассмотрим код на исполнение через эти команды:
&НаКлиенте Процедура КомандаПрименениеНастройкиПользователя(Команда) Если Команда.Имя = "КомандаНастройкаСбросНастроек" Тогда ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбораДинамическогоСписка(Список); Для Каждого ТекНастройка Из Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл Если ТипЗнч(ТекНастройка) = Тип("ОтборКомпоновкиДанных") Тогда ТекНастройка.Элементы.Очистить(); КонецЕсли; КонецЦикла; Иначе ПрименитьНастройкуСервер(Команда.Имя); КонецЕсли; КонецПроцедуры &НаСервере Процедура ПрименитьНастройкуСервер(ИмяКоманды) Команда = Команды.Найти(ИмяКоманды); // По имени команды находим ее идентификатор в ТЗ НайденныеСтроки = Лис_ИдентификаторыКомандНастроек.НайтиСтроки(Новый Структура("Команда", Команда.Заголовок)); Если НайденныеСтроки.Количество() Тогда // Если строка найдена, то получаем настройку по ключу ВыборкаНастройки = ХранилищеПользовательскихНастроекДинамическихСписков.Выбрать(Новый Структура("КлючОбъекта, КлючНастроек, Пользователь", "Документ.ЗаказКлиента.Форма.ФормаСпискаДокументов.Список", НайденныеСтроки[0].Идентификатор, ПараметрыСеанса.ТекущийПользователь)); Попытка ВыборкаНастройки.Следующий(); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Список.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(ВыборкаНастройки.Настройки); КонецЕсли; КонецПроцедуры
ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбораДинамическогоСписка описана в типовых модулях УТ11, у меня установлен релиз Управление торговлей, редакция 11.2 (11.2.2.100).