В «Конструкторе калькуляторов» цену считают формулы, которые вы пишете сами: по именам полей, с условиями, округлениями, ступенчатыми ценами и аннуитетом. Здесь собран полный справочник: какие бывают поля и чему они равны в формуле, как писать выражения, какие есть функции, как оформить итог, готовые примеры для разных ниш и как устроен пересчёт итога в заявке. Кнопки редактора описаны в инструкции «Как сделать калькулятор для сайта».
Как устроен расчёт
Калькулятор состоит из трёх частей. Поля заполняет посетитель. Формулы превращают значения полей в деньги, сроки или любые другие числа. Одна из формул назначается итогом, остальные могут быть строками сметы или промежуточными расчётами. Формулы ссылаются на поля и друг на друга по именам, порядок в списке не важен: калькулятор сам вычислит их в нужной последовательности. Нельзя только замкнуть формулы в круг, например a = b + 1 и b = a * 2.
Пересчёт идёт при каждом изменении поля, прямо в браузере посетителя. Тем же движком считает карточка «Проверка расчёта» в редакторе и сервер при приёме заявки, поэтому цифры везде совпадают.
Типы полей
| Тип | Значение в формуле | Свойства | Настройки |
|---|---|---|---|
| «Число» | Введённое число | нет | «Минимум», «Максимум», «Шаг», «По умолчанию», «Единица» |
| «Ползунок» | Выбранное число | нет | То же, что у числа; рядом с ползунком есть поле ручного ввода |
| «Количество ±» | Целое число | нет | То же; шаг и границы целые |
| «Выбор варианта» | «Значение (цена, коэфф.)» выбранного варианта | .value, .id, .index | Варианты, «Вид»: «Карточки», «Список», «Сегменты»; можно «Без выбора по умолчанию» |
| «Выпадающий список» | Значение выбранного варианта | .value, .id, .index | Варианты; что-то выбрано всегда, без умолчания первый вариант |
| «Опции (несколько)» | Сумма значений отмеченных опций | .sum, .count, функция has() | Варианты, «Вид»: «Карточки» или «Список», отмеченные по умолчанию |
| «Переключатель» | «Значение во включённом состоянии» или 0 | .on: 1 или 0 | «Значение во включённом состоянии», «Включён по умолчанию» |
| «Дата» | Номер дня (для функций дат) | нет | «По умолчанию», «Не раньше», «Не позже» в днях от сегодня |
| «Период дат» | Число дней между началом и концом | .from, .to, .days, .nights | «Начало по умолчанию», «Не раньше», «Не позже», «Длительность по умолчанию», «Мин. длительность», «Макс. длительность», «Единица» (пусто: «ночи») |
| «Скрытая константа» | Заданное «Значение» | нет | Посетитель её не видит |
| «Инфоблок» | В формулах не участвует | Заголовок и текст для пояснений | |
| «Раздел / шаг» | В формулах не участвует | Заголовок раздела; в макете «По шагам» начинает новый шаг | |
У всех полей, кроме константы, есть «Подсказка под подписью» и «Условие показа». В калькуляторе может быть до 40 полей, в поле выбора до 30 вариантов, формул до 30.
У каждого варианта выбора четыре колонки: «Вариант» (что видит посетитель), «Значение (цена, коэфф.)», «Пояснение» и «Имя». Значение участвует в формулах: это может быть цена (35000) или коэффициент (1.15). Имя варианта нужно для сравнений вида material.id == 'gloss' и функции has(): латиница в нижнем регистре, цифры и знак подчёркивания.
Значения полей калькулятор держит в заданных границах: число больше максимума станет максимумом, дробное количество округлится до целого. Посетитель может вводить дробные числа с запятой.
Имена полей и формул
Имя пишется в поле «Имя в формулах» (у формулы в поле «Имя формулы») и подчиняется правилам:
- латинские буквы, цифры и
_, первым символом буква, до 32 символов; - имя уникально среди всех полей и формул калькулятора;
- нельзя занимать названия функций (
if,round,days…) и словаand,or,not,true,false; - регистр не важен:
Areaиareaв формуле одно и то же.
Новое имя редактор придумывает сам из подписи поля транслитерацией, например «Площадь» превращается в ploschad. Короткие английские имена (area, rooms, rush) читать проще, их стоит задать вручную в самом начале. При переименовании поля или формулы все формулы и условия показа обновляются автоматически.
С именами вариантов так же: если поменять «Имя» варианта, редактор сам заменит его в формулах и условиях показа с этим полем, например в has(kind, 'old') и kind.id == 'old'. Если же в формуле или условии указан вариант, которого у поля нет (опечатка или вариант удалён), редактор покажет ошибку: «Нет варианта «…»» для has() и «Сравнение с вариантом, которого нет у поля» для kind.id == '…'. Пока ошибка не исправлена, калькулятор не сохранится.
Скрытые константы
«Скрытая константа» хранит число, которое участвует в расчёте, но не видно посетителю как поле: ставку за час, наценку, курс, стоимость выезда. Когда цена меняется, вы правите одну константу, а не все формулы. Учтите, что константа не секрет: она передаётся в браузер вместе с формулами (подробнее в разделе о заявке ниже).
Условия показа
В блоке «Условие показа» у поля пишется логическое выражение: поле видно, только когда оно истинно. Пустое условие означает «показывать всегда». Писать руками не обязательно: под строкой есть конструктор из трёх списков (поле, условие, значение) и кнопка «Добавить условие». Для выбора доступны условия «выбран» и «не выбран», для опций «отмечен», «не отмечен» и «отмечено хоть что-то», для переключателя «включён» и «выключен», для чисел сравнения. Несколько условий соединяются через and.

