Переменные

Что такое переменные

Переменные — это именованные ячейки памяти, которые бот хранит для каждого пользователя отдельно. В них можно сохранять ответы пользователя, результаты запросов к API, данные платежей и любые промежуточные значения сценария.

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

Синтаксис

Переменная вставляется в любое текстовое поле с помощью двойных фигурных скобок:

{{имя_переменной}}

Пример:

Привет, {{name}}! Ваш заказ №{{order_id}} принят.

Оператор fallback ||

Если переменная не установлена, можно указать значение по умолчанию через ||:

{{имя_переменной||значение по умолчанию}}

Примеры:

Ваш город: {{city||Не указан}}
Имя: {{name||Пользователь}}
Email: {{email||адрес не введён}}

Если переменная установлена — выводится её значение. Если нет — выводится текст после ||. Без || при отсутствии переменной выводится пустая строка.

Автодополнение переменных

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

Кроме того, рядом с полями есть кнопка [{}] — она тоже открывает пикер переменных.

Dot-notation — вложенные объекты

Некоторые переменные содержат объект с несколькими полями. Для доступа к конкретному полю используется точка:

{{payment.currency}}     → валюта платежа
{{result.text}}          → текст ответа от OpenAI
{{sheets.Email}}         → значение колонки Email из Google Sheets

Встроенные переменные

Конструктор автоматически предоставляет ряд переменных, доступных в любой ноде:

