Как в СКД для регистра задать тип документа для извлекаемых движений

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

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

Способ 1. Использование функции ТИПЗНАЧЕНИЯ в параметрах запроса

Один из самых гибких способов — передать в запрос образец документа нужного типа. Это позволяет динамически определять тип сравнения. Разберем ситуацию: в платформе версии 8.2 и выше мы можем сравнивать типы напрямую. В тексте запроса это выглядит следующим образом:


ГДЕ
    ТИПЗНАЧЕНИЯ(уатПартииТоваровНаСкладах.Регистратор) = ТИПЗНАЧЕНИЯ(&ОбразецДокумента)

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

Способ 2. Логические переключатели для фиксированного набора документов

Если список документов заранее известен и невелик, можно использовать конструкцию ВЫБОР КОГДА в блоке ГДЕ. Проанализируем пример, где пользователю выводятся флажки для выбора типов документов:


ГДЕ
    ВЫБОР
        КОГДА &ВыводитьРеализации ТОГДА 
            уатПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
        КОГДА &ВыводитьПеремещения ТОГДА 
            уатПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
        ИНАЧЕ ИСТИНА
    КОНЕЦ

Для реализации этого метода выполним следующие шаги:

  1. Добавим в схему СКД параметры типа Булево (например, &ВыводитьРеализации).
  2. Выведем эти параметры в пользовательские настройки.
  3. Для удобства настроим представление: для значения Ложь укажем "Нет", для Истина — "Да".

Если все параметры установлены в значение Ложь, условие ИНАЧЕ ИСТИНА позволит вывести движения по всем видам документов.

Способ 3. Программная модификация текста запроса

Когда количество типов документов может меняться или оно слишком велико, наиболее правильным будет программное вмешательство. Рассмотрим вариант, при котором мы динамически формируем текст условия в запросе перед его выполнением. Мы можем добавить в текст запроса конструкцию с использованием оператора ССЫЛКА:


// Пример фрагмента кода для изменения запроса
ТекстУсловия = "";
Для Каждого ВыбранныйТип Из СписокТипов Цикл
    ТекстУсловия = ТекстУсловия + "Регистратор ССЫЛКА " + ВыбранныйТип.ИмяМетаданных + " ИЛИ ";
КонецЦикла;
// Далее удаляем последний "ИЛИ" и вставляем в запрос

Важный момент: использование оператора ССЫЛКА (например, Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг) является более производительным с точки зрения SQL, чем функция ТИПЗНАЧЕНИЯ. Это связано с тем, что ССЫЛКА позволяет СУБД более эффективно использовать индексы таблиц (так называемая SARGability запроса).

Способ 4. Современный метод через ОписаниеТипов (платформа 8.3)

В современных версиях платформы можно создать параметр компоновки данных с типом ОписаниеТипов. Это позволяет пользователю выбирать именно типы метаданных из дерева документов, а не ссылки на конкретные объекты. Посмотрим, как это настроить:

  1. В параметрах СКД создаем СписокТипов.
  2. Устанавливаем ему тип данных ОписаниеТипов.
  3. В запросе прописываем условие: ГДЕ ТИПЗНАЧЕНИЯ(Регистратор) В (&СписокТипов).

Способ 5. Использование расширений языка запросов СКД

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


ВЫБРАТЬ
    уатПартииТоваровНаСкладах.Регистратор,
    уатПартииТоваровНаСкладах.Количество
ИЗ
    РегистрНакопления.уатПартииТоваровНаСкладах КАК уатПартииТоваровНаСкладах
ГДЕ
    {Регистратор.*}

Тогда в настройках отчета (вкладка "Отбор") пользователь сможет добавить поле Регистратор. При выборе вида сравнения "Равно" или "В списке", нажав на кнопку выбора типа (иконка с буквой "Т"), он сможет отметить галочками нужные типы документов. СКД сама преобразует этот выбор в эффективный SQL-запрос с использованием необходимых соединений или операторов ССЫЛКА.

Рекомендации по производительности

Проанализируем ситуацию с большими объемами данных. Если ваш регистр содержит миллионы записей, фильтрация по регистратору может работать медленно. Чтобы ускорить отчет, придерживайтесь следующих правил:

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

← На главную