Как настроить связи параметров выбора между параметрами и полями отбора в СКД?

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

При разработке отчетов на системе компоновки данных (СКД) часто возникает типовая задача: ограничить выбор элементов подчиненного справочника значением справочника-владельца. Классический пример — фильтрация справочника Подразделения по выбранной Организации. Однако при попытке связать параметр отчета и поле отбора разработчики регулярно сталкиваются с ситуацией, когда стандартная настройка параметров редактирования не срабатывает в форме изменения варианта отчета.

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

Причины некорректной работы связей параметров выбора в СКД

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

Однако в стандартных формах «Изменить вариант» и «Настройка компоновки данных» существует разрыв контекстов:

  1. Таблица отборов (Отбор) и дерево параметров (ПараметрыДанных) в стандартном окне редактирования настроек представляют собой изолированные структуры элементов управления. При открытии формы выбора из строки отбора значение из таблицы параметров не передается в параметры формы выбора.
  2. Механизм Связи параметров выбора надежно отрабатывает только в рамках единой области: либо когда один параметр данных зависит от другого параметра данных, либо когда одно поле пользовательских настроек зависит от другого поля пользовательских настроек.
  3. Если для подчиненного поля в отборе используется вид сравнения В списке или В группе из списка, стандартная форма выбора ожидает одиночное значение владельца, из-за чего связь параметров выбора также перестает функционировать.

Способ 1. Перенос фильтрации в параметры схемы компоновки данных

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

Разберем по шагам, как это настроить:

  1. Откроем схему компоновки данных и перейдем к тексту запроса набора данных.
  2. Добавим необязательное условие в фигурных скобках для подчиненного поля:
    
    ВЫБРАТЬ
        ПродажиОбороты.Организация КАК Организация,
        ПродажиОбороты.Подразделение КАК Подразделение,
        ПродажиОбороты.СуммаОборот КАК СуммаОборот
    ИЗ
        РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , {Организация = &Организация, Подразделение = &Подразделение}) КАК ПродажиОбороты
    
  3. Перейдем на вкладку Параметры схемы компоновки данных. Для параметра Подразделение снимем флажок Ограничение доступности.
  4. В строке параметра Подразделение откроем колонку Параметры редактирования и перейдем в пункт Связи параметров выбора.
  5. Добавим новую связь со следующими настройками:
    Имя параметра выбора: Отбор.Владелец
    Поле: Организация
    Режим изменения связанного значения: Очищать
  6. На вкладке Настройки добавим оба параметра (Организация и Подразделение) в пользовательские настройки отчета.

При такой схеме оба поля находятся в одном контексте параметров, и платформа корректно передает выбранную организацию в форму выбора подразделения.

Способ 2. Использование событий подсистемы «Варианты отчетов» (БСП)

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

Посмотрим на пример реализации в модуле объекта отчета:


Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    Настройки.События.ПриОпределенииПараметровВыбора = Истина;
КонецПроцедуры

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

Данный подход позволяет прозрачно перехватывать открытие формы выбора для любого поля отчета и подставлять фильтр по владельцу динамически.

Способ 3. Программное переопределение выбора в форме отчета

Если отчет имеет собственную форму, мы можем явно переопределить обработчик начала выбора для элемента управления отбором.

Рассмотрим пример кода в модуле управляемой формы отчета:


&НаКлиенте
Процедура ПользовательскиеНастройкиОтборПодразделениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // Получаем текущее значение организации из настроек
    ЗначениеОрганизации = ПолучитьЗначениеПараметраНаСервере("Организация");
    
    ПараметрыФормы = Новый Структура;
    Если ЗначениеЗаполнено(ЗначениеОрганизации) Тогда
        ПараметрыФормы.Вставить("Отбор", Новый Структура("Владелец", ЗначениеОрганизации));
    КонецЕсли;
    
    ОткрытьФорму("Справочник.Подразделения.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры

&НаСервере
Функция ПолучитьЗначениеПараметраНаСервере(ИмяПараметра)
    ЭлементПараметра = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
    Если ЭлементПараметра <> Неопределено И ЭлементПараметра.Использование Тогда
        Возврат ЭлементПараметра.Значение;
    КонецЕсли;
    Возврат Неопределено;
КонецФункции

Этот метод гарантирует точное срабатывание отбора по владельцу в любых сценариях работы пользователя с интерфейсом отчета.

← На главную