Калькулятор - это поле в Редакторе блока, которое открывается при клике по одноименной вкладке. В этом поле можно совершать логические или арифметические действия, выполнять функции API- запросов конструктора и доступных интеграций.

В нем можно присвоить(объявить) переменную клиента, перешедшего в данный блок, или назначить значение уже существующим переменным. Например, будет полезно при создании воронки или отслеживания источника трафика.

О работе с переменными рассказали в одноименной статье.

Коротко о главном:

При работе с калькулятором название переменной не может начинаться с цифры.
Неверно: <1_имя>
Верно: <имя_1>.

Название переменной не может состоять из двух слов, используйте для разделения символ нижнего подчеркивания "_".
Неверно: <Имя клиента>
Верно: <Имя_клиента>

Подробнее читайте в статье "Переменные".

Быстрый доступ к описаниям функций:

Как использовать калькулятор в конструкторе

При обращении к переменной не нужно использовать конструкцию #{}

Пример подсчета значения переменной в поле Калькулятор:

Переменные можно записывать просто названием или через #{}. Все переменные автоматически будут приводиться к числам с плавающей запятой.

Калькулятор поддерживает все необходимые логические и арифметические операции.

Комментарии в калькуляторе

Для комментирования текста используйте /* текст комментария */. Данное сочетание /* */ (теги) позволяют делать в калькуляторе как однострочные, так и многострочные комментарии:

Не забывайте, что комментарий нужно обязательно закрыть тегом */ на конце, поскольку иначе комментарий продолжится с новой строки:

Не забывайте ставить закрывающий тег для комментария, даже если комментарий является последней строкой поля Калькулятор:

Не располагайте комментарии друг за другом, между ними должна быть обязательно хотя бы пустая строка

Константы

"E": число Эйлера e

Поддерживаемые операторы

"+": сложение

"-"': вычитание

"*" умножение

"/": деление

"%'": остаток от деления

"^" "**": возведение в степень

"==" "!=" ">" "<" ">=" "<=": операторы сравнения

"and" "AND" "&&": логическое И

"or" "OR" "||": логическое ИЛИ

Важно! Логические условия с переменными необходимо писать в поле Переменная для сравнения**,** а не в Условие!

Например, на рисунке ниже переход по стрелке осуществится, если переменная Номер_телефона заполнена:

Важно!

Если вы сравниваете переменную со значением в кавычках, то проверьте, нет ли пробела между кавычкой и значением, иначе блок может не отработаться или отработаться некорректно!

Верно (без пробела перед кавычкой и после значения my_new_bot):

Неверно (с пробелом перед кавычкой):

Оператор IF

В калькуляторе можно прописывать условия с оператором IF:

if (score > 90) {

grade = 'отлично'

bonus = 500

} else if (score > 70) {

grade = 'хорошо'

} else {

grade = 'старайся лучше'

}

  1. Условия можно прописывать в одну строку: if (paid == 1) { status = 'ok' } else { status = 'wait' }
  2. Внутри веток — сколько угодно строк, вложенные условия и циклы.
  3. Выполняется только та ветка, чьё условие сработало. Остальные не вычисляются вообще: несуществующая переменная или ошибка в «чужой» строке больше ничего не ломает.
  4. Подстановка #{переменных} тоже происходит только в активной ветке.

Метод if(условие, если_да, если_нет) работает как раньше, но теперь вычисляется только нужная ветка: status = if(paid == 1, 'Оплачено', 'Ждём оплату: #{payment_url}')

Если paid == 1, ветка с #{payment_url} даже не подставляется — переменной может не существовать.

Циклы while и for, break и continue

i = 0
sum = 0
while (i < 10) {sum += i

i += 1

}

for (i = 0; i < 10; i += 1) {

sum += i

}

Циклы и условия можно свободно вкладывать друг в друга.

  1. break — досрочный выход из цикла
  2. continue — переход к следующей итерации:

found = -1

for (i = 0; i < arr_len(items); i += 1) {

if (items[i] == target) {

found = i

break

}

}

for (;;) { ... } — бесконечный цикл (до лимита).

Защита от зацикливания: на один блок переменных — суммарно не более 256 итераций всех циклов. При достижении лимита циклы останавливаются, блок продолжает работать дальше. Досрочный break экономит этот лимит.

Как сохраняются переменные

  1. Внутри цикла значения обновляются мгновенно: условие цикла и каждая следующая строка видят актуальные данные.
  2. Сохраняются только финальные значения — один раз, после завершения цикла (в том числе через break). Независимо от количества итераций, запишется только итог.
  3. Если внутри цикла произошла ошибка, то изменения из цикла не сохраняются вовсе. Значения итераций временные, сохранённым останется то, что было до входа в цикл.
  4. Переменная цикла for (например, i) — служебная. Живёт только внутри цикла, никогда не сохраняется и исчезает после его завершения.

Локальные переменные

Ключевое слово local создаёт служебную переменную: она работает во всех расчётах до конца блока, но никогда не сохраняется в карточку клиента, поэтому не нужно потом чистить временные tmp и buf через del.

local tmp = get(#{data}, 'items')

local count = arr_len(tmp)

if (count > 5) {

result = 'много'

}

Если у клиента есть обычная переменная с тем же именем — она останется нетронутой: local просто временно её заслонит.

Операторы += и -=

  1. counter += 1
  2. balance -= price
  3. greeting += ', привет!'

Работают с числами и строками (для строк += — приклеивание), в любом месте блока.

Переносы строк и JSON без кавычек

Длинное выражение больше не обязано помещаться в одну строку — раньше перенос ломал блок, что являлось частой ошибкой при работе с калькулятором.

Теперь вызов функции можно переносить — просто разрывайте строку после запятой между аргументами:

Словари и массивы пишутся без обёртки в кавычки и на сколько угодно строк:

cfg = {

"greeting": "Здравствуйте!",

"work_hours": [10, 19]

}

hello = cfg["greeting"]

Единственное ограничение: внутри текста в кавычках ('...') разрывать строку нельзя. Переносите после запятой между аргументами или внутри {фигурных} и [квадратных] скобок — там можно разрывать где угодно.

Проверка ИИ

Любые строки калькулятора можно проверить с помощью ИИ, который подскажет все проблемы и ошибки при использовании методов, функций, операторов и циклов.