🔢 Переменные
Сценарии работают с переменными — данными, которые передаются между блоками. В тексты, условия и поля блоков переменные подставляются синтаксисом {{...}}, вложенные поля — через точку: {{trigger.payload.order_id}}, {{chat.status}}.
Пробелы внутри скобок допустимы ({{ flow.name }} работает), внутри самого пути — нет. Имя переменной — латиница, цифры, подчёркивание и точка, начинается с буквы или подчёркивания, до 256 символов.
Источники переменных
Источников ровно пять — они отличаются тем, где значение живёт и кто его пишет. В панели переменных редактора они показаны группами с такими подписями:
| Группа в панели | Префикс | Как живёт |
|---|---|---|
| Системные | {{system.*}} | вычисляется в момент чтения, только чтение |
| Этого сценария | {{flow.*}} | живёт в пределах одного запуска, пишется блоками |
| Пользователь | {{user.*}} | сохраняется для конкретного клиента и переживает запуски |
| Проект | {{project.*}} (то же, что {{tenant.*}}), {{dict.*}} | общие для всего проекта значения и справочники |
| Триггер | {{trigger.*}}, {{chat.*}}, {{ticket.*}} | данные события, которым запустился сценарий, и данные обращения или тикета; только чтение |
Данные обращения и тикета — {{chat.*}} и {{ticket.*}} — не хранятся в запуске. Сначала значение берётся из данных события; если его там нет — запрашивается в сервисе один раз за запуск, при первом обращении к переменной. Так же, по запросу, работают {{user.tickets}} и {{dict.ticket_types}}.
Системные переменные
Доступны всегда и только для чтения. Первые четыре пересчитываются при каждом обращении.
| Переменная | Пример | Что это |
|---|---|---|
{{system.now}} | 2026-05-16T15:30:00Z | Текущее время (UTC) в момент выполнения блока |
{{system.today}} | 2026-05-16 | Сегодняшняя дата (UTC) |
{{system.weekday}} | Saturday | День недели по-английски |
{{system.utc_offset}} | +00:00 | Смещение часов сервера от UTC |
{{system.run_id}} | UUID | Идентификатор этого запуска |
{{system.flow_id}} | UUID | Идентификатор сценария |
{{system.flow_name}} | — | Название сценария — пока не заполняется, подставляется пустая строка |
{{system.flow_type}} | SUPPORT | Тип сценария |
{{system.project_id}} | UUID | Идентификатор проекта |
{{system.project_name}} | — | Название проекта — пока не заполняется, подставляется пустая строка |
Переменные клиента
| Переменная | Что это |
|---|---|
{{user.id}} | UUID клиента — заполнен, если запуск идёт от имени клиента |
{{user.first_name}}, {{user.last_name}}, {{user.username}} | Имя, фамилия, ник |
{{user.email}}, {{user.phone}} | Контакты |
{{user.locale}}, {{user.timezone}} | Язык и часовой пояс |
{{user.tickets}} | Тикеты, заведённые этим клиентом (id, number, title, description, status, priority, typeId, assigneeId, createdAt, closedAt). Подтягивается по запросу; пустой список, если тикетов нет или запуск идёт без клиента |
Всё, что вы сами записали блоком «Переменная» с областью «Пользователь», тоже доступно как {{user.<имя>}}.
Поля first_name, last_name, username, email, phone, locale, timezone автоматически не заполняются. Это атрибуты клиента, которые сценарий записывает сам — блоком «Переменная» с областью «Пользователь» (например, после того как бот спросил email). До записи они пустые и помечены в панели переменных бейджем «может быть пустым». Всегда заполнен только {{user.id}} (если запуск идёт от имени клиента).
Переменные проекта
{{project.<ключ>}} — общие значения проекта. Их заводят вручную на странице «Настройки» → вкладка «Переменные» или записывает блок «Переменная» с областью «Тенант» — это одно хранилище. Значения живут между запусками. Префикс {{tenant.*}} — синоним, работает так же.
Обычно сюда кладут то, что не должно лежать в графе открытым текстом и нужно в нескольких сценариях: токен бота, ID дежурного чата, ключ внешнего API, адрес эндпоинта. В блоке «HTTP запрос» такое значение подставляется в поле авторизации как {{project.api_token}}. При смене токена достаточно поправить одну строку в настройках, а не каждый блок.
Вкладка «Переменные» в настройках проекта
На вкладке «Переменные» в настройках проекта — таблица «Ключ», «Значение», «Изменена», «Действия». Кнопка «Добавить переменную» открывает форму «Новая переменная»; ключ — строчные латинские буквы, цифры и _, начинается с буквы, до 64 символов. Кнопка «Скопировать ссылку для сценария» копирует готовую подстановку {{project.<ключ>}}.
Если в ключе есть token, key, secret, password, auth или apikey, переменная считается секретом: у неё бейдж «Секрет», и после сохранения значение больше не показывается нигде — его можно только «Заменить значение». При удалении переменной сценарии, которые на неё ссылаются, перестают получать значение.
Список видит любой участник проекта, добавлять, менять и удалять переменные может роль «Редактор» и выше.
Незаведённая переменная подставляется пустой строкой. Если обязательное поле блока задано шаблоном вроде {{project.x}}, а переменной нет, блок уходит по выходу «Ошибка» (если он разведён); без разведённой «Ошибки» запуск падает.
Блоку «AI-агент» переменные {{project.*}} и {{tenant.*}} не выдаются намеренно — компилятор отклонит попытку добавить их в контекст агента. Но текст инструкции агента подставляется как обычный шаблон: если написать {{project.api_token}} прямо в инструкции, значение уедет в промпт модели. Не пишите секреты в инструкцию. Редактор подсветит такую ссылку под полем инструкции («Здесь нельзя использовать …: инструкция интерполируется, и значение уедет в промпт на каждом ходу»), но публикацию не запретит.
Справочники
{{dict.ticket_types}} — справочник типов тикетов проекта: список с полями id, name, description, isDefault. Доступен в любом сценарии, подтягивается по запросу; в панели переменных — в группе «Проект». Удобен, чтобы подставить ID типа тикета без отдельного блока «Типы тикетов».
Данные обращения
Доступны в сценариях «Поддержка» (и на событии, и при ручном запуске из чата), в глобальных сценариях на событиях support.* и в сценариях, в которые разговор передал блок «Перевести в сценарий». Без обращения (по расписанию, по вебхуку) значения пусты.
Значения берутся из данных события, которым запустился сценарий, а недостающие поля один раз за запуск подтягиваются из системы поддержки при первом обращении. Статус, приоритет, линия, группа и канал — это значения на момент события: если сценарий долго ждал ответа, они могли измениться.
| Переменная | Что это |
|---|---|
{{chat.id}} | UUID обращения |
{{chat.channel}} | Канал: telegram, vk, discord, website, client_widget |
{{chat.channel_id}} | ID конкретного подключения канала |
{{chat.status}} | Статус (new, in_progress, clarification, resolved, cancelled) на момент события |
{{chat.priority}} | Приоритет (low…critical) на момент события |
{{chat.line}} | Линия поддержки числом; 0 — линия не назначена |
{{chat.group_id}} | Группа, на которую назначено обращение; пусто, если группы нет |
{{chat.author_id}} | ID клиента, открывшего обращение |
{{chat.conversation_id}} | ID переписки |
{{chat.created_time}}, {{chat.closed_time}} | Когда открыто и закрыто |
{{chat.unread_count}} | Сколько сообщений оператор ещё не прочитал |
Вторая группа приходит вместе с событием и доступна только на своём событии:
| Переменная | На каком событии |
|---|---|
{{chat.last_message}} | «Сообщение от клиента» |
{{chat.closed_by}} | «Обращение закрыто» — кто закрыл: ID оператора или customer |
{{chat.previous_status}} | «Сменился статус обращения» |
{{chat.previous_priority}} | «Сменился приоритет» |
{{chat.previous_line}} | «Перевод на другую линию» |
{{chat.previous_group_id}} | смена группы обращения (support.group.changed, только в глобальном сценарии — см. Триггеры) |
Данные тикета
Доступны в сценариях «Тикеты». Подтягиваются по запросу:
| Переменная | Что это |
|---|---|
{{ticket.id}} | UUID тикета |
{{ticket.number}} | Номер тикета — тот, что сообщают клиенту |
{{ticket.title}} | Заголовок |
{{ticket.description}} | Описание; может быть пустым |
{{ticket.status}}, {{ticket.priority}} | Текущий статус и приоритет — в нижнем регистре (статус: new, in_progress, approved, resolved, cancelled, closed) |
{{ticket.assignee_id}} | Исполнитель; пусто, если не назначен |
{{ticket.author_id}} | Кто создал тикет |
{{ticket.category}} | Категория; может быть пустой |
{{ticket.tags}} | Теги (список) |
{{ticket.created_at}}, {{ticket.modified_at}}, {{ticket.modified_by}} | Когда создан, когда и кем изменён |
Событийные переменные:
| Переменная | На каком событии |
|---|---|
{{ticket.previous_status}} | «Сменился статус» |
{{ticket.previous_priority}} | «Сменился приоритет» |
Данные триггера
Набор {{trigger.*}} зависит от того, чем запустился сценарий.
| Триггер / событие | Доступные переменные |
|---|---|
| Любое событие | event_type |
| «Сообщение от клиента», «Комментарий клиента» | text, button; channel — только у «Сообщения от клиента». Ключи attachments, location_lat, location_lng, contact_phone, contact_name есть в списке переменных, но сейчас каналы их не передают — они пустые |
| «Другие изменения» (тикет) | changed_fields — событие сейчас не отправляется, см. Триггеры |
| По расписанию | fired_at, cron |
| Вебхук | payload.<ключ>, headers.<заголовок> |
| Биллинг | plan, subscription_id, invoice_id, amount, currency, days_left, ends_at, reason — события сейчас не приходят, см. Триггеры |
| Квоты | period, current_usage, limit — события сейчас не приходят |
| Пользователи | id, email, phone, name, source, tag, field, value, previous_value — события сейчас не приходят |
| «Упал флоу» | failed_run_id, flow_id, flow_type, block_id (ID блока или метка движка engine.start / engine.loop / engine.resume), error_type (тип ошибки) |
Текста ошибки и названия сценария в событии «Упал флоу» нет — они в трассе запуска. Падение сценария, запущенного этим событием, повторно не объявляется.
{{trigger.text}} — текст сообщения, которым запуск начался, он не меняется. {{chat.last_message}} — последнее сообщение клиента: обновляется после каждого ответа на «Вопрос». Ответ на конкретный «Вопрос» лежит в {{flow.<имя>.text}}.
Области видимости
У переменных, которые вы создаёте блоками «Переменная», «Очистить переменную», «Изменить число» и «Переключить флаг», есть поле «Область»:
| Значение в интерфейсе | Как живёт |
|---|---|
| Сценарий | только в текущем запуске, по завершении исчезает |
| Пользователь | сохраняется для конкретного клиента между запусками, читается как {{user.<имя>}} |
| Тенант | общая на весь проект, читается как {{project.<имя>}}; видна и на вкладке «Переменные» в настройках проекта |
Если запуск идёт без клиента (например, по расписанию), блоки, которые записывают значение с областью «Пользователь» («Переменная», «Изменить число», «Переключить флаг»), остановятся с ошибкой; «Очистить переменную» просто ничего не сделает. Используйте «Сценарий» или «Тенант».
Типы значений
Переменные бывают строкой, числом, логическим значением (да/нет), объектом (JSON), списком и датой/временем. Тип выводится из значения; в панели переменных он показан рядом с именем.
Входные переменные
Для триггеров «Ручной запуск» и «Webhook» в блоке «Старт» есть поле «Входные переменные»: «Доступны в шаблонах блоков как {{flow.<имя>}}». Если переменных нет — «Сценарий запускается без аргументов. Добавьте переменные если они нужны».
У каждой переменной задаются:
| Поле | Обязательно | Описание |
|---|---|---|
| Имя | да | Только snake_case и уникальное в рамках сценария |
| Тип | да | string, number, boolean или json |
| Обязательное | нет | Значение придётся указать при запуске |
| Значение по умолчанию | нет | Подставится, если значение не передали |
| Описание | нет | Пояснение для того, кто запускает сценарий |
| Допустимые значения (enum) | нет | Только для типа string: список разрешённых значений |
Проверки, которые показывает редактор:
- «Имя обязательно»;
- «Только snake_case: lowercase, цифры, нижние подчёркивания»;
- «Имя уже используется в этом сценарии»;
- «Для обязательного поля default игнорируется — уберите одно из двух»;
- «Значение по умолчанию не подходит по типу»;
- «Значение по умолчанию должно быть из списка enum»;
- «Добавьте хотя бы одно значение или выключите enum».
При ручном запуске значения проверяются ещё раз: «Обязательное поле», «Значение не подходит по типу», «Должно быть одним из: …». У вебхука по входным переменным проверяется payload — см. Триггеры.
Входы сценария с ручным запуском заполняет и блок «Перевести в сценарий» — через поле «Аргументы» (форма строится по объявленным входам). Значения проверяются по типу, обязательности и списку допустимых значений до передачи; если проверка не прошла, исходный сценарий уходит по выходу «Ошибка». Ключи, которых нет среди входов, передаются как есть.
Где посмотреть доступные переменные
В редакторе есть панель «Переменные» и шпаргалка «Доступные переменные» — список того, что реально доступно в этом сценарии с учётом его типа, триггера, события и того, какие блоки стоят выше по графу. Клик по переменной копирует её в буфер («Клик — скопировать в буфер»).
Бейджи в списке:
| Что видно | Что означает |
|---|---|
| может быть пустым | значение бывает не заполнено |
| live | пересчитывается при каждом обращении |
| по запросу | подтягивается из другого сервиса при первом обращении |
| приоритетная для этого блока | обычно именно её сюда и подставляют |
Подсказки об ошибках прямо в поле: «переменная не найдена», «переменная ещё не записана к этому шагу», «это объект — укажите конкретное поле через точку».
Ограничения
| Что | Лимит |
|---|---|
| Значение одной переменной | 64 КиБ |
| Все переменные одного запуска | 256 КиБ |
Тело вебхука ({{trigger.payload}}) | 64 КиБ |
| Размер графа сценария | 1 МиБ |
| Длина имени переменной | 256 символов |
| Ключ переменной проекта | 64 символа |
→ Блоки · Триггеры · Версии и запуски