Три правила условий:
- скрытое условием поле в формулах равно 0, его свойства тоже 0, а
.idпустой; - если скрыт «Раздел / шаг», скрыты и все поля после него до следующего раздела;
- в условиях можно ссылаться только на поля, не на формулы.
Примеры: delivery.on, kind.id == 'regular', has(extras, 'cornice'), extras.count > 0, delivery.on and km > 10.
Синтаксис формул
Числа, строки и имена
Числа пишутся с точкой: 0.5, 1.15, можно 1e3. Запятая в формулах разделяет аргументы функций. Строки берутся в одинарные или двойные кавычки, до 64 символов, и нужны только для сравнения имён вариантов. Слова true и false равны 1 и 0. Свойство поля пишется через точку: extras.count.
Если копируете формулу из текста, знаки × ÷ − ≤ ≥ ≠ распознаются автоматически. Одиночное = понимается как ==, <> как !=, а &&, ||, ! как and, or, not.
Операторы и приоритет
| Приоритет | Оператор | Пример |
|---|---|---|
| 1, выше всех | скобки ( ), вызов функции | (2 + 3) * 4 = 20 |
| 2 | ^ степень, справа налево | 2 ^ 3 ^ 2 = 512, 2 ^ -1 = 0,5 |
| 3 | унарный минус и плюс | -2 ^ 2 = −4 |
| 4 | * / % (остаток) | 10 % 3 = 1, -7 % 3 = −1 |
| 5 | + - | 2 + 3 * 4 = 14 |
| 6 | сравнения == != < <= > >= | area > 50 даёт 1 или 0 |
| 7 | not | not rush.on |
| 8 | and | km > 5 and km <= 15 |
| 9 | or | kind.id == 'a' or kind.id == 'b' |
| 10, ниже всех | усл ? да : нет | area > 50 ? 400 : 450 |
Два сравнения подряд писать нельзя: вместо 5 < km <= 15 пишите km > 5 and km <= 15. Сравнения и логика возвращают 1 (истина) или 0 (ложь), поэтому их можно умножать: (area > 100) * 5000 добавит 5000 только для больших площадей. Истинным считается любое ненулевое число и любая непустая строка.
Условия: if, ?: и ifs
if(условие, если да, если нет):if(rush.on, base * 0.3, 0);условие ? если да : если нет: то же короче, можно вкладывать:a ? 1 : b ? 2 : 3;ifs(усл1, знач1, усл2, знач2, …, иначе): цепочка условий, берётся первое истинное. Последнее значение без условия работает как «иначе». Если «иначе» нет и ни одно условие не выполнилось, результат будет «—».
Функции
| Функция | Что делает | Пример → результат |
|---|---|---|
min(a, b, …), max(a, b, …) | Наименьшее и наибольшее из значений | max(0, pages - 5): 8 страниц → 3 |
sum(a, b, …), avg(a, b, …) | Сумма и среднее | avg(1, 2, 3, 4) → 2,5 |
abs(x) | Модуль числа | abs(-5) → 5 |
sqrt(x) | Квадратный корень, для отрицательного «—» | sqrt(16) → 4 |
pow(x, y) | Степень, то же, что x ^ y | pow(2, 10) → 1024 |
clamp(x, от, до) | Удерживает число в границах | clamp(15, 0, 10) → 10 |
round(x, знаков) | Округление до знаков после запятой; отрицательное число знаков округляет до десятков, сотен, тысяч | round(1234567, -3) → 1 235 000 |
ceil(x, шаг), floor(x, шаг) | Вверх или вниз до кратного шагу, без шага до целого | ceil(13, 5) → 15, floor(1234, 100) → 1200 |
roundto(x, шаг) | К ближайшему кратному шагу | roundto(1234, 50) → 1250 |
tier(x, [[порог, цена], …]) | Ступенчатая цена: значение последней строки, чей порог не больше x | tier(25, [[0, 500], [20, 450], [50, 400]]) → 450 |
progressive(x, [[порог, ставка], …]) | Прогрессивная шкала: каждая часть x по своей ставке | progressive(150000, [[0, 0.13], [100000, 0.15]]) → 20 500 |
has(поле, 'имя') | 1, если вариант отмечен (или выбран), иначе 0 | has(extras, 'seo') |
days(дата1, дата2), nights(заезд, выезд) | Дней между датами | days(today(), visit) |
weekday(дата) | День недели: 1 понедельник … 7 воскресенье | weekday(day) == 5 |
isweekend(дата) | 1 в субботу и воскресенье | if(isweekend(day), base * 0.1, 0) |
today() | Сегодняшняя дата | days(today(), day) |
pmt(ставка, периодов, сумма, остаток) | Аннуитетный платёж за период; остаток необязателен | pmt(21.9 / 100 / 12, 24, 500000) → 25 914,39 |
if, ifs | Условия, см. выше | |
У min, max, sum и avg может быть до 60 аргументов, в том числе списки в квадратных скобках. Если любой аргумент равен «—», результат тоже «—».
Округления
Функция round округляет половину от нуля: round(2.5) = 3, round(-2.5) = −3. Число знаков от −9 до 9: round(x, 2) до копеек, round(x, -2) до сотен. Шаг в ceil, floor и roundto может быть дробным: ceil(2.3, 0.5) = 2,5. Это удобно для материалов, которые продаются целыми единицами: рулонов обоев на 40 м² стен при рулоне 5,3 м² и запасе 10 % нужно ceil(area / 5.3 * 1.1) = 9.
Внутри калькулятор считает с точностью до 15 значащих цифр, поэтому 0.1 + 0.2 даёт ровно 0,3. Число знаков в итоге задаётся отдельно, в настройке «Знаков после запятой».
Ступенчатые и прогрессивные цены
tier подходит для скидки от объёма: чем больше единиц, тем ниже цена за каждую. Таблица пишется списком пар [порог, значение], строки сортируются сами. Первый порог лучше ставить 0 или минимум поля: если x меньше всех порогов, результат «—». Можно писать и плоским списком: [0, 500, 20, 450].
progressive считает как прогрессивный налог: часть до второго порога по первой ставке, часть выше по второй и так далее. В примере выше 100 000 × 0,13 + 50 000 × 0,15 = 20 500.
Множественный выбор и переключатели
Поле «Опции (несколько)» в формуле равно сумме значений отмеченных опций, это же .sum. .count показывает, сколько опций отмечено, а has(extras, 'crm') проверяет конкретную опцию. Так можно давать скидку за пакет: if(extras.count >= 3, extras.sum * 0.9, extras.sum). Если значения опций указаны «за м²», умножьте сумму на площадь: area * works.sum.
Поле выбора равно значению выбранного варианта, .id даёт его имя, .index его номер с единицы. Если у «Выбора варианта» нет выбора по умолчанию и посетитель ничего не выбрал, поле равно 0. Переключатель равен своему значению, когда включён, и 0, когда выключен. Удобный приём: поставить значение 1 и использовать как множитель, или проверять rush.on в if.
Даты
Дата в формуле хранится как номер дня, поэтому даты можно вычитать: days(today(), day) показывает, сколько дней осталось до выбранной даты. У поля «Период дат» есть .days (оно же .nights, число дней между началом и концом), а также .from и .to. Выходные определяет isweekend(), день недели weekday().
Деление на ноль, пустые значения и ошибки
Деление на ноль, корень из отрицательного числа, pmt с нулём периодов и другие невозможные вычисления не ломают калькулятор: формула получает значение «—», и оно же показывается в итоге, если от этой формулы итог зависит. Чтобы этого не было, защищайтесь условием: if(people > 0, total / people, 0).
Ошибки записи редактор ловит до сохранения. Самые частые:
| Текст ошибки | Что не так |
|---|---|
| «Нет поля или формулы с именем «…»» | Опечатка в имени или поле удалено |
| «У поля нет свойства «…»» | Например, .sum у ползунка: свойства есть только у выбора, опций, переключателя и периода |
| «Формула оборвана — не хватает числа, поля или скобки» | Формула заканчивается знаком или незакрытой скобкой |
| «Ожидалось «…»», «Лишнее «…»» | Не хватает скобки или запятой, либо есть лишний символ |
| «Неизвестная функция «…»», «Неверное число аргументов у …()» | Функции нет в списке выше или у неё не то число аргументов |
| «Два сравнения подряд: используйте and» | Запись вида 1 < x < 5 |
| «Формулы ссылаются друг на друга по кругу: …» | Цикл между формулами, в тексте показана цепочка |
| «В условии показа можно ссылаться только на поля, не на формулы» | Условие поля использует формулу |
| «Нет варианта «…»» | В has() указано имя, которого нет у поля |
| «Сравнение с вариантом, которого нет у поля: …» | В сравнении вида kind.id == '…' имя варианта с опечаткой или вариант удалён |
| «Выберите формулу итога» | Итог не назначен |
Длина одной формулы до 1000 символов, вложенность скобок до 40 уровней.
Несколько формул, смета и итог
Удобнее держать расчёт в нескольких коротких формулах, чем в одной длинной: каждую видно в «Проверке расчёта», а отмеченные «в смете» показываются строками разбивки под итогом. У формулы есть «Единица»: пустая означает валюту итога, но можно указать «дн.», «%», «м²», и строка сметы покажет срок или процент вместо рублей.
В блоке «Итог» карточки «Формулы и итог» настраивается, как показывать результат:
| Настройка | Что делает |
|---|---|
| «Формула итога», «Подпись итога» | Какая формула главная и как она подписана («Стоимость ремонта», «Платёж в месяц») |
| «Валюта» | ₽, ₽/мес., $, €, «без валюты» или «своя…» до 12 символов |
| «Знаков после запятой» | 0, 1 или 2. Разряды разделяются пробелом, дробь запятой: «12 500 ₽», «1 250,50 ₽»; нулевая дробь не показывается |
| «Перед суммой» | Слово перед числом, например «от»: «от 12 500 ₽» |
| «Минимальный заказ» | Меньший итог заменяется этой суммой с пометкой «Минимальная сумма заказа» |
| «Старая цена (зачёркнутая)» | Формула цены без скидки; видна зачёркнутой с процентом, если больше итога |
| «Показывать смету», «Показывать нулевые строки» | Разбивка из формул с отметкой «в смете»; нулевые строки по умолчанию скрыты |
| «Вилка «от — до» вместо точной суммы» | «От: минус, %» (по умолчанию 10), «До: плюс, %» (15), «Округлять до» (например, 1000): итог показывается диапазоном с подписью «Ориентировочно» |
| «Уровни по сумме» | До 6 уровней: метка и шкала под итогом («Эконом / Стандарт / Премиум»); последний уровень без верхней границы |
| «Примечание под итогом» | По умолчанию «Расчёт предварительный и не является публичной офертой.» |
Готовые примеры формул
Все примеры можно вставить в свой калькулятор, заменив имена полей. Цифры в скобках посчитаны тем же движком, что работает на сайте.
Ремонт за квадратный метр
Поля: area (ползунок, м²), kind (выбор: косметический 3500, капитальный 7500, дизайнерский 12000), house (выбор: новостройка 1, вторичка 1.15), works (опции за м²: электрика 900, тёплый пол 1200).
labour = area * kind * house extra = area * works.sum total = ceil(labour + extra, 1000)
54 м², капитальный ремонт во вторичке с заменой электрики: 465 750 + 48 600, итог округлён вверх до тысяч, 515 000 ₽. В заготовке «Ремонт квартиры за м²» к этому добавлены санузлы, черновые материалы, срок работ в днях и «Минимальный заказ».
Доставка по зонам
Поля: km (ползунок), weight (число, кг), order (сумма заказа).
zone = ifs(km <= 5, 300, km <= 15, 500, km <= 30, 800, 800 + (km - 30) * 30) total = if(order >= 5000, 0, zone + max(0, weight - 5) * 40)
42 км, 8 кг, заказ на 3000 ₽: 1160 за зону и 120 за лишние 3 кг, итог 1280 ₽. От 5000 ₽ доставка бесплатная. Если зон немного, проще сделать «Выбор варианта» с ценой зоны в значении варианта.
Кредит или рассрочка с аннуитетом
Поля: amount (сумма), months (срок), rate (ставка, % годовых; константа или выбор программы).
pay = pmt(rate / 100 / 12, months, amount) monthly = round(pay) over = round(pay * months - amount)
500 000 ₽ на 24 месяца под 21,9 %: платёж 25 914 ₽, переплата 121 945 ₽. При нулевой ставке pmt просто делит сумму на число месяцев: pmt(0, 12, 120000) = 10 000. Для финансовых калькуляторов оставьте в примечании, что расчёт не оферта, а полная стоимость кредита и условия указываются в договоре: так сделано в заготовке «Кредит и рассрочка».
Тариф с годовой скидкой
Поля: users (количество ±), plan (выбор: базовый 990, команда 2490), yearly (переключатель «Оплата за год»).
total = users * plan * if(yearly.on, 0.8, 1) year = if(yearly.on, total * 12, 0)
Пять пользователей на базовом тарифе с оплатой за год: 3960 в месяц (валюта итога «₽/мес.»), строка сметы «За год» 47 520 ₽. Цену без скидки users * plan можно вынести в отдельную формулу и выбрать её в «Старая цена (зачёркнутая)».
Скидка от объёма
Цена за единицу падает с тиражом:
total = qty * tier(qty, [[1, 500], [10, 450], [50, 400]])
30 штук по 450 ₽: 13 500 ₽. Скидка процентом от суммы:
discount = tier(qty, [[1, 0], [10, 5], [50, 10], [100, 15]]) total = price * qty * (1 - discount / 100)
60 штук по 120 ₽ со скидкой 10 %: 6480 ₽.
Аренда по дням со скидкой за срок
Поля: item (выбор, цена в сутки), count (количество), dates (период дат).
k = tier(dates.days, [[1, 1], [3, 0.9], [7, 0.8]]) rent = item * count * dates.days * k
Сапборд за 1500 ₽ в сутки на неделю: 8400 ₽ со скидкой 20 %. Так устроена заготовка «Аренда с доставкой».
Натяжной потолок с опциями
Поля: area, material (выбор, цена за м²), corners, lights, perimeter, extras (опции, среди них cornice).
total = ceil(area * material + max(0, corners - 4) * 250 + lights * 450
+ if(has(extras, 'cornice'), perimeter * 900, 0), 100)
18 м² по 650 ₽, 6 углов, 4 светильника, карниз на 17 м: 29 300 ₽. Четыре угла входят в цену, платными считаются только лишние.
Заявка с пересчётом
Режим «точная сумма после заявки»
В карточке «Заявка» есть отметка «Точная сумма и смета — только после заявки». Пока посетитель не отправил заявку, вместо суммы он видит вилку, а строки сметы размыты, под ними надпись «Точная сумма и смета — после заявки». Если вилка в итоге не настроена, калькулятор показывает диапазон от −10 до +15 % от итога, округлённый до сотен. После отправки появляются точная сумма и смета.