Переменная Описание
{{CHAT_ID}} Telegram ID чата пользователя
{{USER_MESSAGE}} Текст последнего сообщения пользователя (или подпись к медиафайлу)
{{FILE_ID}} Telegram file_id последнего медиафайла, присланного пользователем
{{FILE_CAPTION}} Подпись к последнему медиафайлу пользователя
{{BOT_NAME}} Название бота
{{BOT_ID}} Внутренний ID бота в системе
{{BOT_LINK}} Ссылка на бота (https://t.me/<login>). Подставляется только при наличии username у бота
{{BOT_LOGO}} Полный URL логотипа бота в публичном хранилище (например https://example.com/storage/images/logo/123.jpg). Если у бота нет логотипа — плейсхолдер остаётся без замены
{{USER_MESSAGE_ID}} message_id входящего сообщения пользователя (для reply_to_message_id)
{{MESSAGE_THREAD_ID}} ID ветки (топика) форума-группы Telegram. Заполняется автоматически, если сообщение пришло из топика. Используется в опции «ID ветки форума» блоков для отправки ответа в тот же топик.
{{FORWARD_ORIGIN_MESSAGE_ID}} ID оригинального сообщения в канале (заполняется только если пользователь переслал сообщение из канала)
{{FORWARD_FROM_CHAT_ID}} ID канала-источника пересланного сообщения (заполняется только при форварде из канала)

Как установить переменную

1. Блок «Установка переменных»

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

city = Москва
full_name = {{first_name}} {{last_name}}
counter = {{counter}}+1
price_with_tax = {{price}}*1.2
avg = ({{a}}+{{b}})/2

Если после подстановки переменных поле «Новое значение» содержит только цифры и операторы + - * / ( ) — результат автоматически вычисляется и сохраняется числом (до 2 знаков после запятой). Если строка содержит текст или переменная равна пустой — значение сохраняется как есть.

Функция rand — случайное число

rand(min, max) возвращает случайное целое число в диапазоне от min до max включительно. Можно использовать как самостоятельное значение или внутри арифметического выражения.

Пример значения Результат
rand(0, 1) 0 или 1 (случайно)
rand(1, 6) число от 1 до 6 (кубик)
rand(10, 99) случайное двузначное число
rand(0, 2)*50 0, 50 или 100

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

  1. Добавьте блок «Установка переменных» и создайте переменную group = rand(0, 1)
  2. Добавьте блок «Условие»: если {{group}} = 0 → переход к команде А, иначе → к команде Б

Функции округления

В выражениях можно использовать функции округления:

Функция Описание Пример Результат
round(x) Округление до ближайшего целого round({{price}}/3) 34 (при price=100)
round(x, N) Округление до N знаков после запятой round({{price}}/3, 1) 33.3
floor(x) Округление вниз (целая часть) floor({{credits}}/2) 5 (при credits=11)
ceil(x) Округление вверх ceil({{credits}}/2) 6 (при credits=11)

Примеры:

voice_credits = floor({{pay_credits}}/2)
video_credits = ceil({{pay_credits}}/3)
rounded_price = round({{total}}/{{count}}, 2)

Функция strlen — длина строки

strlen(текст) возвращает количество символов в строке. Поддерживает Unicode — русские и другие буквы считаются корректно.

Пример значения Переменные Результат
strlen({{user_name}}) user_name=Иван 4
strlen({{comment}}) comment=Привет мир 9
strlen({{code}}) code=ABC 3

Примеры использования:

name_len = strlen({{user_name}})
bio_len = strlen({{bio}})
total_chars = strlen({{a}})+strlen({{b}})

strlen можно комбинировать с арифметикой: strlen({{name}})*2, strlen({{a}})+strlen({{b}}).

2. Блок «Форма ввода»

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

  • Поле «Сохранить в переменную» — имя переменной, куда запишется ввод.
  • Например: пользователь вводит своё имя → оно сохраняется в {{name}}.

Кнопка пропуска — при нажатии в переменную записывается null и сценарий продолжается к следующей ноде.

Кнопка прерывания — при нажатии ожидание ввода отменяется, а сообщение с формой удаляется (в inline-режиме). В reply-режиме сообщение не удаляется, но ожидание также снимается. Дальнейшее выполнение сценария не происходит.

3. Блоки интеграций

После выполнения запроса к OpenAI, Google Sheets или другому сервису результат записывается в переменные с указанным префиксом. Подробнее — в разделе Интеграции.

4. Блок «API-запрос»

Ответ от внешнего API парсится и сохраняется в переменные. Подробнее — в разделе API-запросы.

5. Платёж

После успешной оплаты данные транзакции автоматически записываются в переменные. Подробнее — в разделе Платежи.

Использование переменных в условиях

Блок «Условие» проверяет значение переменной и направляет пользователя по разным веткам сценария:

Оператор Пример
равно {{status}} равно active
не равно {{age}} не равно 0
содержит {{text}} содержит привет
больше / меньше {{score}} больше 100
пусто / не пусто {{email}} пусто

Советы

  • Называйте переменные латиницей без пробелов: user_name, order_id.
  • Используйте осмысленные имена — это облегчит навигацию в автодополнении.
  • Не забывайте, что переменные — это строки; для числовых сравнений убедитесь, что значение действительно число.

Динамические системные параметры

Конструктор поддерживает встроенные динамические параметры — специальные системные значения, которые вычисляются в момент выполнения бота. Их синтаксис похож на переменные, но имя начинается с $.

{{$NOW}} — текущая дата и время

$NOW возвращает текущее серверное время. По умолчанию — в формате ISO 8601 с UTC-смещением:

2026-03-27T18:41:00+03:00

Без методов {{$NOW}} использует таймзону сервера. Для указания своей таймзоны или формата — используйте цепочку методов.


Методы форматирования

Методы вызываются через точку и могут выстраиваться в цепочку:

{{$NOW.setZone('Europe/Moscow').format('DD.MM.YYYY HH:mm')}}

Стандартные методы

Метод Результат
{{$NOW}} ISO 8601: 2026-03-27T18:41:00+03:00
{{$NOW.toDate()}} Только дата: 2026-03-27
{{$NOW.toTime()}} Время 24ч: 18:41:00
{{$NOW.toTime12()}} Время 12ч: 6:41 PM
{{$NOW.toDateTime()}} Дата и время 24ч: 2026-03-27 18:41:00
{{$NOW.toDateTime12()}} Дата и время 12ч: 2026-03-27 6:41 PM
{{$NOW.toISO()}} ISO 8601 с UTC-offset
{{$NOW.toTimestamp()}} Unix-timestamp: 1743095260

Произвольный формат — .format('...')

Используйте нотацию moment.js:

Токен Значение Пример
YYYY Год 4 цифры 2026
YY Год 2 цифры 26
MM Месяц 01-12 03
DD День 01-31 27
HH Часы 00-23 18
hh Часы 01-12 06
mm Минуты 00-59 41
ss Секунды 00-59 00
A AM/PM PM
a am/pm pm

Примеры:

{{$NOW.format('DD.MM.YYYY')}}         → 27.03.2026
{{$NOW.format('DD.MM.YYYY HH:mm')}}   → 27.03.2026 18:41
{{$NOW.format('HH:mm')}}              → 18:41
{{$NOW.format('YYYY-MM-DD')}}         → 2026-03-27

Смена таймзоны — .setZone('...')

Передайте стандартное имя таймзоны IANA:

{{$NOW.setZone('Europe/Moscow')}}                        → ISO в МСК
{{$NOW.setZone('Europe/Moscow').toDate()}}               → дата в МСК
{{$NOW.setZone('Europe/Moscow').toDateTime()}}           → дата и время в МСК
{{$NOW.setZone('America/New_York').format('HH:mm')}}     → время в Нью-Йорке HH:mm

Арифметика дат — addDays, subDays, addMonths, subMonths, addHours, subHours

Сдвигают момент времени вперёд или назад. Все методы нетерминальные (chainable) — после сдвига можно применить любой метод форматирования.

Метод Значение
.addDays(N) Добавить N дней
.subDays(N) Вычесть N дней
.addMonths(N) Добавить N месяцев
.subMonths(N) Вычесть N месяцев
.addHours(N) Добавить N часов
.subHours(N) Вычесть N часов

Примеры:

{{$NOW.addDays(1).toDate()}}                             → завтра (YYYY-MM-DD)
{{$NOW.subDays(1).toDate()}}                             → вчера (YYYY-MM-DD)
{{$NOW.addDays(30).toDate()}}                            → через 30 дней
{{$NOW.addMonths(1).toDate()}}                           → через 1 месяц
{{$NOW.addDays(30).toISO()}}                             → через 30 дней (ISO, для диапазонов)
{{$NOW.setZone('Europe/Moscow').addDays(7).toDate()}}    → через 7 дней в МСК
{{$NOW.addDays(30).format('DD.MM.YYYY')}}                → через 30 дней (ДД.ММ.ГГГГ)

Пример диапазона дат (начало — сегодня, конец — через месяц):

Начало диапазона: {{$NOW}}
Конец диапазона:  {{$NOW.addDays(30).toISO()}}

Популярные таймзоны

Регион Таймзона UTC
Москва, СПб Europe/Moscow +3
Беларусь Europe/Minsk +3
Украина Europe/Kiev +2/+3
Екатеринбург Asia/Yekaterinburg +5
Новосибирск Asia/Novosibirsk +7
Иркутск Asia/Irkutsk +8
Владивосток Asia/Vladivostok +10
Казахстан Asia/Almaty +5
Узбекистан Asia/Tashkent +5
Грузия Asia/Tbilisi +4
Азербайджан Asia/Baku +4
Армения Asia/Yerevan +4
ОАЭ Asia/Dubai +4
Турция Europe/Istanbul +3
Германия Europe/Berlin +1/+2
Великобритания Europe/London 0/+1
США — Восток America/New_York -5/-4
США — Запад America/Los_Angeles -8/-7
Китай Asia/Shanghai +8
Япония Asia/Tokyo +9

Использование в автодополнении

В любом поле конструктора:

  1. Наберите {{$NOW — в пикере переменных появятся все готовые варианты.
  2. Наберите {{$NOW. — откроется popup Методы $NOW со списком всех методов и таймзон.
  3. Выберите нужный вариант кликом или введите выражение вручную.

Шаблонные директивы: @if и @foreach

В тексте сообщений можно использовать директивы для условного вывода и перебора массивов.

@if — условный вывод

@if(переменная)
Текст если условие истинно
@endif

С ветвью @else:

@if(status == 'ok')
Заказ принят ✅
@else
Произошла ошибка ❌
@endif

Поддерживаемые форматы условий

Формат Описание
@if(var) Истинно, если переменная установлена и не пуста
@if(!var) Истинно, если переменная пуста или не установлена
@if(var == 'value') Равенство (числовое или строковое)
@if(var != 'value') Неравенство
@if(var > 5) Больше (числовое сравнение)
@if(var >= 5) Больше или равно
@if(var < 5) Меньше
@if(var <= 5) Меньше или равно
@if(var == 1 && var2 == 2) Логическое И — все условия должны быть истинны
@if(var == 1 || var2 == 2) Логическое ИЛИ — хотя бы одно условие истинно

Переменные в условиях указываются без {{}}: @if(api.status == 'active'), @if(count > 0). Кавычки вокруг строкового литерала опциональны: @if(status == ok) и @if(status == 'ok') — равнозначны.

Примеры:

@if(USER_ID > 0)
Вы авторизованы.
@else
Доступ ограничен.
@endif

@if(order.status == 'paid')
Спасибо за оплату!
@endif

@if(!email)
Вы не указали email.
@endif

@if(user_config.emotional_pair == 1 && user_config.pair_psy == 1)
Условное сообщение
@endif

@if(role == 'admin' || role == 'moderator')
Доступ разрешён.
@endif

&& и || нельзя смешивать в одном выражении: @if(a == 1 && b == 2 || c == 3) не поддерживается. Используйте несколько отдельных @if или разбейте логику на блоки «Условие».


@foreach — вывод массива

Используется для вывода списка элементов из переменной-массива (например, результата API-запроса):

@foreach(переменная as элемент)
{{элемент}}
@endforeach

Если массив содержит объекты, обращайтесь к полям через точку:

@foreach(products as item)
• {{item.name}} — {{item.price}} руб.
@endforeach

Внутри @foreach работает @if:

@foreach(orders as order)
@if(order.status == 'paid')
✅ {{order.id}}: оплачен
@else
⏳ {{order.id}}: ожидает
@endif
@endforeach

Поведение граничных случаев

Ситуация Результат
Переменная не является массивом Блок @foreach выводит пустую строку
Массив пуст Блок @foreach выводит пустую строку
Переменная в @if не существует Условие считается ложным (falsy)

Ограничения

  • Вложенный @foreach внутри @foreach не поддерживается.
  • Вложенный @if внутри @if не поддерживается. Для проверки нескольких условий одновременно используйте && или || в одном @if.
  • Смешивание && и || в одном выражении не поддерживается — используйте блок «Условие» для сложной логики.

Вставка через тулбар редактора текста

В расширенном редакторе текста (кнопка «⤢» в текстовом блоке) в правой части тулбара появились две кнопки:

  • @if — вставляет шаблон @if(var) ... @endif с выделенным именем переменной для замены.
  • @foreach — вставляет шаблон @foreach(items as item) ... @endforeach с выделенным именем массива.

После вставки сниппета замените выделенный текст (имя переменной или массива) на нужное значение.