Изменить форму подбора для отбора динамического списка

1. Isa816 64 20.09.23 16:57 Сейчас в теме
Добрый день! Пытаюсь решить не тривиальную задачку, нужно перехватить событие "начало выбора" для отбора динамического списка, но так как эти элементы создаются платформой не получается на него повесить событие, а подключать обработчик в цикле не хочется, может есть у кого более элегантное решение?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
20. Dr.HiHi 3 21.09.23 20:15 Сейчас в теме +1 $m
(12) пробуем дальше))
в любом отчете, где общая форма отчета есть обработчики, которые после настроек выводят на форму реквизиты быстрого отбора... там можно посмотреть как создаются реквизиты и прикрепить к ним обработчики

что касается настроек динамических списков (справочников, документов, обработок), то в конфигураторе можно прикрепить свою форму и повесить там обработчики, какие угодно

сталкивался с задачей, чтобы в любом динамическом списке, в отборах, если вид сравения связан со списком, то открывалась общая форма "ВводЗначенийСпискомСФлажками", на которой есть кнопка по заполнению значения из буфера или из файла

за код прошу не судить... писался методом тыка))))
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	КомпоновщикНастроекУстановитьДействияНаСервере();
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент)
	СтандартнаяОбработка = Ложь;

	Обработчик = Новый ОписаниеОповещения("ПоказатьСписокВыбораЗавершен", ЭтотОбъект, Строка);

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

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

&НаКлиенте
Функция ЭтоВидСравненияСписка(ВидСравнения) 
	Возврат ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке
                      Или ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке
                      Или ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии
                      Или ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии;
КонецФункции
Показать
Прикрепленные файлы:
Isa816; aka Любитель XML; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. aka Любитель XML 20.09.23 17:11 Сейчас в теме
(1) покажи скрин, что и где ты хочешь перехватить. Если это то, о чем я подумал - то не вариант, вариант только сделать свою форму для отбора
3. Isa816 64 20.09.23 17:19 Сейчас в теме
(2) Стандартные отборы в динамическом списке
4. aka Любитель XML 20.09.23 17:24 Сейчас в теме
(3) если через настроить список - то никак, но ты можешь свой отбор на форму добавить и там делать с полем что тебе нужно.
Дмитрий74Чел; +1 Ответить
5. coollerinc 189 20.09.23 18:20 Сейчас в теме
непонятно, что ты хочешь. Есть событие начало выбора. В нем открывай форму. В параметрах формы можно передать нужный отбор. Чем этот вариант не подходит?
7. Isa816 64 20.09.23 19:49 Сейчас в теме
(5)
ы хочешь. Есть событие начало выбора. В нем от

Так не работает, этого поля же нет на форме. Как в него добавить событие начало выбора?
6. Isa816 64 20.09.23 19:48 Сейчас в теме
(4) Дело в том что отборов у меня может быть 20 и для каждого добавлять поле не хочется.
8. Dr.HiHi 3 20.09.23 21:55 Сейчас в теме
попробую интуитивно догадаться о чем идет речь

если не ошибаюсь, то добавленному элементы можно помесить обработчик Элемент.УстановитьДействие("НачалоВыбора", "ЭлементНачалоВыбора") или Элемент.УстановитьДействие("НачалоВыбора", Новый Действие("ЭлементНачалоВыбора"))
не помню как правильно, но что-то из них отработать должно

так же есть в модуле менеджера, например, справочника обработчик событий "ОбработкаПолученияФормы", которая будет вызиваться каждый раз, при нажатии на выборку элемента

p.s. так же нужно продумать ручной ввод и возможно смотреть в сторону СвязиПараметровВыбора и ПараметрыВыбора
10. Isa816 64 21.09.23 13:55 Сейчас в теме
(8) вот это уже интересней, попробую и отпишусь.
11. Isa816 64 21.09.23 16:04 Сейчас в теме
(8) Нет, всё же это не то.
У меня на форме списка есть отборы.
Или через меню еще-настройка списка - там добавить отбор
Так вот этих отборов может быть сколько угодно, а мне нужно перехватить события открытия правого значения этого отбора
12. Isa816 64 21.09.23 16:10 Сейчас в теме
(8) вот эту кнопку
Прикрепленные файлы:
20. Dr.HiHi 3 21.09.23 20:15 Сейчас в теме +1 $m
(12) пробуем дальше))
в любом отчете, где общая форма отчета есть обработчики, которые после настроек выводят на форму реквизиты быстрого отбора... там можно посмотреть как создаются реквизиты и прикрепить к ним обработчики

