Как реализовать подбор характеристик номенклатуры по набору свойств в 1С:Управление торговлей 11?

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

В типовых конфигурациях, таких как 1С:Управление торговлей 11, ERP 2 или Комплексная автоматизация 2, характеристики номенклатуры и дополнительные реквизиты хранятся по модели EAV (Entity-Attribute-Value). Это означает, что свойства не являются колонками таблицы, а хранятся в виде отдельных строк в связанных таблицах (например, в табличной части или регистре сведений). В данной статье мы проанализируем, как правильно написать запрос для поиска объектов, которые одновременно обладают всем набором заданных свойств.

Постановка задачи и основная сложность

Рассмотрим ситуацию: нам необходимо найти характеристику, у которой «Цвет» — «Красный» И «Размер» — «42». Если мы просто напишем условие ГДЕ, запрос вернет пустой результат или некорректные данные, так как в одной строке таблицы свойств не может одновременно находиться и цвет, и размер. Каждое свойство — это отдельная запись.

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

Метод 1: Группировка и условие ИМЕЮЩИЕ (Наиболее оптимальный)

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

  1. Подготовка фильтра: Поместим искомые пары «Свойство — Значение» во временную таблицу.
  2. Соединение: Выполним внутреннее соединение таблицы характеристик (или их свойств) с нашей временной таблицей по полям Свойство и Значение.
  3. Группировка: Сгруппируем результат по ссылке на характеристику.
  4. Фильтрация по количеству: В секции ИМЕЮЩИЕ установим условие, что количество найденных свойств должно быть равно общему количеству свойств в фильтре.

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


// Предположим, ПараметрыОтбора - это ТаблицаЗначений с колонками Свойство и Значение
// &КоличествоСвойств - число строк в этой таблице

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

Метод 2: Алгоритм исключения (через временные таблицы)

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

Алгоритм действий следующий:

  1. Находим все характеристики, которые соответствуют хотя бы одному условию из таблицы фильтра, и помещаем их во временную таблицу ВТ_Предварительная.
  2. Находим характеристики, которые НЕ соответствуют хотя бы одному из условий (например, имеют другое значение того же свойства), и помещаем их в таблицу ВТ_Исключения.
  3. В итоговом запросе выбираем данные из ВТ_Предварительная, которых нет в ВТ_Исключения.

Этот способ более трудозатратный для сервера БД, однако он наглядно показывает логику отсеивания неподходящих вариантов. Тем не менее, для промышленной разработки рекомендуется использовать Метод 1.

Особенности работы с характеристиками в УТ 11

Проанализируем нюанс, который часто становится причиной ошибок (как это случилось в обсуждении на форуме). В 1С:Управление торговлей 11 свойства могут храниться не только в справочнике ХарактеристикиНоменклатуры, но и наследоваться от владельца (Номенклатуры) или определяться настройками вида номенклатуры.

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

Почему решение может не работать?

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

  1. Типизация значений: Если в фильтр переданы значения не того типа (например, строка вместо ссылки на справочник ЗначенияСвойствОбъектов), соединение не сработает.
  2. Индексация: При работе с большими базами данных (десятки тысяч характеристик) временную таблицу фильтра ВТ_Фильтр обязательно нужно проиндексировать по полям Свойство и Значение для быстродействия.
  3. Проверка заполненности: В запросе следует добавлять условие на то, что значение свойства в базе не является пустым, чтобы избежать ложных срабатываний.

Используя представленные методы, вы сможете реализовать гибкий и производительный поиск объектов по любым наборам дополнительных свойств в конфигурациях на платформе 1С:Предприятие 8.3.

← На главную