Перейти к содержимому

Сопутствующие товары - связи, комплекты и подарки

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

Решение

Заводим свойство-привязку у товаров:

$prop = new CIBlockProperty();
$prop->Add([
'IBLOCK_ID' => 5,
'NAME' => 'Сопутствующие товары',
'CODE' => 'RELATED',
'PROPERTY_TYPE' => 'E', // привязка к элементам инфоблока
'LINK_IBLOCK_ID' => 5, // к тому же каталогу
'MULTIPLE' => 'Y',
]);

Привязка хранит идентификаторы связанных элементов. Это самый простой механизм связи: он не требует ни отдельных сущностей, ни своего кода, и переживает любые обновления платформы.

Выводим связанные товары в карточке:

$related = (array)($arResult['PROPERTIES']['RELATED']['VALUE'] ?? []);
if ($related) {
$res = CIBlockElement::GetList(['SORT' => 'ASC'],
['IBLOCK_ID' => 5, 'ID' => $related, 'ACTIVE' => 'Y'],
false, false, ['ID', 'NAME', 'DETAIL_PAGE_URL', 'PREVIEW_PICTURE']);
}

Одна выборка по списку идентификаторов заменяет цикл с запросом на каждый товар. Проверка активности здесь обязательна: снятая с продажи позиция не должна попасть в блок аксессуаров.

Собираем связи автоматически по разделу:

// частый случай: аксессуары лежат своим разделом и подходят всем товарам ветки
$res = CIBlockElement::GetList(['RAND' => 'ASC'],
['IBLOCK_ID' => 5, 'SECTION_ID' => $accessoriesSectionId, 'ACTIVE' => 'Y'],
false, ['nTopCount' => 6], ['ID', 'NAME', 'DETAIL_PAGE_URL']);

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

Отличаем связь от комплекта:

// комплект - отдельный тип товара: он покупается целиком и имеет свою цену
$product = CCatalogProduct::GetByID($productId);
printf("тип товара=%s\n", $product['TYPE']); // обычный, набор или комплект

Связь только предлагает купить что-то ещё, а комплект продаётся как единая позиция со своей ценой и своим остатком. Путать их не стоит: у комплекта совсем другая логика списания и другая карточка товара.

Список связей стоит держать коротким. Шесть-восемь позиций покупатель просматривает, тридцать - пролистывает мимо, и на скорость страницы длинный список влияет заметнее, чем на продажи.

Связанные товары стоит показывать там, где они действительно помогают: в карточке и в корзине перед оформлением. Блок аксессуаров на витрине списка только удлиняет страницу и почти не работает.

Подарок за покупку - это правило корзины, а вовсе не связь между товарами. Условие описывает, за что дарят, действие добавляет позицию с нулевой ценой, и всё это живёт в модуле продаж отдельно от каталога.

Типичные проблемы

В блоке аксессуаров пусто.

Свойство-привязка у этого товара не заполнено. Механизм ничего не подбирает сам, и значения проставляют вручную либо своим кодом.

Среди аксессуаров снятые с продажи позиции.

В выборке связанных товаров нет проверки активности. Привязка хранит идентификаторы независимо от состояния самого товара.

Страница товара стала медленной.

Связанные товары выбираются по одному в цикле шаблона. Их берут одной общей выборкой по списку идентификаторов.

Комплект списывается не так, как ожидали.

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

Подарок не добавляется в корзину.

Правило корзины не выполняется по своим собственным условиям. Подарок относится к механизму скидок, а не к каталогу товаров.

Частые вопросы

Как перенести связи из учётной системы?

Через свойство-привязку: обмен умеет заполнять его по внешним кодам. Связи при этом должны быть описаны в самой номенклатуре.

Что лучше: ручные связи или подбор по разделу?

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

Можно ли показывать «с этим покупают»?

Да, но это уже статистика заказов, а не свойство товара. Такой блок собирают своим запросом по составу прошлых заказов.

Комплект или набор?

Набор собирается покупателем из перечисленных позиций, комплект продаётся фиксированным составом. У них разные типы товара и разное поведение в корзине.

Смежное

Первоисточник