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