Настройка обязательных и опциональных товаров в комплекте 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка обязательных и опциональных товаров в комплекте 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1181
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    813
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка обязательных и опциональных товаров в комплекте 1С-Битрикс

Бандл «Игровой ПК» должен продаваться обязательно с системным блоком, но клавиатуру, мышь и гарнитуру покупатель выбирает сам — включить или нет. Это не просто флаг в базе: разные варианты комплектации дают разную цену, разные остатки, разные строки в заказе. Стандартный механизм b_catalog_product_set имеет поле IS_REQUIRED, но фронтенд-логика выбора опций не реализована из коробки.

Поле IS_REQUIRED в таблице b_catalog_product_set

Поле IS_REQUIRED принимает значения 0 (опциональный) и 1 (обязательный). Это единственное разделение в стандартной структуре. Для более сложных сценариев — например, «выбрать ровно одну позицию из группы» — нужно расширять схему.

Добавляем поле GROUP_ID в b_catalog_product_set через пользовательское поле или через расширение таблицы (если позволяет политика обновлений). Альтернатива без изменения структуры таблицы: хранить группировку в отдельной таблице bl_bundle_option_group:

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)
);

Логика выбора на фронтенде

Страница комплекта отображает обязательные позиции как неснимаемые (с галкой без возможности убрать) и опциональные — как чекбоксы или радио-кнопки (если 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);
}

Добавление в корзину с выбранными опциями

При добавлении в корзину нужно передать состав комплекта — только выбранные позиции. Через 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.

Остатки при опциональных позициях

Доступность комплекта при опциональных позициях: проверяем остатки только обязательных компонентов. Опциональные — отдельно, для каждого отображаем «доступно N штук» рядом с чекбоксом. Если опциональная позиция закончилась — чекбокс недоступен, но комплект без неё можно купить.

Цена комплекта со скидкой

Скидка на комплект применяется только при выборе всех опциональных позиций (полная комплектация) — это частый бизнес-кейс. Реализуется через правило корзины: скидка срабатывает при совпадении набора товаров в корзине с полным составом бандла. Условие правила: все ITEM_ID из b_catalog_product_set присутствуют в корзине с нужными количествами.

Что настраиваем

  • Таблицу bl_bundle_option_group для группировки опций с параметрами min_select/max_select
  • Шаблон компонента отображения комплекта с чекбоксами и пересчётом цены
  • AJAX-обработчик добавления в корзину с передачей выбранных опций
  • Логику проверки остатков обязательных и опциональных позиций раздельно
  • Правило корзины для скидки на полную комплектацию