Переменные
Что такое переменные
Переменные — это именованные ячейки памяти, которые бот хранит для каждого пользователя отдельно. В них можно сохранять ответы пользователя, результаты запросов к 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 |
Применение — случайное распределение пользователей:
- Добавьте блок «Установка переменных» и создайте переменную
group = rand(0, 1) - Добавьте блок «Условие»: если
{{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 |
Использование в автодополнении
В любом поле конструктора:
- Наберите
{{$NOW— в пикере переменных появятся все готовые варианты. - Наберите
{{$NOW.— откроется popup Методы $NOW со списком всех методов и таймзон. - Выберите нужный вариант кликом или введите выражение вручную.
Шаблонные директивы: @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с выделенным именем массива.
После вставки сниппета замените выделенный текст (имя переменной или массива) на нужное значение.
