Разработка модуля калькулятора услуг 1С-Битрикс
Калькулятор услуг — инструмент конверсии. Пользователь вводит параметры (площадь, количество, сроки, опции), получает мгновенную стоимость и отправляет заявку. Правильно сделанный калькулятор увеличивает конверсию: клиент понимает ценообразование, не боится неожиданных сумм.
Готовых решений в маркетплейсе Битрикс практически нет, либо они слишком простые. Для серьёзного бизнеса — страховой компании, строительного подрядчика, типографии — нужен модуль с гибкой формулой и интеграцией с CRM.
Что должен уметь модуль
- Несколько независимых калькуляторов на одном сайте (для разных услуг)
- Многошаговый ввод параметров
- Сложные формулы с условиями (
if площадь > 100, то скидка 10%) - Зависимые поля (выбор одного поля меняет список опций в другом)
- Привязка к ценам из торгового каталога Битрикс (
b_catalog_price) - Отправка заявки с расчётом в CRM как лид или сделка
- Пересчёт в реальном времени без перезагрузки страницы
Структура данных
Модуль vendor.calculator со следующими таблицами:
-
b_vendor_calc_calculator— калькуляторы: id, name, slug, config (JSON полей и шагов), formula (JSON дерево вычислений), crm_target (lead/deal), is_active -
b_vendor_calc_field— поля калькулятора: id, calculator_id, type, name, label, options (JSON), depends_on, validation_rules, sort -
b_vendor_calc_result— сохранённые расчёты: id, calculator_id, session_id, user_id, params (JSON), result (JSON суммы), created_at -
b_vendor_calc_lead— связь расчёта с лидом/сделкой CRM: result_id, crm_type, crm_id
Типы полей
Поддерживаемые типы полей калькулятора:
-
number— числовое поле с min/max/step -
slider— ползунок с диапазоном -
select— выпадающий список с привязкой коэффициентов -
checkbox— флаг с добавочной стоимостью -
radio— выбор одного варианта -
area— двумерный ввод (ширина × высота) -
catalog_product— выбор товара из инфоблока с автоподстановкой цены
Движок формул
Формула хранится в JSON-структуре, которая интерпретируется на стороне сервера (PHP) и на стороне клиента (JavaScript). Синхронность критична: итоговая сумма в интерфейсе должна совпадать с суммой в CRM.
Пример формулы для расчёта ремонтных работ:
{
"type": "add",
"operands": [
{
"type": "multiply",
"operands": [
{"type": "field", "name": "area"},
{"type": "field", "name": "work_type_price"}
]
},
{
"type": "if",
"condition": {"type": "gt", "left": {"type": "field", "name": "area"}, "right": 100},
"then": {"type": "multiply", "operands": [{"type": "ref", "name": "subtotal"}, -0.1]},
"else": 0
}
]
}
PHP-интерпретатор FormulaEvaluator::evaluate($formula, $fieldValues) рекурсивно обходит дерево и вычисляет итог.
JavaScript-часть
На фронтенде — реактивный пересчёт. При изменении любого поля:
- Собираются текущие значения всех полей
- Локальная копия формулы вычисляется в JS (та же логика, что на PHP)
- Результат мгновенно обновляется в интерфейсе
- Дополнительно: AJAX-запрос на сервер для точного расчёта с учётом актуальных цен из БД
// Пересчёт при изменении поля
document.querySelectorAll('.calc-field').forEach(field => {
field.addEventListener('change', () => {
const values = collectFieldValues();
const localResult = evaluateFormula(calculatorConfig.formula, values);
updateResultDisplay(localResult);
debounce(() => fetchServerResult(values), 500)();
});
});
Зависимые поля
Зависимость описывается в конфигурации поля:
{
"name": "material_type",
"type": "select",
"depends_on": {
"field": "work_type",
"map": {
"painting": ["latex", "acrylic", "oil"],
"wallpaper": ["paper", "vinyl", "non-woven"],
"tile": ["ceramic", "porcelain", "mosaic"]
}
}
}
При выборе work_type = 'painting' список материалов фильтруется до ["latex", "acrylic", "oil"]. Логика работает и на клиенте, и проверяется на сервере при отправке формы.
Отправка в CRM
После завершения расчёта пользователь заполняет контактные данные и отправляет заявку. Модуль создаёт лид или сделку:
$leadFields = [
'TITLE' => 'Расчёт из калькулятора: ' . $calculator['NAME'],
'NAME' => $formData['name'],
'PHONE' => [['VALUE' => $formData['phone'], 'VALUE_TYPE' => 'WORK']],
'EMAIL' => [['VALUE' => $formData['email'], 'VALUE_TYPE' => 'WORK']],
'COMMENTS' => $this->buildCalculatorComment($result),
'UF_CALC_SUM' => $result['total'],
'SOURCE_ID' => 'CALCULATOR',
];
$leadId = \Bitrix\Crm\LeadTable::add($leadFields)->getId();
Параметры расчёта записываются в комментарий лида и в пользовательское поле UF_CALC_PARAMS (JSON).
Сроки разработки
| Этап | Срок |
|---|---|
| Архитектура, таблицы, инсталлятор | 1 день |
| Конструктор полей и конфигуратор | 2 дня |
| Движок формул PHP + JS | 3 дня |
| Зависимые поля, реактивный пересчёт | 2 дня |
| Интеграция с ценами каталога | 1 день |
| Отправка в CRM | 1 день |
| Административный интерфейс | 2 дня |
| Компонент для размещения на странице | 1 день |
Итого: 13 рабочих дней. Нестандартные формулы с внешними справочниками (тарифные сетки, региональные коэффициенты) — +2-3 дня.







