Как отфильтровать список выбора 'Дополнительные значения' по свойству или владельцу в быстрых отборах отчета на СКД?

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

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

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

Решение 1: Использование Параметров выбора для поля отбора

Одним из наиболее эффективных и гибких способов является настройка Параметров выбора для поля отбора в схеме СКД. Этот механизм позволяет нам динамически фильтровать список значений, который открывается для пользователя. Рассмотрим подробнее, как это реализовать.

  1. Определяем поле отбора в СКД. Прежде всего, нам нужно найти в структуре отчета то поле, которое соответствует нашему быстрому отбору и при выборе которого открывается список «Дополнительных значений». Обычно это поле, представляющее ссылку на справочник.
  2. Настраиваем Параметры выбора. Перейдем в настройки этого поля в схеме компоновки данных. В свойствах поля, как правило, в разделе «Дополнительные свойства» или через контекстное меню, можно найти опцию для настройки Параметров выбора.
  3. Добавляем условие отбора. В открывшемся окне Параметров выбора мы можем задать условия для фильтрации списка. В нашем случае, если мы хотим отбирать по владельцу, мы должны указать условие вида Отбор.Владелец = &ПараметрВладелец.

    Здесь:

    • Отбор.Владелец – это стандартный механизм отбора для справочника, который имеет владельца (подчиненный справочник). Если нам нужно отбирать по другому реквизиту, например, по реквизиту «Свойство», мы бы указали Отбор.Свойство = &ПараметрСвойство.
    • &ПараметрВладелец – это ссылка на другой параметр отчета. Этот параметр будет содержать значение владельца, по которому нужно выполнить отбор. Мы можем создать этот параметр в СКД и сделать его доступным для пользователя в шапке отчета или заполнять его программно.
  4. Обеспечиваем значение для параметра отбора.
    • Через другой отбор/параметр отчета: Самый распространенный сценарий – это когда пользователь сначала выбирает владельца в другом поле отчета, а затем выбирает дополнительные значения. В этом случае, параметр &ПараметрВладелец будет автоматически заполняться значением из выбранного владельца.
    • Программно: Если нам требуется более сложная логика, мы можем заполнять этот параметр программно, например, в обработчике события ПриКомпоновкеРезультата или НаСервере формы отчета.

Пример настройки в СКД:

Предположим, у нас есть поле отбора "ДополнительноеЗначение" с типом "СправочникСсылка.ДополнительныеЗначения". В свойствах этого поля мы открываем "Параметры выбора" и добавляем новый элемент.

Поле: Отбор.Владелец

Вид сравнения: Равно

Значение: &ВладелецОтбора

При этом, параметр ВладелецОтбора должен быть создан в закладке "Параметры" СКД, и его тип должен соответствовать типу "Владельца" справочника "Дополнительные значения".

Решение 2: Применение Связей параметров выбора

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

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

Важный момент: Если в сообщении 10 говорится, что "толку никакого, не влияет", это может означать, что параметр Отбор.Владелец был введен неверно или связь не была настроена корректно. Важно, чтобы имя поля отбора (например, Отбор.Владелец) было введено точно, без ошибок, и чтобы оно соответствовало реквизиту подчиненного справочника.

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

Предположим, у нас есть параметр отчета Владелец (тип "СправочникСсылка.Номенклатура") и параметр ДополнительноеЗначение (тип "СправочникСсылка.ДополнительныеЗначения").

1. Для параметра ДополнительноеЗначение в "Параметрах выбора" указываем:

Поле: Отбор.Владелец

Вид сравнения: Равно

Значение: &ВладелецОтбора

2. Теперь, для этого же параметра ДополнительноеЗначение, переходим к "Связям параметров выбора".

Параметр выбора: ВладелецОтбора

Связь по значению: Владелец (Здесь "Владелец" - это имя нашего параметра отчета, который пользователь выбирает первым).

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

Необязательные условия с фигурными скобками

В контексте работы с параметрами отбора в СКД, особенно когда мы хотим, чтобы отчет мог формироваться как с отбором, так и без него, крайне полезно использовать фигурными скобками {} в условиях набора данных СКД. Это позволяет сделать условие необязательным.

Рассмотрим пример:


ВЫБРАТЬ
    МойСправочник.Ссылка,
    МойСправочник.Наименование
ИЗ
    Справочник.МойСправочник КАК МойСправочник
ГДЕ
    {МойСправочник.Владелец = &ПараметрВладелец}

Что это означает?

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

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

Программное управление отбором

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

  1. Обработка получения данных на сервере. В обработчике ОбработкаПолученияДанныхНаСервере формы отчета мы можем получить доступ к текущим настройкам компоновщика макета и программно добавить или изменить параметры выбора для нужных полей.
  2. ПриКомпоновкеРезультата. Более тонкая настройка возможна в обработчике ПриКомпоновкеРезультата основного объекта отчета. Здесь мы имеем доступ к объекту КомпоновщикНастроек и можем вносить изменения непосредственно в настройки СКД перед компоновкой результата. Например, мы можем программно установить значение параметра отбора или добавить новое условие в структуру отбора.

Пример программного добавления отбора в Параметры выбора для элемента формы:


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

В этом примере мы проверяем, заполнен ли реквизит Владелец в объекте отчета, и если да, то программно добавляем отбор по этому владельцу для поля отбора "ПолеОтбораДополнительноеЗначение". Это позволяет нам динамически управлять фильтрацией списка выбора в зависимости от логики нашего отчета.

Различие между отбором отчета и отбором списка выбора

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

Корректное использование этих механизмов позволяет значительно улучшить юзабилити отчетов, делая работу с ними более интуитивно понятной и эффективной для конечного пользователя.

Заключение

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

← На главную