Это мягкий приём, а не защита. Формулы выполняются в браузере, и разбирающийся человек найдёт точную сумму в коде страницы. Включайте режим, если вам важнее собрать контакты, чем сразу показать цену, и помните, что часть посетителей уйдёт, не увидев суммы.
Сервер пересчитывает итог сам
Когда посетитель отправляет заявку, браузер передаёт только значения полей. Сервер берёт сохранённый калькулятор и считает итог и все строки тем же движком (его точной копией на PHP). Строки, которые прислал браузер, отбрасываются, кроме комментария посетителя. Поэтому подменить сумму в заявке нельзя: если кто-то поменяет итог на странице, в заявку попадёт правильный.
Если итог, который видел посетитель, расходится с пересчитанным (например, вы поменяли цены, пока у клиента была открыта страница), в заявке появляется строка «Проверка» с текстом «Посетитель видел … ; итог выше пересчитан сервером». Даты в формулах сервер считает по дате посетителя, если она отличается от московской не больше чем на сутки.
Что приходит в заявке
В разделе «Заявки», в письме и в Telegram заявка калькулятора состоит из строк:
- «Калькулятор»: заголовок калькулятора;
- видимые поля с подписями: числа с единицами, названия выбранных вариантов, «Да» или «Нет» для переключателя, даты в виде 02.10.2026, период с числом дней. Поля, скрытые условием, и константы не передаются;
- строки сметы из формул с отметкой «в смете» (нулевые только при «Показывать нулевые строки»);
- итог с подписью; при вилке в скобках диапазон, при срабатывании минимума пометка «минимальный заказ»;
- «Уровень», если настроены уровни по сумме, и комментарий посетителя.

На вебхук вместе с этими строками уходит поле payload с объектом calc: значения полей, результаты всех формул, итог, вилка, итог из браузера и признак расхождения. Как подключить вебхук, рассказано в статье «Заявки из новых виджетов: раздел «Заявки», почта, Telegram, вебхук».
Формулы видны в коде страницы
Чтобы считать мгновенно, калькулятор передаёт в браузер всё своё устройство: поля, значения вариантов, скрытые константы и формулы. Любой посетитель может их увидеть. Не храните в калькуляторе то, что нельзя показывать: закупочные цены, наценку, внутренние коэффициенты. Если такая наценка всё же нужна, заложите её сразу в цены вариантов.
Другие статьи о калькуляторе
- «Как сделать калькулятор для сайта: пошаговая инструкция»
- «Калькулятор: настройка дизайна и шаблоны»
- «Цели Яндекс Метрики новых виджетов»: цели
aw_calc_interact,aw_calc_leadиaw_calc - Демо и возможности на странице «Конструктор калькуляторов»