База знаний GetMyBot

Формулы

Два языка формул: короткие выражения {{= }} и расширенная формула с функциями и русскими алиасами, действие «Вычисление» и тестер.

На этой странице

В GetMyBot два языка формул, и у каждого своё место:

  • Выражения: короткий язык для арифметики, сравнений и простых строк. Работает в {{= выражение}} прямо в тексте, в режиме «Формула» действия «Вычисление» и в условиях таблицы решений.
  • Расширенная формула: полный язык в духе электронных таблиц с десятками функций (списки, JSON, даты, хэши, LAMBDA) и русскими названиями функций. Работает в режиме «Расширенная формула» действия «Вычисление», в проверке ответа по формуле и в тестере.

Функции расширенной формулы внутри {{= }} не работают: {{= ОКРУГЛ(total) }} не вычислится, и в тексте останется сама конструкция. Для таких расчётов посчитайте значение действием «Вычисление» и подставьте результат через {{ctx.ключ}}.

Где работают формулы

ГдеЯзык
{{= выражение}} в тексте сообщениявыражения
«Вычисление», режим «Формула» (expr)выражения
«Вычисление», режим «Таблица решений» (rules)выражения в условиях «когда»; «тогда» и значение по умолчанию – обычный текст с подстановками {{...}}
«Вычисление», режим «Расширенная формула» (formula)расширенная формула
Проверка ответа «Соответствует формуле»расширенная формула
Тест формулы (test_formula)расширенная формула

Действие «Вычисление»

У действия три режима, в одном действии выбирается ровно один:

  • Формула (expr): одно выражение.
  • Таблица решений (rules + default): список правил «когда → тогда». Возвращается значение первого правила, чьё условие истинно, иначе значение по умолчанию.
  • Расширенная формула (formula): формула на полном языке.

Результат сохраняется в ctx (поле «Сохранить в ctx», save_to_ctx) и/или в параметр подписчика («Сохранить в параметр», save_to_param): нужно указать хотя бы одно. Ограничения: выражение, условие и значение правила – до 4096 байт, расширенная формула – до 16384 байт (буква кириллицы занимает 2 байта), не больше 64 правил.

Пример параметров действия с расширенной формулой:

{"type":"compute","params":{"formula":"IF({total} > 1000; \"опт\"; \"розница\")","save_to_ctx":"segment"}}

Выражения

Синтаксис

  • Операторы: арифметика + - * / %, сравнения == != < > <= >=, логика && || !, тернарный условие ? да : нет, скобки ( ).
  • Литералы: числа (42, 3.14), строки в кавычках ("привет" или 'привет'), логические (true, false).
  • Данные: имя пишется без фигурных скобок и ищется в параметрах подписчика и ctx: price * qty, ctx.total, param.total. Неизвестное имя даёт пустую строку.
  • Вызов функции: имя(аргумент1, аргумент2), аргументы через запятую.

Функции

Только эти, и только строчными буквами: len, upper, lower, trim, concat, round, floor, ceil, abs, min, max. min и max принимают ровно два аргумента, concat – любое число. len и LEN в расширенной формуле считают символы так, как их видит читатель: буква с ударением, флаг или эмодзи из нескольких кодовых точек (например, семья 👨‍👩‍👧‍👦) – это один символ.

Русских алиасов в выражениях нет. Если в {{= }} встретилась неизвестная функция, конструкция остаётся в тексте без изменений.

Расширенная формула

Синтаксис

  • Аргументы разделяются точкой с запятой: IF({total} > 1000; "опт"; "розница").
  • Операторы: арифметика + - * /, склейка строк &, сравнения = != <> < > <= >= (равенство – одинарный =). Логика – функциями AND, OR, NOT.
  • Строки в двойных или одинарных кавычках. "" внутри строки не означает кавычку: если кавычка нужна внутри текста (например, в HTML-атрибуте), возьмите кавычки другого вида: "<a href='tg://user?id=" & r.user_id & "'>профиль</a>".
  • Данные подставляются в одинарных фигурных скобках: {ключ} – значение из ctx (а также {text} или {answer} – текст входящего сообщения), {user:ключ} – параметр подписчика, {global:ключ} – глобальный параметр бота.
  • LAMBDA: LAMBDA(r; выражение) задаёт функцию для FILTER, FOREACH, ARRAYFIND и REDUCE. Поля JSON-объекта читаются через точку: r.user_id.
  • Результат превращается в текст. Список сохраняйте через TOJSON, а в следующей формуле читайте через FROMJSON.
  • Имена функций не зависят от регистра и понимают русские алиасы.

