Как реализовать зависимые параметры в отчетах СКД при использовании БСП?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки отчетов на базе Системы компоновки данных (СКД) в типовых конфигурациях, использующих БСП (Библиотека стандартных подсистем), часто возникает задача: необходимо, чтобы выбор значения в одном параметре отчета влиял на состав доступных значений другого параметра. Например, пользователь выбирает документ, и во втором параметре должны отобразиться только уникальные позиции из табличной части этого конкретного документа. Разберем, как подойти к решению этой задачи, учитывая ограничения типовых механизмов.

Вариант 1: Использование связей параметров выбора (Стандартный подход)

Прежде чем прибегать к программному изменению форм, рассмотрим самый чистый метод, предлагаемый платформой 1С. Этот подход позволяет избежать написания кода и сохранения объектов на поддержке.

Для реализации этой логики необходимо выполнить следующие шаги:

  1. Откройте настройки параметров в СКД.
  2. Перейдите к параметру, который должен быть зависимым (второй параметр).
  3. В свойствах параметра найдите раздел Связи параметров выбора.
  4. Укажите условие отбора, где в качестве левого операнда выступает поле отбора второго параметра, а в качестве правого — текущий ПараметрДанных (первый параметр).

Этот метод работает эффективно, если в структуре данных есть прямая связь между полями. Платформа сама отфильтрует список выбора, как только значение первого параметра будет заполнено пользователем.

Вариант 2: Программное управление компоновкой через обработчик ПриКомпоновкеРезультата

Если логика выбора значений слишком сложна и требует выполнения запроса к базе данных для формирования списка допустимых значений, воспользуйтесь событием ПриКомпоновкеРезультата. Несмотря на то что отчет еще не сформирован, этот обработчик дает возможность вмешаться в процесс подготовки данных.

Рассмотрим, как можно программно воздействовать на параметры:


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

Данный подход позволяет вам полностью контролировать процесс вывода, однако помните, что это происходит уже в момент нажатия кнопки «Сформировать», поэтому визуально пользователь не увидит предфильтрации в полях ввода до запуска отчета.

Вариант 3: Создание собственной формы отчета (Радикальный подход)

Если требования бизнеса подразумевают «живой» отклик интерфейса (выбрал — значение обновилось — стало доступно для выбора), а типовые формы БСП этого не позволяют, единственным выходом остается создание собственной формы отчета.

Разберем основные шаги при таком решении:

  1. Отключите использование типовой формы отчета БСП в конфигураторе.
  2. Создайте свою управляемую форму.
  3. Разместите на ней нужные поля ввода для параметров.
  4. В обработчике события ПриИзменении поля ввода первого параметра реализуйте запрос к данным:
    
    Процедура Параметр1ПриИзменении(Элемент)
        // Выполняем запрос для получения списка значений
        СписокДляВторогоПараметра = ПолучитьСписокПоЗапросу(Элементы.Параметр1.Значение);
        // Обновляем список выбора второго элемента
        Элементы.Параметр2.СписокВыбора.ЗагрузитьЗначения(СписокДляВторогоПараметра);
    КонецПроцедуры
    
  5. При нажатии на кнопку «Сформировать» передайте значения полей формы в КомпоновщикНастроек отчета.

Этот метод дает максимальную гибкость, но усложняет процесс обновления типовой конфигурации в будущем, так как вы снимаете модуль формы отчета с поддержки БСП. Используйте его только в крайних случаях, когда иные методы не обеспечивают нужного функционала.

Важное примечание: при разработке старайтесь сначала использовать штатные механизмы СКД. Только если задача требует сложной выборки данных, которая физически не может быть выполнена через стандартные связи параметров, переходите к написанию программного кода в модуле формы или модуля объекта.

← На главную