Рубрика:

Опубликовано:

02.10.2026

Изменено:

02.10.2026

Поля и формулы калькулятора: полный справочник

02.10.2026

В «Конструкторе калькуляторов» цену считают формулы, которые вы пишете сами: по именам полей, с условиями, округлениями, ступенчатыми ценами и аннуитетом. Здесь собран полный справочник: какие бывают поля и чему они равны в формуле, как писать выражения, какие есть функции, как оформить итог, готовые примеры для разных ниш и как устроен пересчёт итога в заявке. Кнопки редактора описаны в инструкции «Как сделать калькулятор для сайта».

Как устроен расчёт

Калькулятор состоит из трёх частей. Поля заполняет посетитель. Формулы превращают значения полей в деньги, сроки или любые другие числа. Одна из формул назначается итогом, остальные могут быть строками сметы или промежуточными расчётами. Формулы ссылаются на поля и друг на друга по именам, порядок в списке не важен: калькулятор сам вычислит их в нужной последовательности. Нельзя только замкнуть формулы в круг, например 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.

Настройки поля «Санузлы под ключ» с условием показа kind.id == 'major'
Поле показывается, только если выбран капитальный ремонт

Три правила условий:

  • скрытое условием поле в формулах равно 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
7notnot rush.on
8andkm > 5 and km <= 15
9orkind.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 ^ ypow(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, [[порог, цена], …])Ступенчатая цена: значение последней строки, чей порог не больше xtier(25, [[0, 500], [20, 450], [50, 400]]) → 450
progressive(x, [[порог, ставка], …])Прогрессивная шкала: каждая часть x по своей ставкеprogressive(150000, [[0, 0.13], [100000, 0.15]]) → 20 500
has(поле, 'имя')1, если вариант отмечен (или выбран), иначе 0has(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, вебхук».

Формулы видны в коде страницы

Чтобы считать мгновенно, калькулятор передаёт в браузер всё своё устройство: поля, значения вариантов, скрытые константы и формулы. Любой посетитель может их увидеть. Не храните в калькуляторе то, что нельзя показывать: закупочные цены, наценку, внутренние коэффициенты. Если такая наценка всё же нужна, заложите её сразу в цены вариантов.

Другие статьи о калькуляторе

Поделиться

Попробуйте виджеты для сайта бесплатно!