EnotPRO Logo EnotPRO

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

Локальные переменные — это временные переменные, которые существуют только в рамках выполнения текущего триггера. После завершения триггера (включая Глобальный Триггер После) они автоматически удаляются.

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

Локальные переменные — это переменные, которые создаются, изменяются и удаляются в процессе работы триггера.

Ключевые особенности:

Особенность Описание
Время жизни С момента создания до завершения триггера (включая Глобальный Триггер После)
Область видимости Только внутри текущего триггера
Автоудаление Удаляются автоматически после завершения триггера
Изоляция Разные триггеры не видят локальные переменные друг друга

💡 Совет: Используйте локальные переменные для промежуточных вычислений, временного хранения данных из 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 заменить текущий элемент списка.

  1. 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% и отправить пользователю.

Реакции в триггере:

  1. GetVarCloud → загружаем cart_total (облачная переменная)
  2. SetVarLocal → название: discount, значение: !{math|${var.person.cart_total} * 0.15}
  3. SetVarLocal → название: final, значение: !{math|${var.person.cart_total} - ${var.local.discount}}
  4. SendMessage → текст: Итого к оплате: ${var.local.final} ₽ (скидка ${var.local.discount} ₽)

Пример 2: Сборка JSON перед отправкой в API

Задача: Собрать данные пользователя в JSON и отправить через HTTP-запрос.

Реакции в триггере (подготовка к SendRequest):

  1. GetVarCloud → загружаем name, email, phone
  2. SetVarLocal → название: payload, значение: {"name": "${var.person.name}", "email": "${var.person.email}", "phone": "${var.person.phone}"}
  3. SendRequest → тело запроса: ${var.local.payload}

Пример 3: Формирование сложного сообщения

Задача: Собрать отчёт из нескольких переменных.

Реакции в триггере:

  1. GetVarCloud → загружаем balance, orders_count, last_order_date
  2. SetVarLocal → название: report, значение: Ваш баланс: ${var.person.balance} ₽\nКоличество заказов: ${var.person.orders_count}\nПоследний заказ: ${var.person.last_order_date}
  3. SendMessage → текст: ${var.local.report}

Пример 4: Кэширование результата макроса

Задача: Случайное приветствие — сгенерировать один раз и использовать в нескольких местах триггера.

Реакции в триггере:

  1. SetVarLocal → название: greeting, значение: !{random.select|list: Привет!, Здравствуй!, Добрый день!}
  2. SendMessage → текст: ${var.local.greeting} ${user.name}
  3. SendMessage → текст: ${var.local.greeting} Рады тебя видеть!

💡 Совет: Без локальной переменной макрос !{random.select} выполнялся бы дважды, и приветствия могли бы быть разными.

Связанные разделы

Раздел Описание
Облачные переменные Постоянное хранение данных между триггерами
SetVarLocal Создание локальной переменной
AddVarLocal Изменение локальной переменной
DelVarLocal Удаление локальной переменной
Макрос math Вычисления для локальных переменных
Макрос string Работа со строками
© 2025 EnotPRO. Все права защищены.