Иногда возникают такие ситуации, когда необходимо обработать события при редактировании списка значений. Кроме того для некоторых подбираемых элеметов не задается владелец, например для характеристик, и они вываливаются всем списком, что не очень удобно. Но поскольку стандартный диалог реализован на уровне платформы, программист не может внести в него никаких изменений. Для таких случаев я и сделал аналог стандартного диалога - он полностью повторяет его функционал, но позволяет при необходимости обрабатывать различные проблемные ситуации.
ОТЛИЧИЯ ОТ СТАНДАРТНОГО ДИАЛОГА
- есть возможность задать свойство ВыборПоВладельцу для ограничения списка элементов, предлагаемых для выбора и подбора (например, может применяться при использовании характеристик в отборах: в стандартном диалоге открывается полный список без установки владельца);
- можно назначать свои обработчики ПриИзменении, НачалоВыбора, Очистка, ОбработкаВыбора, АвтоПодборТекста, ОкончаниеВводаТекста для значений списка (позволяет обработать процесс наполнения списка нужным образом);
ПАРАМЕТРЫ ФОРМЫ
Список - тип "СписокЗначений", в параметр передается список значений, который необходимо редактировать (например, правое значение отбора с сответствующим видом сравнения), наполнение списка зависит от его свойства ТипЗначения;
ВыборПоВладельцу - тип "ЛюбаяСсылка", необязательный параметр, в который может передаваться элемент-владелец, по которому будут выбираться значения (например, элемент плана видов характеристик, для ограничения списка свойств предлагаемых для выбора и подбора);
ОбработчикиСобытий - тип "Структура", необязательный параметр, в который может передаваться структура вида (<Событие>, <Обработчик>) с описанием обработчиков событий для значений списка;
ОБРАБОТКА РЕЗУЛЬТАТА
Для получения отредактированного списка, необходимо задать владельцем формы поле ввода, значением которого является искомый список.
ПРИМЕР ИСПОЛЬЗОВАНИЯ
Необходимо в отборе отчета, построенного на СКД, ограничить перечень предлагаемых для выбора элементов справочника "Контрагенты" (только юрлица) и их свойств при редактировании списка.
Код в форме настройки отчета:
Процедура ОтборПравоеЗначениеНачалоВыбора(Элемент, СтандартнаяОбработка)
ТекущийВидСравнения = ЭлементыФормы.Отбор.ТекущиеДанные.ВидСравнения;
Если (ТекущийВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке)
ИЛИ (ТекущийВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке)
ИЛИ (ТекущийВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии)
ИЛИ (ТекущийВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии) Тогда
СтандартнаяОбработка = Ложь;
ПредставлениеОтбора = Строка(ЭлементыФормы.Отбор.ТекущиеДанные.ЛевоеЗначение);
ЛевоеЗначениеОтбора = ЭлементыФормы.Отбор.ТекущиеДанные.ЛевоеЗначение;
ПравоеЗначениеОтбора = ЭлементыФормы.Отбор.ТекущиеДанные.ПравоеЗначение;
ПолеКомпоновкиКонтрагент = Новый ПолеКомпоновкиДанных("Контрагент");
ФормаРедактированияСписка = ПолучитьОбщуюФорму("ФормаРедактированияСписка", Элемент);
ФормаРедактированияСписка.Список = ПравоеЗначениеОтбора.Скопировать();
Если ЛевоеЗначениеОтбора = ПолеКомпоновкиКонтрагент Тогда
ОбработчикиСобытий = Новый Структура;
ОбработчикиСобытий.Вставить("НачалоВыбора", "ЮрлицоВыбор(Элемент, СтандартнаяОбработка)");
ОбработчикиСобытий.Вставить("АвтоПодборТекста", "ЮрлицоАвтоПодборТекста(Элемент, Текст, ТекстАвтоПодбора, СтандартнаяОбработка)");
ОбработчикиСобытий.Вставить("ОкончаниеВводаТекста", "ЮрлицоОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)");
ФормаРедактированияСписка.ОбработчикиСобытий = ОбработчикиСобытий;
ИначеЕсли Найти(ПредставлениеОтбора, "(свойство)") > 0 Тогда
СоответствиеСвойств = УстановитьСоответствиеСвойств(ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Справочник_Контрагенты, "Контрагент.[", " (свойство)]");
ФормаРедактированияСписка.ВыборПоВладельцу = СоответствиеСвойств.Получить(ПредставлениеОтбора);
КонецЕсли;
ФормаРедактированияСписка.ОткрытьМодально();
КонецЕсли;
КонецПроцедуры
Форма редактирования списка значений добавлена в общие формы. Функция УстановитьСоответствиеСвойств возвращает соответствие вида (<Наименование поля компоновки данных>, <Элемент плана видов характеристик "СвойстваОбъектов">), процедуры ЮрлицоВыбор, ЮрлицоАвтоПодборТекста, ЮрлицоОкончаниеВводаТекста описывают поведение формы выбора таким образом, чтобы в предлагаемый список попадали только юрлица. Процедуры определены как экспортные и размещены в общем модуле.