Локальные переменные
Локальные переменные — это временные переменные, которые существуют только в рамках выполнения текущего триггера. После завершения триггера (включая Глобальный Триггер После) они автоматически удаляются.
Что такое локальные переменные
Локальные переменные — это переменные, которые создаются, изменяются и удаляются в процессе работы триггера.
Ключевые особенности:
| Особенность | Описание |
|---|---|
| Время жизни | С момента создания до завершения триггера (включая Глобальный Триггер После) |
| Область видимости | Только внутри текущего триггера |
| Автоудаление | Удаляются автоматически после завершения триггера |
| Изоляция | Разные триггеры не видят локальные переменные друг друга |
💡 Совет: Используйте локальные переменные для промежуточных вычислений, временного хранения данных из API, формирования сложных структур перед сохранением.
Когда использовать
| Сценарий | Пример |
|---|---|
| Промежуточные вычисления | Собрать JSON из нескольких переменных перед отправкой |
| Кэширование данных в триггере | Сохранить результат HTTP-запроса, чтобы не повторять его |
| Формирование сложных сообщений | Построить многострочный текст из нескольких частей |
| Временные флаги и счётчики | Отслеживание шагов внутри сложного ветвления |
⚠️ Важно: Если данные нужно сохранить между разными вызовами бота (через 5 минут, при следующем сообщении) — используйте облачные переменные.
Доступные реакции
| Реакция | Назначение | Ссылка |
|---|---|---|
| SetVarLocal | Создать или полностью перезаписать локальную переменную | Подробнее |
| AddVarLocal | Изменить значение (прибавить к числу, добавить в массив) | Подробнее |
| DelVarLocal | Полностью удалить локальную переменную | Подробнее |
Типы значений
В реакциях SetVarLocal и AddVarLocal тип значения выбирается вручную — ровно один из восьми. Автоопределения нет, без выбранного типа реакцию сохранить нельзя.
| Кнопка типа | Что означает | Пример значения |
|---|---|---|
| bool | Логическое | true, false, 1, 0 |
| number | Целое число | 42, -7 |
| float | Дробное число | 10.5 |
| string | Текст | Привет |
| json | Объект в формате JSON | {"city": "Москва"} |
| yaml | Объект в формате YAML | city: Москва |
| array json | Список в формате JSON | [1, 2, 3] |
| array yaml | Список в формате YAML | - 1 |
⚠️ Важно: Значение должно соответствовать выбранному типу. Текст
abcс типом number или число3с типом array json — ошибка, реакция не выполнится.
Пустое значение
Значение можно не указывать: при создании реакции есть кнопка «Пропустить», при редактировании — «Сбросить». Пустое значение превращается в нулевое значение выбранного типа.
| Тип | Нулевое значение |
|---|---|
| bool | false |
| number | 0 |
| float | 0 |
| string | Пустая строка |
| json, yaml | Пустой объект {} |
| array json, array yaml | Пустой список [] |
⚠️ Частая ошибка: Пустым считается и результат подстановки. Если в значении написано
${var.local.чего-нет}, подстановка даст пустоту, и переменная получит нулевое значение, а не ошибку. Проверяйте имена переменных внутри значения, а для подстраховки указывайте запасное значение:${var.local.count|default: 0}.
Пути и индексы
| Правило | Пример |
|---|---|
| Вложенные поля объекта — через точку | ${var.local.profile.city} |
| Элемент списка — по номеру, отсчёт с нуля | ${var.local.items.0} или ${var.local.items[0]} |
| Несуществующий номер даёт пустоту, а не ошибку | ${var.local.items[99]} → пусто |
| Отрицательный номер не означает «с конца» | ${var.local.items[-1]} → пусто |
| Вложенные объекты создаются сами | SetVarLocal на profile.city создаст и profile |
| Номер или ключ можно взять из переменной | ${var.local.items[${var.local.i}]}, ${var.local.profile.${var.local.field}} |
⚠️ Важно: Запись по номеру работает только для уже существующей позиции — новый элемент так не появится. Чтобы пополнить список, применяйте
AddVarLocalк самому списку, а не к номеру внутри него. По этой же причине список нельзя создать через путь:items.0его не создаст, список нужно сначала установить целиком.
Путь из переменной
Вычисляемый путь работает не только при чтении, но и в поле «Название» у SetVarLocal, AddVarLocal и DelVarLocal. Значит, можно записать или удалить элемент, номер которого известен только во время выполнения.
Пример: внутри цикла For заменить текущий элемент списка.
SetVarLocal→ название:items[${loop.i}], значение:обработано, тип: string
| Что можно | Пример названия |
|---|---|
| Элемент списка по вычисленному номеру | items[${loop.i}] |
| Поле объекта по вычисленному ключу | profile.${var.local.field} |
Номер может вычислять и макрос — например, следующий элемент списка:
items[!{math|${loop.i} + 1}]
⚠️ Важно: В поле «Название» обёртка
${...}вокруг всего значения означает «взять название из переменной». Запись${var.local.field}создаст переменную с названием, которое лежит вfield, а не переменнуюvar.local.field.
⚠️ Важно: Если путь после подстановки получился неправильным — например,
${loop.i}пуст или переменной из пути не существует — реакция завершится ошибкой, и её будет видно в логах бота.
Максимальная длина пути — 256 символов, вместе с подстановками.
Сравнение с облачными переменными
| Характеристика | Локальные переменные | Облачные переменные |
|---|---|---|
| Время жизни | До конца триггера | Постоянно (до удаления) |
| Доступность | Только в текущем триггере | В любом триггере |
| Требует загрузки | Нет (доступны сразу после создания) | Да (через GetVarCloud или !{varcloud}) |
| Автоудаление | ✅ Да (автоматически) | ❌ Нет (нужно удалять вручную) |
| Назначение | Временные данные, промежуточные вычисления | Постоянные данные (баланс, настройки) |
| Передача между триггерами | ❌ Нет | ✅ Да |
💡 Совет: Правило большого пальца — если данные нужны только внутри одного обработчика команды, используйте локальные переменные. Если данные нужны позже (при следующем сообщении или через час) — используйте облачные.
Примеры использования
Пример 1: Промежуточное вычисление скидки
Задача: Рассчитать итоговую сумму с учётом скидки 15% и отправить пользователю.
Реакции в триггере:
GetVarCloud→ загружаемcart_total(облачная переменная)SetVarLocal→ название:discount, значение:!{math|${var.person.cart_total} * 0.15}SetVarLocal→ название:final, значение:!{math|${var.person.cart_total} - ${var.local.discount}}SendMessage→ текст:Итого к оплате: ${var.local.final} ₽ (скидка ${var.local.discount} ₽)
Пример 2: Сборка JSON перед отправкой в API
Задача: Собрать данные пользователя в JSON и отправить через HTTP-запрос.
Реакции в триггере (подготовка к SendRequest):
GetVarCloud→ загружаемname,email,phoneSetVarLocal→ название:payload, значение:{"name": "${var.person.name}", "email": "${var.person.email}", "phone": "${var.person.phone}"}SendRequest→ тело запроса:${var.local.payload}
Пример 3: Формирование сложного сообщения
Задача: Собрать отчёт из нескольких переменных.
Реакции в триггере:
GetVarCloud→ загружаемbalance,orders_count,last_order_dateSetVarLocal→ название:report, значение:Ваш баланс: ${var.person.balance} ₽\nКоличество заказов: ${var.person.orders_count}\nПоследний заказ: ${var.person.last_order_date}SendMessage→ текст:${var.local.report}
Пример 4: Кэширование результата макроса
Задача: Случайное приветствие — сгенерировать один раз и использовать в нескольких местах триггера.
Реакции в триггере:
SetVarLocal→ название:greeting, значение:!{random.select|list: Привет!, Здравствуй!, Добрый день!}SendMessage→ текст:${var.local.greeting} ${user.name}SendMessage→ текст:${var.local.greeting} Рады тебя видеть!
💡 Совет: Без локальной переменной макрос
!{random.select}выполнялся бы дважды, и приветствия могли бы быть разными.
Связанные разделы
| Раздел | Описание |
|---|---|
| Облачные переменные | Постоянное хранение данных между триггерами |
| SetVarLocal | Создание локальной переменной |
| AddVarLocal | Изменение локальной переменной |
| DelVarLocal | Удаление локальной переменной |
| Макрос math | Вычисления для локальных переменных |
| Макрос string | Работа со строками |