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

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

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

Базовая настройка отбора в СКД

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

Выясним пошагово, как добавить такой отбор:

  1. Откроем схему компоновки данных и перейдем на закладку Настройки.
  2. В нижней части окна выберем вкладку Отбор.
  3. Добавим новый элемент отбора. При нажатии на кнопку выбора поля система предложит дерево доступных полей.
  4. Разберем структуру этого дерева: если поле является ссылочным, рядом с ним будет стоять символ «плюс». Нажав на него, мы можем «развернуть» объект и увидеть все его реквизиты.
  5. Выберем нужный реквизит (например, Номенклатура.ВидНоменклатуры). Теперь пользователь сможет устанавливать вид сравнения (Равно, В списке и т.д.) и выбирать конкретное значение.

Важно помнить, что в отличие от старого «Построителя отчета», в СКД этот механизм работает более гибко, позволяя обращаться к реквизитам реквизитов практически без ограничений в интерфейсе.

Автозаполнение и доступность полей

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

В конструкторе СКД на закладке Наборы данных обратим внимание на флаг Автозаполнение. Если этот флаг установлен, СКД автоматически проанализирует запрос и добавит все доступные реквизиты ссылок в список полей компоновки. Если же вы формируете список полей вручную, вам придется самостоятельно добавить нужные пути в список полей набора данных, чтобы они стали доступны для отбора.

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

Глубина вложенности и производительность

Хотя технически СКД позволяет обращаться к реквизитам «через точку» на очень большую глубину, проанализируем влияние такого подхода на производительность. Рассмотрим, что происходит «под капотом» системы:

Когда вы добавляете отбор вида ДокументПродажи.Контрагент.ОсновнойМенеджер.ФизЛицо, система при генерации итогового SQL-запроса вынуждена выполнить последовательное соединение (LEFT JOIN) со всеми таблицами этих объектов. Чем больше таких «точек», тем сложнее становится запрос для СУБД.

Рекомендуем придерживаться следующих правил:

Оптимизация отборов в виртуальных таблицах

Рассмотрим важную техническую особенность работы с виртуальными таблицами (Остатки, Обороты). Если мы наложим отбор на реквизит ссылки в общих настройках СКД, система применит это условие к уже полученному результату запроса. Это крайне неэффективно, так как сервер сначала получит все записи, а потом отсечет лишние.

Чтобы ускорить работу, воспользуемся механизмом параметров виртуальных таблиц:

  1. В тексте запроса для виртуальной таблицы укажите параметры, например, &УсловиеКонтрагента.
  2. Либо используйте возможности СКД по автоматической подстановке условий. Если вы укажете в параметрах виртуальной таблицы конструкцию {(&Условие)}, СКД сама постарается «прокинуть» пользовательский отбор внутрь запроса к виртуальной таблице.

Такой подход значительно сокращает объем данных, передаваемых между сервером СУБД и сервером 1С.

Программная установка отбора

Иногда требуется установить отбор по реквизиту ссылки не интерактивно, а с помощью встроенного языка. Разберем пример кода, который решает эту задачу. Предположим, нам нужно программно установить отбор по полю Статус у реквизита Заказ.


// Получаем настройки по умолчанию или текущие настройки компоновщика
Настройки = КомпоновщикНастроек.Настройки;

// Создаем новый элемент отбора
НовыйОтбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

// Указываем путь к полю через точку
НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Заказ.Статус");

// Настраиваем вид сравнения и значение
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйОтбор.ПравоеЗначение = Справочники.СтатусыЗаказов.Активен;

// Включаем отбор
НовыйОтбор.Использование = Истина;

Обратите внимание: при указании ПолеКомпоновкиДанных строка должна в точности соответствовать пути к данным, определенному в схеме.

Функционал «Быстрый доступ»

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

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

Особенности составных типов данных

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

Таким образом, мы выяснили, что СКД предоставляет мощнейший инструментарий для работы с ссылочными данными. Главное — соблюдать баланс между гибкостью настроек для пользователя и производительностью информационной системы.

← На главную