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

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

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

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

Как добавить

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

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

Пример

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

  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} — последний элемент.

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

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

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

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

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

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

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

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

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

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

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

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


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

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

Что дальше