Как найти товары в 1С по набору дополнительных реквизитов?

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

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

Понимание проблемы

Когда у нас есть несколько обязательных дополнительных реквизитов (например, бренд, цвет, состав, размер), простое перечисление условий в блоке ГДЕ может привести к неверным результатам. Это связано с тем, что записи в табличной части — это отдельные строки, и нам нужно гарантировать, что каждый товар содержит весь набор указанных пар «Свойство-Значение».

Способ 1: Использование конструкции ОБЪЕДИНИТЬ ВСЕ и группировки

Один из способов, который можно реализовать на практике, заключается в том, чтобы выбрать товары по каждому свойству отдельно, присвоив им некий признак (например, цифру 1), а затем сгруппировать результат по Ссылка. Если сумма признаков равна количеству наших условий, значит, товар содержит все необходимые характеристики.


ВЫБРАТЬ
    ВложенныйЗапрос.Ссылка КАК Ссылка,
    СУММА(1) КАК ПолеСуммы
ИЗ
    (ВЫБРАТЬ
        ТЧ.Ссылка, 1 КАК ПолеСуммы
    ИЗ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ТЧ
    ГДЕ ТЧ.Свойство = &Свойство1 И ТЧ.Значение = &Значение1
    ОБЪЕДИНИТЬ ВСЕ
    ВЫБРАТЬ
        ТЧ.Ссылка, 1
    ИЗ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ТЧ
    ГДЕ ТЧ.Свойство = &Свойство2 И ТЧ.Значение = &Значение2) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.Ссылка
ИМЕЮЩИЕ
    СУММА(ВложенныйЗапрос.ПолеСуммы) = 2

Этот метод рабочий, но при увеличении числа условий он становится громоздким. Также стоит помнить, что ОБЪЕДИНИТЬ ВСЕ создает временные таблицы, что может замедлить работу при больших объемах данных.

Способ 2: Оптимизированный подход через ИМЕЮЩИЕ

Если набор условий можно ограничить общим списком, мы можем значительно сократить код. Мы выбираем только те записи из табличной части, которые входят в наш список значений, а затем считаем количество найденных уникальных свойств для каждого товара.


ВЫБРАТЬ
    ТЧ.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура.ДополнительныеРеквизиты КАК ТЧ
ГДЕ
    ТЧ.Значение В (&СписокЗначений)
СГРУППИРОВАТЬ ПО
    ТЧ.Ссылка
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТЧ.Свойство) = 7

Важно использовать КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТЧ.Свойство), чтобы исключить дублирование записей, если они случайно возникли в данных.

Способ 3: Использование внутренних соединений (INNER JOIN)

Профессионалы 1С чаще всего рекомендуют использовать классический метод соединений. Мы присоединяем табличную часть к справочнику Номенклатура несколько раз (по одному разу на каждый реквизит). Это самый быстрый способ для СУБД, так как оптимизатор запросов может эффективно использовать индексы.

Рассмотрим логику построения:

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

Такой подход гарантирует, что в выборку попадут только те товары, которые обладают всеми заданными параметрами, и при этом исключает возможность «перекрестного» совпадения, когда значение одного свойства ошибочно приписывается другому.

Практические рекомендации

Используя метод соединений, вы получите наиболее производительное решение, которое будет работать стабильно даже при значительном росте номенклатурной базы.

← На главную