При решении задач отчетности в 1С часто возникает необходимость выбрать объекты, у которых заполнено определенное количество дополнительных реквизитов. Задача усложняется, когда требуется сохранить иерархическую структуру справочника, но при этом ограничить выборку только элементами, удовлетворяющими условию по количеству свойств. Рассмотрим, как это реализовать с помощью языка запросов.
Наиболее эффективным способом решения данной задачи является разбиение запроса на этапы с использованием временных таблиц. Это позволяет сначала собрать все нужные данные, сгруппировать их для подсчета свойств, а затем отсеять лишнее.
Рассмотрим по шагам, как построить такой запрос:
ЛЕВОЕ СОЕДИНЕНИЕ со справочником Номенклатура, чтобы получить информацию о том, является ли объект группой.Пример реализации запроса через временную таблицу:
ВЫБРАТЬ
ДанныеОТовареНаСайте.Номенклатура КАК Номенклатура,
ЗначенияСвойствОбъектов.Объект КАК Объект,
КОЛИЧЕСТВО(ЗначенияСвойствОбъектов.Свойство) КАК КоличествоСвойств,
Товары.ЭтоГруппа КАК ЭтоГруппа
ПОМЕСТИТЬ вт
ИЗ
РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеОТовареНаСайте КАК ДанныеОТовареНаСайте
ПО ЗначенияСвойствОбъектов.Объект = ДанныеОТовареНаСайте.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары
ПО ДанныеОТовареНаСайте.Номенклатура = Товары.Ссылка
ГДЕ
ЗначенияСвойствОбъектов.Значение <> НЕОПРЕДЕЛЕНО
И ЗначенияСвойствОбъектов.Свойство В ИЕРАРХИИ(&МаркетинговыеСвойства)
И ДанныеОТовареНаСайте.Сайт = &Сайт
СГРУППИРОВАТЬ ПО
ДанныеОТовареНаСайте.Номенклатура,
ЗначенияСвойствОбъектов.Объект,
Товары.ЭтоГруппа
;
ВЫБРАТЬ
вт.Номенклатура КАК Номенклатура,
ВЫБОР КОГДА вт.ЭтоГруппа = ЛОЖЬ ТОГДА вт.КоличествоСвойств КОНЕЦ КАК КоличествоСвойств
ИЗ
вт КАК вт
ГДЕ
вт.КоличествоСвойств <= 2
Если задача стоит проще — получить список номенклатуры с количеством свойств не более двух без сложной иерархической отчетности, можно воспользоваться конструкцией ИМЕЮЩИЕ. Она применяется после СГРУППИРОВАТЬ ПО и позволяет отфильтровать записи по результатам агрегатных функций, таких как КОЛИЧЕСТВО().
Проанализируем пример такого запроса:
ВЫБРАТЬ
ДанныеОТовареНаСайте.Номенклатура КАК Номенклатура,
КОЛИЧЕСТВО(ЗначенияСвойствОбъектов.Объект) КАК КоличествоСвойств
ИЗ
РегистрСведений.ДанныеОТовареНаСайте КАК ДанныеОТовареНаСайте
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ПО ЗначенияСвойствОбъектов.Объект = ДанныеОТовареНаСайте.Номенклатура
СГРУППИРОВАТЬ ПО
ДанныеОТовареНаСайте.Номенклатура
ИМЕЮЩИЕ
КОЛИЧЕСТВО(ЗначенияСвойствОбъектов.Объект) <= 2
Когда вы работаете с отчетами в системе СКД, важно помнить следующее:
СКД. Выбирайте группировку по полю Номенклатура с установленным признаком Тип дополнения: Иерархия.ВЫБОР КОГДА непосредственно в коде запроса.Применяя данные подходы, вы сможете гибко настраивать выборки данных, сохраняя при этом читаемость кода и корректность итоговых показателей по иерархии справочников.