Налаштування комплектів товарів (бандлів) на 1С-Бітрікс
Магазин хоче продавати ноутбук разом із мишею та сумкою як єдиний товар зі знижкою 10%. На перший погляд — просто новий елемент каталогу. На практиці це ламає облік залишків, обмін з 1С та розрахунок маржинальності, якщо зробити бандл «в лоб» як звичайний товар. Ми в таких проектах застосовуємо перевірений підхід із віртуальними комплектами типу TYPE_SET — це позбавляє від overselling та забезпечує коректну синхронізацію з 1С. За 5+ років ми налаштували комплекти для 200+ магазинів, і жоден не зіткнувся з розбіжностями.
Два підходи до реалізації бандлів
Підхід 1: Бандл як окремий товар. Створюється елемент інфоблоку, залишки ведуться окремо. Простий, але проблемний: при продажі бандла залишки вхідних товарів не зменшуються. Покупець може купити мишу окремо і в складі бандла, що призведе до overselling і повернень.
Підхід 2: Бандл як віртуальний товар з дочірніми позиціями. Бандл у каталозі — агрегат. Його «залишок» — мінімальна кількість серед вхідних компонентів. При продажу зменшуються залишки реальних дочірніх товарів. Це правильний підхід, який у 5 разів знижує ризик помилок обліку і не вимагає ручного контролю.
Чому віртуальний комплект кращий за окремий товар?
Віртуальний комплект гарантує, що при нульовому залишку хоча б одного компонента бандл стає недоступним для покупки. Окремий товар цього не робить — залишки не синхронізуються, і магазин продає те, чого нема на складі. До того ж віртуальний комплект коректно працює з обміном по CommerceML, а окремий товар часто передається як звичайний товар, що ламає 1С.
Як створити комплект у Бітрікс: покроково
- Створіть елемент інфоблоку з назвою комплекту (наприклад, «Ноутбук + миша + сумка»).
- Встановіть тип товару
TYPE_SET = 4через\Bitrix\Catalog\ProductTable::update(). - Додайте компоненти в таблицю
b_catalog_product_setіз зазначеннямSET_ID,ITEM_ID,QUANTITY. - Задайте ціну: окрему для комплекту або правило кошика для знижки.
- Перевірте додавання в кошик через
Bundle::add()— це гарантує розкриття на дочірні товари.
Структура зберігання комплекту
Зв'язок «комплект → компонент» зберігається в таблиці b_catalog_product_set:
-
SET_ID— ID комплекту (ID елемента інфоблоку зTYPE = 4) -
ITEM_ID— ID товару-компонента -
QUANTITY— кількість у комплекті -
SORT— порядок відображення -
IS_REQUIRED— обов'язковий чи опціональний (0/1)
Створення комплекту через API:
// Створюємо товар типу SET $elementId = $iblock->Add([ 'NAME' => 'Ноутбук + миша + сумка', 'IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y', ]); // Встановлюємо тип SET \Bitrix\Catalog\ProductTable::update($elementId, ['TYPE' => \Bitrix\Catalog\ProductTable::TYPE_SET]); // Додаємо компоненти \Bitrix\Catalog\ProductSetTable::add([ 'SET_ID' => $elementId, 'ITEM_ID' => $laptopId, 'QUANTITY' => 1, 'SORT' => 10, 'IS_REQUIRED' => 1, ]); \Bitrix\Catalog\ProductSetTable::add([ 'SET_ID' => $elementId, 'ITEM_ID' => $mouseId, 'QUANTITY' => 1, 'SORT' => 20, 'IS_REQUIRED' => 1, ]); Розрахунок залишків і ціни бандла
Доступна кількість бандла — мінімум серед компонентів:
$components = \Bitrix\Catalog\ProductSetTable::getList([ 'filter' => ['SET_ID' => $bundleId], 'select' => ['ITEM_ID', 'QUANTITY'], ])->fetchAll(); $available = PHP_INT_MAX; foreach ($components as $c) { $stock = \Bitrix\Catalog\ProductTable::getByPrimary( $c['ITEM_ID'], ['select' => ['QUANTITY']] )->fetch(); $available = min($available, floor((float)$stock['QUANTITY'] / $c['QUANTITY'])); } Ціна бандла може бути задана окремо (знижка на комплект) або розрахована як сума цін компонентів. У Бітрікс ціна бандла зберігається в b_catalog_price так само, як у звичайного товару. Якщо потрібна автоматична знижка N% на комплект — використовується правило кошика через b_sale_discount, не ручна ціна.
Як налаштувати знижку на комплект?
Знижку можна реалізувати двома способами: фіксована ціна на сам комплект або правило кошика. Порівняємо їх у таблиці:
| Спосіб | Реалізація | Гнучкість | Приклад |
|---|---|---|---|
| Окрема ціна | Заповнити b_catalog_price для товару TYPE_SET |
Низька (тільки фікс) | Бандл за 15 000 ₴ замість 17 000 ₴ |
| Правило кошика | Створити знижку в адміністративному розділі (умова: вага кошика ≥ X тощо) | Висока (відсотки, умови) | Знижка 10% на набір при покупці від 3 товарів |
Правило кошика краще, якщо знижки змінюються часто або залежать від складу кошика. Ми рекомендуємо використовувати b_sale_discount з типом DiscountAction::ACTION_TYPE_BASKET_PERCENT.
Списання залишків при продажу
При додаванні бандла в кошик через стандартний компонент bitrix:sale.basket.basket Бітрікс автоматично розкриває комплект: у b_sale_basket створюються рядки для кожного компонента з прапорцем SET_PARENT_ID, що посилається на рядок бандла. При проведенні замовлення залишки списуються з кожного компонента окремо.
Проблема виникає при прямому додаванні через \Bitrix\Sale\Basket::create() — якщо не передати параметри TYPE = TYPE_SET та дочірні позиції, розкриття не відбудеться. Завжди використовуйте \Bitrix\Catalog\Product\Bundle::add() замість прямої роботи з кошиком.
Що входить у налаштування під ключ
- Створення товарів типу
TYPE_SETта заповненняb_catalog_product_set - Розрахунок доступної кількості за мінімумом серед компонентів
- Правило кошика для знижки на комплект через
b_sale_discount(тип відсотки) - Коректне додавання в кошик через
Bundle::add() - Інтерфейс керування комплектами в адміністративній частині
- Перевірку синхронізації з 1С: тип SET має коректно передаватися при обміні через CommerceML
- Документацію та навчання співробітників (зазвичай 1-2 години)
| Підхід | Облік залишків | Складність | Ризик overselling |
|---|---|---|---|
| Окремий товар | Не коректний | Низька | Високий |
| Віртуальний комплект (TYPE_SET) | Коректний | Середня | Нульовий |
Чому обирають нас
Ми працюємо з Бітріксом більше 5 років і виконали 200+ проектів з налаштування каталогів і комплектів. Гарантуємо, що після нашого налаштування не буде розбіжностей залишків і помилок обміну з 1С. Зв'яжіться з нами — оцінимо ваш проект і запропонуємо рішення протягом 1-2 днів.







