Перейти к основному содержимому

Действие «Операции с данными»

«Операции с данными (Переменные, Списки)» — самое часто используемое действие в сценарии действий. Здесь происходит вся работа с данными: создание переменных, сохранение/чтение/изменение списков, валидация ответов, перебор массивов, работа с глобальными переменными.

Одно действие может содержать несколько операций — они выполняются по порядку.

Как добавить​

В сценарии действий → кнопка «Добавить действие» → «Операции с данными (Переменные, Списки)».

Добавление действия «Операции с данными» Скриншот 1. Выбор типа действия.


Часть 1. Типы операций​

Внутри действия — кнопка «+ Операция». Каждая операция работает с одним источником данных:

ТипИсточник данныхКогда использовать
ПеременнаяЛокальная переменная клиентаИмя, телефон, временные значения
СписокТаблица с записямиКорзина, каталог, база клиентов
Глобальная переменнаяОбщая переменная ботаПромокод, курс, флаг
Данные из сценария ([DataN])Параметры, переданные в сценарий извнеЦена товара из каталога, ID заказа
ОтветОтвет клиента в конкретном блокеТекст из блока-вопроса

Типы операций Скриншот 2. Выбор типа операции.


Часть 2. Операция «Переменная»​

Создание/изменение локальной переменной. Состоит из двух блоков:

Блок «Проверки»​

Опциональный. Валидация значения перед присвоением.

