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