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