Доступные типы проверок:

  • Число — значение должно быть числом;
  • Телефон — формат телефонного номера;
  • Эл. почта — корректный e-mail;
  • Регулярное выражение — собственный regex;
  • Выражение — произвольное условие (например, #{x} > 10).

Несколько проверок объединяются через И / ИЛИ.

Проверки переменной

Скриншот 3. Блок проверок переменной.

Блок «Присвоения»​

Куда и что сохранить:

  • Куда присвоить: Переменная / Список / Глобальная переменная.
  • Имя переменной: куда записать.
  • Значение: любая комбинация шаблонов замен, переменных, выражений.
  • Условие выполнения: «Успех» (если проверки пройдены) / «Неуспех» (если нет) — даёт ветвление прямо внутри операции.
Присвоение математических выражений

Если в переменную присвоите математическое выражение, которое может быть вычислено, то оно будет вычислено и в переменную присвоится результат вычислений. Чтобы присвоить строку математического выражения, берите ее в кавычки. Например '1 + 1' или "1 + 1"

Считается и то, что пришло подстановкой: дата 2026-09-25 станет 1992, телефон 8-800-555-35-35 — -1417. Кавычки не помогают при записи в глобальную переменную (значение там считается дважды) и когда в самом значении есть кавычка. Надёжный способ взять значение как есть — знак ~ перед подстановкой: ~#{g_Дата старта}; знак потом нужно убрать. Подробнее — Значение как есть: знак ~.

Пример​

Задача: проверить, что клиент ввёл корректный телефон, и сохранить его.

  1. Источник: «Переменная», переменная #{client_phone_raw} = [Answer1].
  2. Проверка: Телефон.
  3. Присвоение при Успехе: переменная client_phone = #{client_phone_raw}.
  4. Присвоение при Неуспехе: переменная phone_error = 1 (потом сравним в условии блока).

Часть 3. Операция «Список»​

См. подробно: Списки.

Внутри операции «Список» доступны четыре действия:

ДействиеЧто делает
Добавить новую записьСоздать строку в списке
Чтение записейНайти по условиям отбора
Изменить записьОбновить поле в строках, попадающих под отбор
Удалить записьУдалить попадающие под отбор

Условия отбора (для чтения, изменения, удаления)​

Поле + условие сравнения + значение. Дополнительные галочки:

  • Обратное сравнение — искать поле в строке сравнения;
  • По основе слова — без учёта склонений;
  • Сравнить с полем — значение = поле этого же списка;
  • Поле из списка — значение = поле другого списка.

Объединение условий через И / ИЛИ.

Уточнение отбора (диапазон)​

  • Старт / Конец — номера строк;
  • Последний элемент / Только последний.

Сортировка и уникальность (для чтения)​

  • Сортировка — по полю, по возрастанию/убыванию;
  • Уникальные строки — оставить уникальные по полю.

Автопеременные после чтения​

  • listlength — количество найденных записей;
  • «Имя переменной» наличия отбора — 0 (пусто) или 1 (есть).

Часть 4. Операция «Глобальная переменная»​

См. подробно: Глобальные переменные.

Выбирается из выпадающего списка существующих глобальных переменных бота. Дальше — те же блоки «Проверки» и «Присвоения», что у локальной переменной.

Особенности:

  • Изменяет значение, доступное всем клиентам бота.
  • Изменения видны в админке в разделе «Глоб. перем.».
  • Чтобы только прочитать значение — никаких операций не нужно, подставляйте #{имя_глобал} прямо в блок.

Часть 5. Операция «Данные из сценария» ([DataN])​

Источник — параметры, переданные в сценарий из внешнего вызова (другой сценарий, HTTP-запрос, кнопка с данными).

В операции укажите ID данных (номер N или текстовый ID). Дальше — проверки и присвоения, как у переменной.

В сообщении блока эти данные доступны через [DataN], [Данные1] или [D1].

Где используется​

  • Отправка строки данных через кнопку в сценарий другого подписчика через «отправку в бот»
  • В кнопке передаётся параметр (например, ID товара) → в сценарии действий следующего блока его читаем через [Data1].
  • Универсальный сценарий «Купить товар» вызывается из разных мест, каждый передаёт свой набор [Data1], [Data2].

Часть 6. Операция «Ответ»​

Источник — ответ клиента из конкретного блока сценария.

Указывается номер или ID блока с ответом. Дальше — проверки и присвоения.

Эквивалентно [Answer1], [AnswerN], [AnswerID(...)] в шаблонах, но удобнее для проверок и валидации.

Пример: валидация email и сохранение​

  1. Источник: «Ответ», номер блока — 3.
  2. Проверка: Эл. почта.
  3. Присвоение при Успехе: переменная client_email = [Answer3].
  4. Присвоение при Неуспехе: переменная email_invalid = 1.

Часть 7. Перебор массива​

Если переменная или результат чтения списка — это массив (несколько значений), его можно обработать построчно через «Перебор» (iterate).

Действия в переборе​

ДействиеЧто делает
Сохранить в переменнуюЗаписать значение текущего элемента в локальную переменную
Сохранить в глобальную переменнуюТо же, в глобальную
Сформировать строкуСклеить значения с разделителем — для отправки клиенту
Добавить в списокСкопировать элементы в другой список
Изменить списокОбновить связанный список на каждой итерации

Действия перебора

Скриншот 5. Действия в переборе массива.

Альтернатива: «Склеить»​

Если нужно просто соединить массив в одну строку — вывод переменной в сообщении склеивает массив в строку.

Полезно для:

  • Перечисления товаров корзины через запятую;
  • Сборки текста рассылки из набора шаблонов;
  • Формирования URL с параметрами.

Часть 8. Обращение к элементам массива​

Если переменная содержит массив (например, после чтения списка), можно обратиться к конкретному элементу через |:

  • #{items|1} — первый элемент (нумерация с 1);
  • #{items|3} — третий элемент;
  • #{items|last} или #{items|l} — последний элемент.

Часть 8а. Набор кнопок из списка​

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

Отправка элементов списка (галка «Отправить в сообщении» у операции чтения) шлёт по сообщению на строку: свой текст, свои кнопки, страницы по N штук. Это нужно, когда у строки есть собственное содержимое — фотография, описание, цена, несколько кнопок.

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

Как собрать набор кнопок​

  1. Прочитайте список в две переменные: что показать на кнопке и что вернуть при нажатии (код, номер строки).
  2. В сценарии действий, в сообщении на выходе, добавьте одну кнопку типа «Значение»: в названии — переменная с названиями, в значении — переменная с кодами.
  3. Конструктор развернёт их в набор: сколько строк отобралось, столько кнопок и будет.

Так это выглядит в полях кнопки:

ПолеЧто вписать
Название#{названия}
ТипЗначение
Значение#{коды}

Работает это потому, что чтение, отобравшее несколько строк, кладёт в переменную массив, а массив подставляется в поле готовым списком.

Не только «Значение»​

Так же разворачиваются ещё два типа кнопок — и это разные задачи:

Тип кнопкиЧто в значенииДля чего
Значениекод, номер строкивыбор: услуга, мастер, время, адрес. Нажатие приходит боту и попадает в ответ подписчика
Переход на блокid блока или его номерменю, которое ведёт в разные места: разделы из справочника, меню под роль, быстрые действия в уведомлении сотруднику
Ссылкаадрессправочник ссылок, личные ссылки подписчика, запуск мини-приложения

Несколько наборов и обычные кнопки уживаются в одном сообщении: каждая кнопка-образец разворачивается отдельно, поэтому под набором ссылок спокойно живут постоянные «Назад» и «В меню». А вот смешать типы внутри одного образца нельзя — один образец даёт кнопки одного вида.

Что проверить
  • Пустой список — кнопка уйдёт без названия, и мессенджер не примет сообщение целиком. Проверяйте наличие строк (переменная отбора) и ведите на отдельный шаг «ничего не найдено».
  • Ссылка ничего не возвращает — нажатие на неё боту не приходит, ответ подписчика не меняется, сценарий не двигается. Нужно знать, что выбрали, — берите «Значение».
  • Пустой адрес в наборе ссылок ломает всё сообщение целиком, а не одну кнопку: строки без ссылки отбрасывайте отбором.
  • У набора переходов данные общие — поле «Данные» одно на все кнопки. Если у каждой кнопки должна быть своя запись, берите «Значение» или постраничный вывод.
  • Длина значения — в Telegram на нажатие кнопки отводится 64 байта. Кладите в значение код или номер строки, а не длинное название: русский текст занимает 2 байта на букву, и после ~28 букв Telegram отклонит сообщение.
  • Количество — полтора десятка кнопок читаются, полсотни превращаются в стену. Длинные списки показывайте постранично.
  • Где кнопка — набор собирается только в сообщении сценария действий. В кнопках самого блока переменные не подставляются.

Часть 9. Архитектура​

Принцип 1. Группируйте логически​

В одно действие «Операции с данными» кладите связанные операции:

  • «Подготовить данные клиента» — Переменная (имя), Переменная (телефон), Переменная (email);
  • «Записать заказ» — Список (Корзина → addrow), Список (Заказы → addrow);
  • «Очистить корзину» — Список (Корзина → delrow по ClientID).

Принцип 2. Сначала проверки, потом запись​

Если данные приходят от клиента — всегда валидируйте. Иначе в списке окажутся «ZxC123», «не знаю», пустые строки.

Принцип 3. Используйте «Успех/Неуспех» как ветвление​

Не делайте отдельный блок «если ошибка» — добавьте присвоение с условием «Неуспех» в той же операции. Меньше блоков, чище доска.

Принцип 4. Хранение по сроку жизни​

Срок жизниХранилище
1 диалогЛокальная переменная
Несколько визитов клиентаСписок с фильтром по ClientID
Для всего ботаГлобальная переменная

Принцип 5. Не «теряйте» данные между сценариями​

Локальная переменная живёт в рамках одного диалога. Если клиент уйдёт и вернётся — её не будет. Для долговременного хранения — список или глобальная переменная.


Частые ошибки​

  • Переменная пустая в сообщении — присвоение делается в «После отправки» того же блока. Перенесите в «До отправки».
  • Проверка не срабатывает — проверьте регистр и тип значения. #{x} = "5" и #{x} = 5 могут вести себя по-разному.
  • Список фильтруется и возвращает пусто — посмотрите регистр значений в условиях и галочку «По основе слова».
  • Глобальная переменная случайно очистилась — она доступна всем сценариям бота. Если важна — закрепите комментарий и не давайте сценариям её перезаписывать без проверок.
  • Перебор работает не в том порядке — задайте сортировку при чтении списка перед перебором.

Что дальше​