Добрый день! Пытаюсь решить не тривиальную задачку, нужно перехватить событие "начало выбора" для отбора динамического списка, но так как эти элементы создаются платформой не получается на него повесить событие, а подключать обработчик в цикле не хочется, может есть у кого более элегантное решение?
(12) пробуем дальше))
в любом отчете, где общая форма отчета есть обработчики, которые после настроек выводят на форму реквизиты быстрого отбора... там можно посмотреть как создаются реквизиты и прикрепить к ним обработчики
что касается настроек динамических списков (справочников, документов, обработок), то в конфигураторе можно прикрепить свою форму и повесить там обработчики, какие угодно
сталкивался с задачей, чтобы в любом динамическом списке, в отборах, если вид сравения связан со списком, то открывалась общая форма "ВводЗначенийСпискомСФлажками", на которой есть кнопка по заполнению значения из буфера или из файла
за код прошу не судить... писался методом тыка))))
&НаКлиенте
Процедура ПриОткрытии(Отказ)
КомпоновщикНастроекУстановитьДействияНаСервере();
КонецПроцедуры
&НаСервере
Процедура КомпоновщикНастроекУстановитьДействияНаСервере()
Для Каждого Элемент Из Элементы Цикл
Если Прав(Элемент.Имя, 5) = "Отбор" Тогда
ИмяЭлементаОтбор = Элемент.Имя;
Прервать;
КонецЕсли;
КонецЦикла;
Если ПустаяСтрока(ИмяЭлементаОтбор) Тогда
Возврат;
КонецЕсли;
Элемент = Элементы.Найти(ИмяЭлементаОтбор + "ПравоеЗначение");
Если Элемент = Неопределено Тогда
Возврат;
КонецЕсли;
Элемент.УстановитьДействие("НачалоВыбора", "ОтборНачалоВыбора");
КонецПроцедуры
&НаКлиенте
Процедура ОтборНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Строка = КомпоновщикНастроек.ПользовательскиеНастройки
.Элементы.Найти(КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки)
.ПолучитьОбъектПоИдентификатору(Элементы[ИмяЭлементаОтбор].ТекущаяСтрока);
Если Строка <> Неопределено
И ЭтоВидСравненияСписка(Строка.ВидСравнения) Тогда
ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент)
СтандартнаяОбработка = Ложь;
Обработчик = Новый ОписаниеОповещения("ПоказатьСписокВыбораЗавершен", ЭтотОбъект, Строка);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ДобавлятьНеоднозначные", Истина);
ПараметрыОткрытия.Вставить("Отмеченные", ОтчетыКлиентСервер.ЗначенияСписком(Строка.ПравоеЗначение));
ПараметрыОткрытия.Вставить("ОписаниеТипов", Строка.ПравоеЗначение.ТипЗначения);
ПараметрыОткрытия.Вставить("ЗначенияДляВыбораЗаполнены", Истина);
ПараметрыОткрытия.Вставить("ОграничиватьВыборУказаннымиЗначениями", Строка.ПравоеЗначение.ДоступныеЗначения <> Неопределено);
ПараметрыОткрытия.Вставить("Представление", Строка.Представление);
ОткрытьФорму("ОбщаяФорма.ВводЗначенийСпискомСФлажками", ПараметрыОткрытия, ЭтотОбъект,,,, Обработчик);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСписокВыбораЗавершен(Список, Строка) Экспорт
Если ТипЗнч(Список) = Тип("Массив") Тогда
ВыбранныеЗначения = Список;
Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(ВыбранныеЗначения);
Список.ЗаполнитьПометки(Истина);
ИначеЕсли ТипЗнч(Список) <> Тип("СписокЗначений") Тогда
Возврат;
КонецЕсли;
ВыбранныеЗначения = Новый СписокЗначений;
Для Каждого ЭлементСписка Из Список Цикл
Если ЭлементСписка.Пометка Тогда
ЗаполнитьЗначенияСвойств(ВыбранныеЗначения.Добавить(), ЭлементСписка);
КонецЕсли;
КонецЦикла;
Строка.ПравоеЗначение = ВыбранныеЗначения;
Строка.Использование = Истина;
КонецПроцедуры
&НаКлиенте
Функция ЭтоВидСравненияСписка(ВидСравнения)
Возврат ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке
Или ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке
Или ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии
Или ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии;
КонецФункции
непонятно, что ты хочешь. Есть событие начало выбора. В нем открывай форму. В параметрах формы можно передать нужный отбор. Чем этот вариант не подходит?
если не ошибаюсь, то добавленному элементы можно помесить обработчик Элемент.УстановитьДействие("НачалоВыбора", "ЭлементНачалоВыбора") или Элемент.УстановитьДействие("НачалоВыбора", Новый Действие("ЭлементНачалоВыбора"))
не помню как правильно, но что-то из них отработать должно
так же есть в модуле менеджера, например, справочника обработчик событий "ОбработкаПолученияФормы", которая будет вызиваться каждый раз, при нажатии на выборку элемента
p.s. так же нужно продумать ручной ввод и возможно смотреть в сторону СвязиПараметровВыбора и ПараметрыВыбора
(8) Нет, всё же это не то.
У меня на форме списка есть отборы.
Или через меню еще-настройка списка - там добавить отбор
Так вот этих отборов может быть сколько угодно, а мне нужно перехватить события открытия правого значения этого отбора
(12) пробуем дальше))
в любом отчете, где общая форма отчета есть обработчики, которые после настроек выводят на форму реквизиты быстрого отбора... там можно посмотреть как создаются реквизиты и прикрепить к ним обработчики
что касается настроек динамических списков (справочников, документов, обработок), то в конфигураторе можно прикрепить свою форму и повесить там обработчики, какие угодно
сталкивался с задачей, чтобы в любом динамическом списке, в отборах, если вид сравения связан со списком, то открывалась общая форма "ВводЗначенийСпискомСФлажками", на которой есть кнопка по заполнению значения из буфера или из файла
за код прошу не судить... писался методом тыка))))
&НаКлиенте
Процедура ПриОткрытии(Отказ)
КомпоновщикНастроекУстановитьДействияНаСервере();
КонецПроцедуры
&НаСервере
Процедура КомпоновщикНастроекУстановитьДействияНаСервере()
Для Каждого Элемент Из Элементы Цикл
Если Прав(Элемент.Имя, 5) = "Отбор" Тогда
ИмяЭлементаОтбор = Элемент.Имя;
Прервать;
КонецЕсли;
КонецЦикла;
Если ПустаяСтрока(ИмяЭлементаОтбор) Тогда
Возврат;
КонецЕсли;
Элемент = Элементы.Найти(ИмяЭлементаОтбор + "ПравоеЗначение");
Если Элемент = Неопределено Тогда
Возврат;
КонецЕсли;
Элемент.УстановитьДействие("НачалоВыбора", "ОтборНачалоВыбора");
КонецПроцедуры
&НаКлиенте
Процедура ОтборНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Строка = КомпоновщикНастроек.ПользовательскиеНастройки
.Элементы.Найти(КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки)
.ПолучитьОбъектПоИдентификатору(Элементы[ИмяЭлементаОтбор].ТекущаяСтрока);
Если Строка <> Неопределено
И ЭтоВидСравненияСписка(Строка.ВидСравнения) Тогда
ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСписокВыбора(Строка, СтандартнаяОбработка, Элемент)
СтандартнаяОбработка = Ложь;
Обработчик = Новый ОписаниеОповещения("ПоказатьСписокВыбораЗавершен", ЭтотОбъект, Строка);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ДобавлятьНеоднозначные", Истина);
ПараметрыОткрытия.Вставить("Отмеченные", ОтчетыКлиентСервер.ЗначенияСписком(Строка.ПравоеЗначение));
ПараметрыОткрытия.Вставить("ОписаниеТипов", Строка.ПравоеЗначение.ТипЗначения);
ПараметрыОткрытия.Вставить("ЗначенияДляВыбораЗаполнены", Истина);
ПараметрыОткрытия.Вставить("ОграничиватьВыборУказаннымиЗначениями", Строка.ПравоеЗначение.ДоступныеЗначения <> Неопределено);
ПараметрыОткрытия.Вставить("Представление", Строка.Представление);
ОткрытьФорму("ОбщаяФорма.ВводЗначенийСпискомСФлажками", ПараметрыОткрытия, ЭтотОбъект,,,, Обработчик);
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьСписокВыбораЗавершен(Список, Строка) Экспорт
Если ТипЗнч(Список) = Тип("Массив") Тогда
ВыбранныеЗначения = Список;
Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(ВыбранныеЗначения);
Список.ЗаполнитьПометки(Истина);
ИначеЕсли ТипЗнч(Список) <> Тип("СписокЗначений") Тогда
Возврат;
КонецЕсли;
ВыбранныеЗначения = Новый СписокЗначений;
Для Каждого ЭлементСписка Из Список Цикл
Если ЭлементСписка.Пометка Тогда
ЗаполнитьЗначенияСвойств(ВыбранныеЗначения.Добавить(), ЭлементСписка);
КонецЕсли;
КонецЦикла;
Строка.ПравоеЗначение = ВыбранныеЗначения;
Строка.Использование = Истина;
КонецПроцедуры
&НаКлиенте
Функция ЭтоВидСравненияСписка(ВидСравнения)
Возврат ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке
Или ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке
Или ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии
Или ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии;
КонецФункции
(8) (5) Еще - настроить список - там закладка отбор, так вот он хочет в том поле компоновки отбора поймать началоВыбора, если я правильно понял автора, эхЮ надо было ему в самом начале все-таки прислать скрин
(12) отладчиком вставай на конце процедуры ПриОткрытии, если поле на форме существует, то до него можно дотянуться через Элементы (там дальше только останется найти нужное тебе поле), и потом уже как в (8) тебе написали, через установить действие.
Просил еще в первом сообщении скрин, я думал ты хочешь в еще-настроить список поймать событие. Пробуй в общем
(15) надо походу реализовать свою форму с отборами и так уже настраивать. А на форме всё равно проблема их отловить, по тому что они добавляются в виде Отбор001
(14) я делал так - выносил компоновку на форму, там заполнял отборы, и вот там уже есть вариант поймать какой отбор куда установлен, но опять же изменить начало выбора не вариант, но мне только чтение нужно было
Обычно в такой формулировке вопроса автор не поясняет за то, на кой хрен ему перезватывать этот отбор. Предположу, что он хочет как-то фильтрануть что-то, ну или еще какую-то муть ненужную сделать, которая делается иначе. Но он вбил себе в голову, что при начале выбора он проверит, что это вот то самое и фильтранет, вместо того, чтобы параметры выбора настроить или еще что в этом духе.