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