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

Комплекты и наборы товаров - состав, цена, продажа

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

Механика

Комплект и набор рекомендаций - две разные сущности с похожим интерфейсом. Комплект продаётся как единая позиция, а набор рекомендаций только показывает покупателю сопутствующие товары.

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

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

Обратный порядок действий выглядит успешным, но настоящего комплекта не даёт. Позиция остаётся обычным товаром с непонятно откуда взявшимся составом, и в корзине ведёт себя как обычный товар.

Правка состава комплекта заменяет его целиком, а вовсе не дописывает новые позиции. Переданный список позиций становится новым составом, а всё, чего в нём нет, из комплекта исчезает.

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

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

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

В состав комплекта нельзя класть родительские товары с торговыми предложениями. В состав идут простые товары и конкретные предложения, а родительские карточки для этого не подходят.

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

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

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

Шаги

  1. Определить, нужен комплект как отдельный продаваемый товар или достаточно показа рекомендаций.
  2. Для комплекта сменить тип самого товара в каталоге на соответствующий тип продаваемого набора.
  3. Заполнить состав комплекта позициями с количеством и нужной сортировкой вывода.
  4. Проверить результат вызова и прочитать список ошибок класса при неудаче.
  5. Задать цену готового комплекта отдельно от цен всех входящих в него позиций.
  6. Проверить поведение комплекта в корзине и при нехватке складского остатка любой позиции.

Код

Меняем тип товара на комплект:

\Bitrix\Main\Loader::includeModule('catalog');
$result = \Bitrix\Catalog\Model\Product::update($productId, [
'TYPE' => \Bitrix\Catalog\ProductTable::TYPE_SET, // сначала тип, потом состав
]);
if (!$result->isSuccess()) { print_r($result->getErrorMessages()); }

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

Заполняем состав комплекта:

$setId = \CCatalogProductSet::add([
'TYPE' => \CCatalogProductSet::TYPE_SET,
'ITEM_ID' => $productId, // сам товар-комплект
'ACTIVE' => 'Y',
'ITEMS' => [
['ITEM_ID' => $lampId, 'QUANTITY' => 1, 'SORT' => 100],
['ITEM_ID' => $chairId, 'QUANTITY' => 2, 'SORT' => 200],
],
]);

Состав перечисляется списком позиций с количеством и порядком вывода. Количество больше единицы - обычное дело: набор из двух одинаковых стульев описывается одной строкой состава.

Читаем причину отказа:

if (!$setId) {
$errors = \CCatalogProductSet::getErrors();
throw new \RuntimeException($errors ? $errors[0]['text'] : 'комплект не создан');
}
// метод возвращает ложь, а текст ошибки лежит в отдельном списке

Проверка результата обязательна, как и везде в каталоге. Пустой список позиций, нулевое количество или повторяющийся товар дают отказ без единого исключения.

Правим состав целиком:

\CCatalogProductSet::update($setId, [
'ITEMS' => [
['ITEM_ID' => $lampId, 'QUANTITY' => 1, 'SORT' => 100],
['ITEM_ID' => $chairId, 'QUANTITY' => 2, 'SORT' => 200],
['ITEM_ID' => $tableId, 'QUANTITY' => 1, 'SORT' => 300],
],
]);
// переданный список становится новым составом: отсутствующие позиции удаляются

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

Заводим набор рекомендаций:

$groupId = \CCatalogProductSet::add([
'TYPE' => \CCatalogProductSet::TYPE_GROUP, // тип товара при этом не меняется
'ITEM_ID' => $productId,
'ACTIVE' => 'Y',
'ITEMS' => [
['ITEM_ID' => $bagId, 'QUANTITY' => 1, 'SORT' => 100],
],
]);

Набор рекомендаций живёт рядом с товаром и ничего не меняет в его продаже. Он нужен там, где надо показать аксессуары, но продавать их по-прежнему поштучно.

Читаем состав существующего комплекта:

$rows = \CCatalogProductSet::getList(
[], ['ITEM_ID' => $productId, 'TYPE' => \CCatalogProductSet::TYPE_SET], false, false,
['ID', 'ITEM_ID', 'QUANTITY']
);
while ($row = $rows->Fetch()) { print_r($row); }
// пустой ответ означает, что состав так и не заполнили
// TYPE отличает комплект от набора рекомендаций в этой же таблице

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

Ограничения

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

Цена комплекта не пересчитывается из цен его состава автоматически. Её задают отдельно, и следить за её актуальностью при изменении цен позиций приходится самим.

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

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

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

Состав заполнен, а товар ведёт себя как обычный.

Тип самого товара не был изменён перед заполнением его состава. Комплектом позицию делает именно смена типа товара, а вовсе не наличие состава.

После правки в комплекте осталась одна позиция.

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

Создание комплекта возвращает отказ без объяснения.

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

Комплект с товаром-родителем не собирается.

В состав комплекта добавлена родительская карточка товара с торговыми предложениями. В состав комплекта идут простые товары и конкретные торговые предложения.

Комплект стоит столько же, сколько позиции по отдельности.

Цена комплекта не задана или случайно совпадает с суммой цен его позиций. Она задаётся у самого комплекта и из цен его состава не считается.

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

Чем комплект отличается от набора рекомендаций?

Комплект - отдельная продаваемая позиция со своим составом и ценой, он меняет тип товара. Набор рекомендаций только показывает сопутствующие товары и тип не меняет.

Можно ли продавать позиции комплекта отдельно?

Да, входящие товары остаются обычными позициями каталога. Комплект добавляет к ним отдельную продаваемую единицу, а не заменяет их.

Как обновить цену комплекта при изменении цен позиций?

Своим кодом или руками: автоматического пересчёта нет. На больших каталогах это делают заданием по расписанию с проверкой расхождений.

Что происходит с остатком при покупке комплекта?

Списываются остатки входящих позиций по их количеству в составе. Отдельного остатка у комплекта нет, и его доступность считается по составу.

Подходит ли комплект для акции «два по цене одного»?

Нет, для таких акций берут правила работы с корзиной. Комплект - постоянная продаваемая позиция, а не временное условие продажи.

Смежное

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