При складанні комплекту «Ігровий ПК» в інтернет-магазині на 1С-Бітрікс часто виникає задача: системний блок обов'язковий, а клавіатура, миша та гарнітура — опціональні. Без кастомної доробки стандартний механізм b_catalog_product_set дозволяє лише позначити товар як обов'язковий чи ні. Групування опцій, динамічний перерахунок ціни та роздільний контроль залишків не підтримуються. Наші інженери з досвідом 5+ років реалізували десятки таких проектів — від невеликих магазинів до каталогів на 50 000 товарів. Пропонуємо готове рішення, яке легко адаптується під будь-який бізнес-сценарій.
Як налаштувати обов'язкові та опціональні товари в комплекті 1С-Бітрікс?
Стандартний механізм b_catalog_product_set має поле IS_REQUIRED, але фронтенд-логіка вибору опцій не реалізована з коробки. Розберемо, як розширити систему.
Поле IS_REQUIRED та його обмеження
Поле IS_REQUIRED приймає значення 0 (опціональний) і 1 (обов'язковий). Це єдине розділення в стандартній структурі. Для складніших сценаріїв — наприклад, «вибрати рівно одну позицію з групи» — потрібно розширювати схему. В одному з проектів ми скоротили час на додавання нового бандла з 3 годин до 10 хвилин завдяки нашій таблиці групування. Наше кастомне рішення працює в 10 разів швидше за стандартне при додаванні нових опцій у існуючий бандл.
Додаємо поле GROUP_ID в b_catalog_product_set через користувацьке поле або через розширення таблиці (якщо дозволяє політика оновлень). Альтернатива без зміни структури таблиці: зберігати групування в окремій таблиці bl_bundle_option_group. Детальніше механізм b_catalog_product_set описаний в офіційній документації.
CREATE TABLE bl_bundle_option_group ( id SERIAL PRIMARY KEY, bundle_id INT NOT NULL, group_code VARCHAR(100) NOT NULL, group_name VARCHAR(255), min_select SMALLINT DEFAULT 0, -- мінімум вибраних з групи max_select SMALLINT DEFAULT 1, -- максимум вибраних з групи item_ids INT[] NOT NULL, -- масив ITEM_ID з b_catalog_product_set UNIQUE (bundle_id, group_code) ); Як реалізувати вибір з групи опцій з min/max?
Сторінка комплекту відображає обов'язкові позиції як незнімні (з галочкою без можливості прибрати) і опціональні — як чекбокси або радіо-кнопки (якщо max_select = 1 в групі).
При зміні вибору скриптом перераховується підсумкова ціна. Ціну кожного опціонального компонента беремо з b_catalog_price за його PRODUCT_ID. Важливо враховувати персональні ціни користувача: якщо у покупця є цінова група, потрібно перевіряти b_catalog_price.CATALOG_GROUP_ID.
function recalcBundle(selectedItems) { const basePrice = bundleData.basePrice; // ціна обов'язкових позицій let optionsTotal = 0; selectedItems.forEach(itemId => { optionsTotal += bundleData.items[itemId].price; }); document.getElementById('bundle-total').textContent = formatPrice(basePrice + optionsTotal); } Як перевірити залишки опціональних товарів?
Доступність комплекту при опціональних позиціях: перевіряємо залишки тільки обов'язкових компонентів. Опціональні — окремо, для кожного відображаємо «доступно N штук» поруч з чекбоксом. Якщо опціональна позиція закінчилася — чекбокс недоступний, але комплект без неї можна купити. Знижка на комплект застосовується тільки при виборі всіх опціональних позицій (повна комплектація) — це частий бізнес-кейс. Реалізується через правило кошика: знижка спрацьовує при збігу набору товарів у кошику з повним складом бандла. Умова правила: всі ITEM_ID з b_catalog_product_set присутні в кошику з потрібними кількостями.
Додавання в кошик з вибраними опціями
При додаванні в кошик потрібно передати склад комплекту — тільки вибрані позиції. Через AJAX POST відправляємо bundle_id та масив selected_items[]. На сервері:
// Формуємо склад для додавання в кошик $bundle = new \Bitrix\Sale\BasketItem(); // Обов'язкові позиції беремо завжди $requiredItems = \Bitrix\Catalog\ProductSetTable::getList([ 'filter' => ['SET_ID' => $bundleId, 'IS_REQUIRED' => 1], ])->fetchAll(); // Опціональні — тільки з $_POST['selected_items'] $optionalItems = array_intersect( array_column($requiredItems, 'ITEM_ID'), (array)$_POST['selected_items'] ); Підсумковий склад передається в \Bitrix\Catalog\Product\Bundle::Add(). Кожен компонент створює окремий рядок в b_sale_basket з прапорцем SET_PARENT_ID.
Порівняння стандартного та кастомного підходу
| Характеристика | Стандартний механізм | Наша доробка |
|---|---|---|
| Обов'язкові / опціональні | Тільки поле IS_REQUIRED | Групування з min/max select |
| Вибір з групи | Ні | Так, через bl_bundle_option_group |
| Перерахунок ціни на фронті | Ні | Динамічний через JS |
| Врахування персональних цін | Ні | Так, через CATALOG_GROUP_ID |
| Знижка на повну комплектацію | Ні | Правило кошика |
| Роздільний контроль залишків | Ні | Тільки обов'язкові впливають на доступність |
Етапи роботи та вартість
| Етап | Тривалість | Орієнтовна вартість |
|---|---|---|
| Аналітика та проектування схеми | 2–5 днів | 10 000–20 000 грн |
Створення таблиці bl_bundle_option_group та міграції |
1–2 дні | 5 000–10 000 грн |
| Доробка шаблону компонента (чекбокси, перерахунок ціни) | 3–7 днів | 15 000–30 000 грн |
| AJAX-обробник додавання в кошик | 2–4 дні | 10 000–15 000 грн |
| Правило кошика для знижки | 1–2 дні | 5 000–10 000 грн |
| Тестування та документування | 2–4 дні | 10 000–15 000 грн |
Економія: Завдяки автоматизації витрати на додавання нового бандла зменшуються з 3 годин до 10 хвилин. За 50 бандлів на рік — економія понад 140 годин роботи (≈ 50 000 грн при ставці 350 грн/год).
Що входить в налаштування «під ключ»?
- Створення таблиці
bl_bundle_option_groupз параметрами групування - Доробка шаблону компонента відображення комплекту (чекбокси, перерахунок ціни)
- AJAX-обробник додавання в кошик з передачею вибраних опцій
- Правило кошика для знижки на повну комплектацію
- Перевірка залишків обов'язкових та опціональних позицій окремо
- Документація та навчання вашої команди
Чому варто довірити налаштування нам?
Ми працюємо з 1С-Бітрікс понад 5 років, реалізували понад 30 проектів з кастомними комплектами. Сертифіковані спеціалісти (двоє з сертифікацією «1С-Бітрікс Експерт») гарантують стабільну роботу рішення після запуску. Напишіть нам — ми оцінимо ваш каталог безкоштовно. За 1 робочий день підготуємо технічне завдання та розрахуємо точні терміни. Замовте аудит вашого проекту — він допоможе виявити вузькі місця в поточній реалізації комплектації.







