В процессе разработки отчетов на базе Системы компоновки данных (СКД) в типовых конфигурациях, использующих БСП (Библиотека стандартных подсистем), часто возникает задача: необходимо, чтобы выбор значения в одном параметре отчета влиял на состав доступных значений другого параметра. Например, пользователь выбирает документ, и во втором параметре должны отобразиться только уникальные позиции из табличной части этого конкретного документа. Разберем, как подойти к решению этой задачи, учитывая ограничения типовых механизмов.
Прежде чем прибегать к программному изменению форм, рассмотрим самый чистый метод, предлагаемый платформой 1С. Этот подход позволяет избежать написания кода и сохранения объектов на поддержке.
Для реализации этой логики необходимо выполнить следующие шаги:
СКД.ПараметрДанных (первый параметр).Этот метод работает эффективно, если в структуре данных есть прямая связь между полями. Платформа сама отфильтрует список выбора, как только значение первого параметра будет заполнено пользователем.
Если логика выбора значений слишком сложна и требует выполнения запроса к базе данных для формирования списка допустимых значений, воспользуйтесь событием ПриКомпоновкеРезультата. Несмотря на то что отчет еще не сформирован, этот обработчик дает возможность вмешаться в процесс подготовки данных.
Рассмотрим, как можно программно воздействовать на параметры:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем текущие настройки компоновщика
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Выполняем запрос для получения данных на основании первого параметра
ЗначениеПараметра1 = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Параметр1"));
Если ЗначениеПараметра1 <> Неопределено Тогда
// Здесь выполняется логика получения данных запросом...
// И установка их в параметры или набор данных
КонецЕсли;
// Выполняем компоновку вручную
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Данный подход позволяет вам полностью контролировать процесс вывода, однако помните, что это происходит уже в момент нажатия кнопки «Сформировать», поэтому визуально пользователь не увидит предфильтрации в полях ввода до запуска отчета.
Если требования бизнеса подразумевают «живой» отклик интерфейса (выбрал — значение обновилось — стало доступно для выбора), а типовые формы БСП этого не позволяют, единственным выходом остается создание собственной формы отчета.
Разберем основные шаги при таком решении:
БСП в конфигураторе.ПриИзменении поля ввода первого параметра реализуйте запрос к данным:
Процедура Параметр1ПриИзменении(Элемент)
// Выполняем запрос для получения списка значений
СписокДляВторогоПараметра = ПолучитьСписокПоЗапросу(Элементы.Параметр1.Значение);
// Обновляем список выбора второго элемента
Элементы.Параметр2.СписокВыбора.ЗагрузитьЗначения(СписокДляВторогоПараметра);
КонецПроцедуры
КомпоновщикНастроек отчета.Этот метод дает максимальную гибкость, но усложняет процесс обновления типовой конфигурации в будущем, так как вы снимаете модуль формы отчета с поддержки БСП. Используйте его только в крайних случаях, когда иные методы не обеспечивают нужного функционала.
Важное примечание: при разработке старайтесь сначала использовать штатные механизмы СКД. Только если задача требует сложной выборки данных, которая физически не может быть выполнена через стандартные связи параметров, переходите к написанию программного кода в модуле формы или модуля объекта.