Как отфильтровать номенклатуру по количеству заполненных свойств в запросе 1С?

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

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

Использование временных таблиц для фильтрации

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

Рассмотрим по шагам, как построить такой запрос:

  1. Создаем временную таблицу, в которую помещаем данные о номенклатуре и количестве ее свойств.
  2. Используем ЛЕВОЕ СОЕДИНЕНИЕ со справочником Номенклатура, чтобы получить информацию о том, является ли объект группой.
  3. Производим группировку данных, чтобы подсчитать количество свойств для каждого элемента.
  4. Применяем итоговую фильтрацию по полученному количеству.

Пример реализации запроса через временную таблицу:


ВЫБРАТЬ
    ДанныеОТовареНаСайте.Номенклатура КАК Номенклатура,
    ЗначенияСвойствОбъектов.Объект КАК Объект,
    КОЛИЧЕСТВО(ЗначенияСвойствОбъектов.Свойство) КАК КоличествоСвойств,
    Товары.ЭтоГруппа КАК ЭтоГруппа
ПОМЕСТИТЬ вт
ИЗ
    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеОТовареНаСайте КАК ДанныеОТовареНаСайте
        ПО ЗначенияСвойствОбъектов.Объект = ДанныеОТовареНаСайте.Номенклатура
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары
        ПО ДанныеОТовареНаСайте.Номенклатура = Товары.Ссылка
ГДЕ
    ЗначенияСвойствОбъектов.Значение <> НЕОПРЕДЕЛЕНО
    И ЗначенияСвойствОбъектов.Свойство В ИЕРАРХИИ(&МаркетинговыеСвойства)
    И ДанныеОТовареНаСайте.Сайт = &Сайт
СГРУППИРОВАТЬ ПО
    ДанныеОТовареНаСайте.Номенклатура,
    ЗначенияСвойствОбъектов.Объект,
    Товары.ЭтоГруппа
;
ВЫБРАТЬ
    вт.Номенклатура КАК Номенклатура,
    ВЫБОР КОГДА вт.ЭтоГруппа = ЛОЖЬ ТОГДА вт.КоличествоСвойств КОНЕЦ КАК КоличествоСвойств
ИЗ
    вт КАК вт
ГДЕ
    вт.КоличествоСвойств <= 2

Применение конструкции ИМЕЮЩИЕ

Если задача стоит проще — получить список номенклатуры с количеством свойств не более двух без сложной иерархической отчетности, можно воспользоваться конструкцией ИМЕЮЩИЕ. Она применяется после СГРУППИРОВАТЬ ПО и позволяет отфильтровать записи по результатам агрегатных функций, таких как КОЛИЧЕСТВО().

Проанализируем пример такого запроса:


ВЫБРАТЬ
    ДанныеОТовареНаСайте.Номенклатура КАК Номенклатура,
    КОЛИЧЕСТВО(ЗначенияСвойствОбъектов.Объект) КАК КоличествоСвойств
ИЗ
    РегистрСведений.ДанныеОТовареНаСайте КАК ДанныеОТовареНаСайте
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
        ПО ЗначенияСвойствОбъектов.Объект = ДанныеОТовареНаСайте.Номенклатура
СГРУППИРОВАТЬ ПО
    ДанныеОТовареНаСайте.Номенклатура
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(ЗначенияСвойствОбъектов.Объект) <= 2

Рекомендации по выводу итогов

Когда вы работаете с отчетами в системе СКД, важно помнить следующее:

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

← На главную