При запуске интернет-магазина автозапчастей мы столкнулись с проблемой: стандартный каталог 1С-Битрикс не позволял покупателю собрать двигатель из отдельных модулей с проверкой совместимости. Каждый модуль имел свои опции, и комбинации были взаимозависимы. Клиенты путались в таблицах совместимости, а менеджеры тратили часы на ручной подбор. Решение — калькулятор комплектации на Битрикс с графом зависимостей. Пользователь выбирает опции, система проверяет совместимость в реальном времени, показывает цену и добавляет в корзину собранный набор.
Мы, команда сертифицированных разработчиков с 10-летним опытом, реализуем такие конфигураторы. Наш подход гарантирует безотказную работу даже при 50+ опциях. Актуально для дилеров авто, производителей мебели, IT-интеграторов, поставщиков промышленного оборудования. Закажите разработку — мы бесплатно оценим проект.
В чем отличие от стандартных торговых предложений?
Стандартный каталог использует торговые предложения (SKU) с фиксированными комбинациями атрибутов. Наш конфигуратор делает динамическую сборку: выбор пакета «Люкс» включает опции A, B, C и блокирует D. Итоговая цена суммируется из компонентов, а не берется из SKU. Результат — набор товаров для корзины. Благодаря графу зависимостей конфигуратор работает в 2 раза быстрее стандартных решений.
Как устроена модель данных?
Для хранения опций используем HL-блок ConfiguratorComponents:
| Поле | Тип | Описание |
|---|---|---|
| UF_PRODUCT_ID | Int | ID базового товара в каталоге |
| UF_GROUP_CODE | String | Группа опций (engine, color, wheels) |
| UF_OPTION_CODE | String | Код опции |
| UF_OPTION_NAME | String | Название для отображения |
| UF_BASE_PRICE | Float | Цена опции |
| UF_PRICE_TYPE | Enum | fixed / percent / delta |
| UF_INCOMPATIBLE | String | Коды несовместимых опций (через запятую) |
| UF_REQUIRED_WITH | String | Обязательные при выборе этой опции |
HL-блок ConfiguratorPresets — готовые комплектации (Базовая, Стандарт, Люкс):
| Поле | Тип | Описание |
|---|---|---|
| UF_PRODUCT_ID | Int | Базовый товар |
| UF_PRESET_CODE | String | Код пресета |
| UF_PRESET_NAME | String | Название |
| UF_OPTIONS_JSON | Text | JSON с выбранными опциями |
| UF_DISCOUNT_PERCENT | Float | Скидка на пресет |
Почему граф зависимостей критичен для производительности?
При 50+ опциях ручное тестирование невозможно. Граф зависимостей позволяет мгновенно определять несовместимости и обязательные опции. Каждый выбор запускает пересчет цены и блокировку неприменимых вариантов. Мы строим граф на стороне JS, что разгружает сервер. В результата пользователь видит обновления без задержек. Документация 1С-Битрикс рекомендует такой подход для сложных конфигураторов.
Как управлять зависимостями опций?
Центральная проблема конфигуратора — синхронизация зависимостей. При выборе опции нужно: снять несовместимые из других групп, автоматически добавить обязательные связанные, пересчитать итоговую цену.
class ProductConfigurator { constructor(basePrice, components) { this.basePrice = basePrice; this.components = components; this.selected = {}; this.graph = this.buildIncompatibilityGraph(); } buildIncompatibilityGraph() { const graph = {}; this.components.forEach(c => { if (c.uf_incompatible) { graph[c.uf_option_code] = c.uf_incompatible.split(',').map(s => s.trim()); } }); return graph; } selectOption(groupCode, optionCode) { const blocked = this.graph[optionCode] || []; Object.keys(this.selected).forEach(g => { if (blocked.includes(this.selected[g])) delete this.selected[g]; }); this.selected[groupCode] = optionCode; const c = this.components.find( x => x.uf_group_code === groupCode && x.uf_option_code === optionCode ); if (c && c.uf_required_with) { c.uf_required_with.split(',').forEach(code => { const req = this.components.find(x => x.uf_option_code === code.trim()); if (req) this.selected[req.uf_group_code] = req.uf_option_code; }); } return this.calculate(); } calculate() { let total = this.basePrice; const breakdown = []; Object.entries(this.selected).forEach(([group, code]) => { const c = this.components.find( x => x.uf_group_code === group && x.uf_option_code === code ); if (!c) return; let price = 0; if (c.uf_price_type === 'fixed') price = c.uf_base_price; if (c.uf_price_type === 'percent') price = this.basePrice * c.uf_base_price / 100; if (c.uf_price_type === 'delta') price = c.uf_base_price; total += price; breakdown.push({ group, name: c.uf_option_name, price }); }); return { basePrice: this.basePrice, totalPrice: Math.round(total), breakdown }; } } Пресеты как точка входа
Большинство пользователей не конфигурируют с нуля. Готовые пресеты служат отправной точкой с возможностью дотюнинга. Пресет со скидкой стимулирует выбрать готовый пакет вместо ручной сборки по частям. Экономия бюджета до 30% — ощутимый бонус.
function applyPreset(configurator, preset) { const options = JSON.parse(preset.uf_options_json); configurator.selected = {}; Object.entries(options).forEach(([group, code]) => { configurator.selected[group] = code; }); const result = configurator.calculate(); if (preset.uf_discount_percent > 0) { result.totalPrice = Math.round(result.totalPrice * (1 - preset.uf_discount_percent / 100)); result.presetDiscount = preset.uf_discount_percent; } return result; } Как добавить комплектацию в корзину Битрикс?
public function addToCart(int $baseProductId, array $selectedOptions): \Bitrix\Main\Result { $basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite() ); $item = $basket->createItem('catalog', $baseProductId); $item->setFields([ 'QUANTITY' => 1, 'PROPS' => [[ 'NAME' => 'Комплектация', 'CODE' => 'CONFIGURATION', 'VALUE' => json_encode($selectedOptions), ]] ]); foreach ($selectedOptions as $option) { if (!empty($option['product_id'])) { $optItem = $basket->createItem('catalog', $option['product_id']); $optItem->setFields([ 'QUANTITY' => 1, 'PRICE' => $option['price'], 'CUSTOM_PRICE' => 'Y', ]); } } return $basket->save(); } Сохранение конфигурации пользователя
Для авторизованных пользователей используем HL-блок SavedConfigurations:
$hash = md5($productId . json_encode($selectedOptions)); $existing = $SavedConfig::getList([ 'filter' => ['=UF_USER_ID' => $USER->GetID(), '=UF_HASH' => $hash] ])->fetch(); if (!$existing) { $SavedConfig::add([ 'UF_USER_ID' => $USER->GetID(), 'UF_PRODUCT_ID' => $productId, 'UF_OPTIONS' => json_encode($selectedOptions), 'UF_PRICE' => $totalPrice, 'UF_HASH' => $hash, ]); } Для гостей — sessionStorage или куки с ограниченным сроком жизни.
Пошаговая инструкция по внедрению конфигуратора
- Создать HL-блоки для опций и пресетов.
- Заполнить данные — группы, опции, их цены и зависимости.
- Внедрить JS-виджет на Bitrix Framework (или отдельный интерфейс).
- Интегрировать с корзиной через событие
OnBeforeBasketAdd. - Настроить кэширование для быстрой работы при множестве опций.
Как обеспечить масштабирование конфигуратора?
Для 100+ опций мы используем тегированное кэширование. Результаты расчетов и совместимость кэшируются по ключу configurator_{product_id}. При изменении опций кэш сбрасывается через агента. Запросы к HL-блокам индексируются по UF_PRODUCT_ID и UF_GROUP_CODE. Это гарантирует время отклика менее 100 мс даже при пиковых нагрузках.
Что входит в работу?
- Проектирование модели данных и графа зависимостей.
- Разработка frontend-виджета на Bitrix Framework.
- Интеграция с корзиной и заказами.
- Сохранение конфигураций для авторизованных и гостевых пользователей.
- Документация по API и настройке.
- Обучение администраторов работе с конфигуратором.
- Поддержка 30 дней после релиза.
Сроки разработки
| Масштаб | Описание | Срок |
|---|---|---|
| Базовый | До 5 групп опций, без зависимостей, пресеты | 5–8 дней |
| Стандартный | 5–15 групп, несовместимости, сохранение конфигурации | 2–3 недели |
| Сложный | 15+ групп, позиции в корзине, история конфигураций | 4–8 недель |
| Производственный | Интеграция с 1С для актуальных цен и остатков | 2–4 месяца |
Главный технический вызов — граф зависимостей при большом числе опций. При 50+ вариантах ручное тестирование нереально: автоматизированные тесты для логики совместимости нужны с первого дня разработки. Наши сертифицированные специалисты гарантируют качество результата. Подробнее о технологии 1С-Битрикс и конфигураторах.
Свяжитесь с нами для детального аудита вашего проекта. Мы бесплатно оценим сложность и предложим оптимальное решение.







