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