что касается настроек динамических списков (справочников, документов, обработок), то в конфигураторе можно прикрепить свою форму и повесить там обработчики, какие угодно

сталкивался с задачей, чтобы в любом динамическом списке, в отборах, если вид сравения связан со списком, то открывалась общая форма "ВводЗначенийСпискомСФлажками", на которой есть кнопка по заполнению значения из буфера или из файла

за код прошу не судить... писался методом тыка))))
&НаКлиенте
Процедура ПриОткрытии(Отказ)
	КомпоновщикНастроекУстановитьДействияНаСервере();
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент)
	СтандартнаяОбработка = Ложь;

	Обработчик = Новый ОписаниеОповещения("ПоказатьСписокВыбораЗавершен", ЭтотОбъект, Строка);

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

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

&НаКлиенте
Функция ЭтоВидСравненияСписка(ВидСравнения) 
	Возврат ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке
                      Или ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке
                      Или ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии
                      Или ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии;
КонецФункции
Показать
Прикрепленные файлы:
Isa816; aka Любитель XML; +2 Ответить
22. Isa816 64 21.09.23 20:32 Сейчас в теме
(20) кажется то что надо, пошел тестить!
24. Isa816 64 22.09.23 04:11 Сейчас в теме
(19) Все получилось, спасибо!
9. aka Любитель XML 20.09.23 22:00 Сейчас в теме
(8) (5) Еще - настроить список - там закладка отбор, так вот он хочет в том поле компоновки отбора поймать началоВыбора, если я правильно понял автора, эхЮ надо было ему в самом начале все-таки прислать скрин
13. aka Любитель XML 21.09.23 16:46 Сейчас в теме
(12) отладчиком вставай на конце процедуры ПриОткрытии, если поле на форме существует, то до него можно дотянуться через Элементы (там дальше только останется найти нужное тебе поле), и потом уже как в (8) тебе написали, через установить действие.

Просил еще в первом сообщении скрин, я думал ты хочешь в еще-настроить список поймать событие. Пробуй в общем
14. Isa816 64 21.09.23 16:48 Сейчас в теме
(12) Элементы есть, но всё равно не то. Я хочу вот сюда повесить событие https://disk.yandex.ru/i/CN-R15BEIx8Bxg походу всё таки не реально
15. aka Любитель XML 21.09.23 16:48 Сейчас в теме
(14) не реально, выноси на форму отборы, и далее через Элементы делай с ней что хочешь
21. Dr.HiHi 3 21.09.23 20:18 Сейчас в теме
(15) реально... чуть выше написал
aka Любитель XML; +1 Ответить
16. Isa816 64 21.09.23 16:50 Сейчас в теме
(15) надо походу реализовать свою форму с отборами и так уже настраивать. А на форме всё равно проблема их отловить, по тому что они добавляются в виде Отбор001
17. aka Любитель XML 21.09.23 16:50 Сейчас в теме
(14) я делал так - выносил компоновку на форму, там заполнял отборы, и вот там уже есть вариант поймать какой отбор куда установлен, но опять же изменить начало выбора не вариант, но мне только чтение нужно было
18. aka Любитель XML 21.09.23 16:51 Сейчас в теме
(16) тип значения отбора вроде можно получить
19. aka Любитель XML 21.09.23 16:51 Сейчас в теме
+(18) ну то есть не к имени вязаться, а к типу левого значения
23. starik-2005 3043 21.09.23 21:50 Сейчас в теме
Обычно в такой формулировке вопроса автор не поясняет за то, на кой хрен ему перезватывать этот отбор. Предположу, что он хочет как-то фильтрануть что-то, ну или еще какую-то муть ненужную сделать, которая делается иначе. Но он вбил себе в голову, что при начале выбора он проверит, что это вот то самое и фильтранет, вместо того, чтобы параметры выбора настроить или еще что в этом духе.
Оставьте свое сообщение

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