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