При разработке отчетов на базе Системы компоновки данных (СКД) часто возникает задача ограничить выборку данных из регистров накопления или сведений только определенными типами документов. Например, если отчет строится по партиям товаров, пользователю может потребоваться увидеть движения только по документу ТребованиеНакладная или РеализацияТоваровУслуг. Рассмотрим подробнее несколько способов решения этой задачи, начиная от простых настроек в запросе и заканчивая программными методами.
Один из самых гибких способов — передать в запрос образец документа нужного типа. Это позволяет динамически определять тип сравнения. Разберем ситуацию: в платформе версии 8.2 и выше мы можем сравнивать типы напрямую. В тексте запроса это выглядит следующим образом:
ГДЕ
ТИПЗНАЧЕНИЯ(уатПартииТоваровНаСкладах.Регистратор) = ТИПЗНАЧЕНИЯ(&ОбразецДокумента)
В этом случае мы создаем параметр &ОбразецДокумента. Пользователь в настройках отчета выбирает любой существующий документ нужного ему вида, и система автоматически отфильтровывает все записи регистра по этому типу. Однако стоит помнить, что этот метод требует наличия хотя бы одного документа данного типа в базе данных для выбора в качестве параметра.
Если список документов заранее известен и невелик, можно использовать конструкцию ВЫБОР КОГДА в блоке ГДЕ. Проанализируем пример, где пользователю выводятся флажки для выбора типов документов:
ГДЕ
ВЫБОР
КОГДА &ВыводитьРеализации ТОГДА
уатПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
КОГДА &ВыводитьПеремещения ТОГДА
уатПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
ИНАЧЕ ИСТИНА
КОНЕЦ
Для реализации этого метода выполним следующие шаги:
Булево (например, &ВыводитьРеализации).Ложь укажем "Нет", для Истина — "Да".Если все параметры установлены в значение Ложь, условие ИНАЧЕ ИСТИНА позволит вывести движения по всем видам документов.
Когда количество типов документов может меняться или оно слишком велико, наиболее правильным будет программное вмешательство. Рассмотрим вариант, при котором мы динамически формируем текст условия в запросе перед его выполнением. Мы можем добавить в текст запроса конструкцию с использованием оператора ССЫЛКА:
// Пример фрагмента кода для изменения запроса
ТекстУсловия = "";
Для Каждого ВыбранныйТип Из СписокТипов Цикл
ТекстУсловия = ТекстУсловия + "Регистратор ССЫЛКА " + ВыбранныйТип.ИмяМетаданных + " ИЛИ ";
КонецЦикла;
// Далее удаляем последний "ИЛИ" и вставляем в запрос
Важный момент: использование оператора ССЫЛКА (например, Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг) является более производительным с точки зрения SQL, чем функция ТИПЗНАЧЕНИЯ. Это связано с тем, что ССЫЛКА позволяет СУБД более эффективно использовать индексы таблиц (так называемая SARGability запроса).
В современных версиях платформы можно создать параметр компоновки данных с типом ОписаниеТипов. Это позволяет пользователю выбирать именно типы метаданных из дерева документов, а не ссылки на конкретные объекты. Посмотрим, как это настроить:
СписокТипов.ОписаниеТипов.ГДЕ ТИПЗНАЧЕНИЯ(Регистратор) В (&СписокТипов).Выясним, как сделать фильтрацию максимально удобной для пользователя без написания лишнего кода. В СКД существуют фигурные скобки {}, которые позволяют системе автоматически добавлять условия отбора. Если мы напишем в запросе:
ВЫБРАТЬ
уатПартииТоваровНаСкладах.Регистратор,
уатПартииТоваровНаСкладах.Количество
ИЗ
РегистрНакопления.уатПартииТоваровНаСкладах КАК уатПартииТоваровНаСкладах
ГДЕ
{Регистратор.*}
Тогда в настройках отчета (вкладка "Отбор") пользователь сможет добавить поле Регистратор. При выборе вида сравнения "Равно" или "В списке", нажав на кнопку выбора типа (иконка с буквой "Т"), он сможет отметить галочками нужные типы документов. СКД сама преобразует этот выбор в эффективный SQL-запрос с использованием необходимых соединений или операторов ССЫЛКА.
Проанализируем ситуацию с большими объемами данных. Если ваш регистр содержит миллионы записей, фильтрация по регистратору может работать медленно. Чтобы ускорить отчет, придерживайтесь следующих правил:
ОстаткиИОбороты), помните, что поле Регистратор доступно только при выборе периодичности "Регистратор" или "Запись".Таким образом, выбор метода зависит от версии вашей платформы и того, насколько гибким должен быть интерфейс для конечного пользователя. Для старых конфигураций на базе 8.1 оптимальным будет программное добавление условий в текст запроса, а для современных решений на 8.3 — использование стандартных отборов компоновки данных.