Функции

Имена даны в каноничном (английском) виде; в скобках: русский алиас, если он есть. Эти функции доступны только в расширенной формуле.

Математика

SUM (СУММ), AVERAGE (СРЗНАЧ), MAX (МАКС), MIN (МИН), MOD (ОСТАТ), POW (СТЕПЕНЬ), SQRT (КОРЕНЬ), PI (ПИ), ROUND (ОКРУГЛ), CEIL (ОКРВВЕРХ), FLOOR (ОКРВНИЗ), TRUNC (ОТБР), ABS, RANDBETWEEN (СЛУЧМЕЖДУ).

Текст

LEN (ДЛСТР), LEFT (ЛЕВСИМВ), RIGHT (ПРАВСИМВ), MID (ПСТР), LOWER (СТРОЧН), UPPER (ПРОПИСН), UPPERFIRST (ПРОПИСНПЕРВ), REPEAT (ПОВТОР), CONCAT (СЦЕПИТЬ), SUBSTITUTE (ПОДСТАВИТЬ), FIND (НАЙТИ), SEARCH (ПОИСК), FIELD (ПОЛЕ), TRIM, LTRIM, RTRIM, PADLEFT, PADRIGHT, SPLIT, JOIN, STARTSWITH, ENDSWITH, CONTAINS, NL.

Логика

IF (ЕСЛИ), AND (И), OR (ИЛИ), NOT (НЕ), EMPTY, ISNUMBER (ЕЧИСЛО), COALESCE.

Списки

SORT, RSORT, UNIQUE, FILTER, FOREACH, REDUCE, INDEX, SLICE, COUNTA (СЧЁТЗ), COUNTUNIQUE, ARRAYADD, ARRAYREMOVE, ARRAYREPLACE, ARRAYFIND.

Дата и время

TODAY (СЕГОДНЯ), NOW (ТДАТА), DATEADD, DATESUB, DATEDIF (РАЗНДАТ), DATEFORMAT, DATEVALUE, WEEKDAY (ДЕНЬНЕД).

JSON

TOJSON, FROMJSON, JSONPATH, JP, JSONOBJECT, JSONARRAY, KEYS, VALUES.

Криптография и кодирование

HASH (ХЭШ), TOBASE64, FROMBASE64, FROMJWT, FROMJWK.

Параметры

PARAMID, PARAMREPLACE, PARAMREMOVE.

Примеры

Выражения в тексте:

  • Сумма заказа: {{= price * qty}}.
  • Треть суммы с округлением: {{= round(total / 3)}}.
  • Условие: {{= param.total > 1000 ? "опт" : "розница"}}.
  • Сборка строки: {{= concat("Заказ №", ctx.order_id)}}.

Расширенная формула в действии «Вычисление»:

  • Скидка 10%: ОКРУГЛ({user:total} * 0.9).
  • Размер списка из ctx: СЧЁТЗ(FROMJSON({items})).
  • Стабильный псевдослучайный порядок записей, которые действие «Найти записи» положило в ctx под ключом rows: порядок не меняется между запусками, пока не изменится «соль».
{"type":"compute","params":{"formula":"TOJSON(SORT(FOREACH(FROMJSON({rows}); LAMBDA(r; HASH(\"sha256\"; r.user_id & \"-salt\") & \"|\" & r.user_id))))","save_to_ctx":"order"}}

Проверка ответа «Соответствует формуле»: формула возвращает текст ошибки, а пустой результат означает, что ответ принят. Например, IF(ISNUMBER({answer}); ""; "Введите число").

Тест формулы

Тестер проверяет расширенную формулу и возвращает результат или ошибку синтаксиса, ничего не сохраняя:

  • в редакторе: в блоке проверки ответа «Соответствует формуле» введите пример в поле «Пример ответа» и нажмите «Проверить»;
  • по API: POST /api/bots/{botID}/reactions/test-formula с телом {"formula": "…", "sample_text": "…"};
  • по MCP: инструмент test_formula с полями bot_id, formula и sample.

Ответ: ok (формула вычислилась), result, error и matches (true, если результат пустой, то есть ответ прошёл бы проверку).

Формула считается в пустом контексте: ctx, параметры подписчика и глобальные параметры пусты, поэтому {ключ} и {user:ключ} дают пустую строку. Доступен только пример текста: {text}, {answer} или {received_message}. Выражения ({{= }}, режим «Формула», таблица решений) тестером не проверяются.

Что дальше