Программное управление пользовательскими настройками динамического списка

30.04.16

Разработка - Механизмы платформы 1С

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

Визуально то, что было, и то, как хотел заказчик, можно увидеть из скриншотов. Теперь распишем программную реализацию.

Сперва рассмотрим заполнение этого подменю пунктами с названиями настроек. В этом нам поможет событие динамического списка "ПриОбновленииСоставаПользовательскихНастроекНаСервере":

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

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

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

Здесь: 

Лис_Настройки - группа-подменю, добавленная на командную панель списка, в моем случае имеет заголовок "Фильтры".

Лис_ИдентификаторыКомандНастроек - таблица значений в реквизитах формы. Имеет в колонки: 

1) Команда - тип "Строка". Содержит название команды.

2) Идентификатор - тип "Строка". Содержит идентификатор этой команды.

Если необходимо, чтобы состав настроек в нашем подменю обновлялся автоматически после сохранения новой настройки, то вызов "СписокПриОбновленииСоставаПользовательскихНастроекНаСервере" следует поместить в обработчик события этого списка "ПриСохраненииПользовательскихНастроекНаСервере".

 

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

 

&НаСервере
Процедура ДобавитьКомандуНаФорму(ТекНастройка)
	Если ТипЗнч(ТекНастройка) = Тип("Структура") Тогда 
		ИмяКоманды = "КомандаНастройкаСбросНастроек";
	Иначе 
		ИмяКоманды = "КомандаНастройка" + Формат(ТекНастройка.ПолучитьИдентификатор(), "ЧГ=");
	КонецЕсли;
	Команда = Команды.Добавить(ИмяКоманды);
	Команда.Заголовок = ТекНастройка.Представление;
	Команда.Действие = "КомандаПрименениеНастройкиПользователя";
	НовыйЭлемент = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), Элементы.Лис_Настройки);
	НовыйЭлемент.ИмяКоманды = ИмяКоманды;
	НовыйЭлемент.Заголовок = ТекНастройка.Представление; 
КонецПроцедуры

Теперь рассмотрим код на исполнение через эти команды:

 

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

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

ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбораДинамическогоСписка описана в типовых модулях УТ11, у меня установлен релиз Управление торговлей, редакция 11.2 (11.2.2.100).

пользовательские настройки динамический список

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4590    dsdred    53    

73

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5304    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6432    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18495    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12105    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8845    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6284    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    16005    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. DrAku1a 1679 05.05.16 02:17 Сейчас в теме
Автору ресект (+) за разбор внутренностей динамического списка!
Вроде как выбирать настройку в отдельном окошке - удобнее. Кнопку выбора настроек можно было вынести отдельно - создав кнопку и добавив действие из стандартных.
Скриншот ниже - сделал в 8.3, аналогичной настройки в 8.2 - просто не нашёл...
Прикрепленные файлы:
2. lisrws 143 06.05.16 19:11 Сейчас в теме
(1) DrAku1a, спасибо за дополнение. но заказчик именно такой бантик захотел)))
3. japopov 68 20.07.21 10:23 Сейчас в теме
(0) Автор, пожалуйста, уточните:
Ваша функция "Установить стандартные настройки" НЕ устанавливает стандартные пользовательские настройки, а очищает их! Разница становится важна, если по умолчанию пользовательские настройки не пустые.
4. DELOVOYDOM 26.11.23 17:22 Сейчас в теме
Автор, Вы слукавили.

Если необходимо, чтобы состав настроек в нашем подменю обновлялся автоматически после сохранения новой настройки, то вызов "СписокПриОбновленииСоставаПользовательскихНастроекНаСервере­" следует поместить в обработчик события этого списка "ПриСохраненииПользовательскихНастроекНаСервере".

Вы прекрасно знаете что уходит в зацикленность, так как это событие вызывается даже при выборе настройки!!!!
В итоге вы не смогли это сделать, поэтому и не сделали. Не доделали точнее тему) не нашли как побороть
Оставьте свое сообщение