Работа с элементом формы, связанным с отбором настроек компоновщика

1. Ivan_Stepnov 04.07.22 20:38 Сейчас в теме
Здравствуйте, уважаемые форумчане!

Возникла необходимость поместить на форму динамического списка справочника "Партнеры" в УТ контрол, позволяющий задавать отборы элементов списка по значениям дополнительных свойств. Каждая строка должна содержать дополнительное свойство, вид сравнения и значение отбора. Причем вызов команды "Настроить список" по кнопке "Еще" начальство не устраивает - хотят, чтобы на той же форме, где список, задавался и произвольный отбор по свойствам. Я решил, что для это цели подходит объект КомпоновщикНастроек.
Я вывел на форму списка контрол с путем "КомпоновщикНастроек.Настройки.Отбор".
И в него можно вносить строки, у которых поле "ЛевоеЗначение" соответствует реквизитам справочника "Партнеры", но есть необходимость ограничить набор полей отбора ТОЛЬКО дополнительными свойствами. И сделать это у меня никак не получается. Пытался задать событие ПередНачаломИзменения:

ТекущаяСтрока = Элемент.ТекущаяСтрока;

В переменной ТекущаяСтрока возвращается числовой параметр типа "ИдентификаторКомпоновкиДанных". По идее, хотелось бы прописать выбор из списка дополнительных свойств, результат которого после выбора проставить в поле "ЛевоеЗначение" редактируемой строки. Но как потом по этому идентификатору найти эту строку в отборе настроек компоновщика? Не нашел я такого поиска! пробовал по-другому: задать полю "ЛевоеЗначение" программно список выбора - тоже не получилось!
Может, кто-нибудь сталкивался с таким объектом - подскажите, пожалуйcта, возможно ли решить эту задачу?

Заранее благодарю
По теме из базы знаний
Найденные решения
2. Ivan_Stepnov 05.07.22 11:31 Сейчас в теме
Наконец разобрался сам
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Ivan_Stepnov 05.07.22 11:31 Сейчас в теме
Наконец разобрался сам
3. petleon 9 05.07.22 12:20 Сейчас в теме
(2) Поделись пожалуйста как реализовал?
4. Ivan_Stepnov 05.07.22 14:12 Сейчас в теме
Вот таким путем:

На контрол с путем "КомпоновщикНастроек.Настройки.Отбор" повесил событие ПередНачаломИзменения:

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

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

                //Запуск выбора реквизита
		Пар = Новый Структура("ИдентификаторКомпоновкиДанных", ИдентификаторКомпоновкиДанных);
		Оповещение = Новый ОписаниеОповещения("КомпоновщикНастроекНастройкиОтбор_ПослеВыбораРеквизита", ЭтотОбъект, Пар);
		ПоказатьВыборИзСписка(Оповещение, СписокРеквизитовПортретаКлиента, Элемент);
	КонецЕсли;	
	
КонецПроцедуры


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


//Получение наименований дополнительных реквизитов, преобразованных для последующего приведения к полю компоновки данных
&НаСервере
Функция ПолучитьСписокРеквизитов()
	
	УстановитьПривилегированныйРежим(Истина);
	НаборСвойствКлиенты = УправлениеСвойствами.НаборСвойствПоИмени("Справочник_Партнеры_Клиенты");
	
	Запрос = Новый Запрос;
	
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ДополнительныеРеквизиты.Свойство.Наименование КАК Наименование
	|ИЗ
	|	Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты
	|ГДЕ
	|	НЕ ДополнительныеРеквизиты.Свойство.ПометкаУдаления
	|	И ДополнительныеРеквизиты.Ссылка = &НаборСвойствКлиенты
	|"; 
	
	Запрос.Параметры.Вставить("НаборСвойствКлиенты", НаборСвойствКлиенты);
	Выборка = Запрос.Выполнить().Выбрать();
	
	Рез = Новый СписокЗначений;
	Пока Выборка.Следующий() Цикл
		Рез.Добавить("Партнер.[" + Выборка.Наименование + "]");	
	КонецЦикла;	
	Возврат Рез;
	
КонецФункции
Показать


Для оптимизации можно при открытии формы получить список доп.реквизитов, чтобы не делать это каждый раз перед изменением строки
5. Ivan_Stepnov 05.07.22 15:06 Сейчас в теме
Прошу прощения, подправил запрос в функции ПолучитьСписокРеквизитов() - не все наименования воспринимались как поля компоновки данных:
"ВЫБРАТЬ
	|	ДополнительныеРеквизиты.Свойство КАК Свойство,
	|	ПРЕДСТАВЛЕНИЕ(ДополнительныеРеквизиты.Свойство) КАК Наименование
	|ИЗ
	|	Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты
	|ГДЕ
	|	НЕ ДополнительныеРеквизиты.Свойство.ПометкаУдаления
	|	И ДополнительныеРеквизиты.Ссылка = &НаборСвойствКлиенты
	|";
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот