For
For — реакция-папка, организующая цикл: повторяет вложенные в неё реакции заданное количество раз или по элементам списка.
📝 Назначение
Используется для многократного выполнения однотипных действий: массовая рассылка, обработка списка пользователей, повторяющиеся проверки.
Когда это нужно:
- Отправить сообщение каждому пользователю из списка
- Повторить действие N раз (например, 5 попыток подключения)
- Обработать все элементы массива (товары в корзине, загруженные файлы)
💡 Совет: Внутри
Forможно вложить ещё одинFor(максимум два уровня). Внутренний цикл будет использовать свои переменные:${loop.j}и${loop.item2}.
⚙️ Параметры
Реакция For работает в одном из двух режимов. Если задан параметр «Список» — используется он; иначе используется «Итерации».
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| Список | Array | ❌ Нет* | Путь к массиву в данных. Цикл проходит по каждому элементу |
| Итерации | Integer | ❌ Нет* | Количество повторений (число, переменная или макрос) |
** Должен быть задан хотя бы один из параметров: «Список» или «Итерации».*
📍 Переменные цикла
Внутри реакции For становятся доступны следующие переменные:
| Переменная | Описание |
|---|---|
${loop.i} |
Номер текущей итерации (начинается с 0) |
${loop.item} |
Текущий элемент списка (только в режиме «по списку») |
Пример значений:
- 1-я итерация:
${loop.i}=0,${loop.item}= первый элемент списка - 2-я итерация:
${loop.i}=1,${loop.item}= второй элемент списка
Работа с объектами в списке
Если список содержит объекты, ${loop.item} будет объектом. Для доступа к полям используйте точечную нотацию:
${loop.item.id} # ID объекта
${loop.item.name} # Имя объекта
${loop.item.field} # Любое поле объекта
Пример: список пользователей:
[
{"id": 123, "name": "Иван"},
{"id": 456, "name": "Пётр"}
]
Внутри цикла:
${loop.item.id}→123(первая итерация)${loop.item.name}→"Иван"(первая итерация)${loop.item.id}→456(вторая итерация)
Вложенные циклы (два уровня)
При вложенности For в For доступны дополнительные переменные для внутреннего цикла:
| Переменная | Описание |
|---|---|
${loop.j} |
Номер итерации внутреннего цикла |
${loop.item2} |
Текущий элемент внутреннего цикла (только в режиме «по списку») |
⚠️ Ограничение: Максимальная глубина вложенности
For— 2 уровня. Нельзя создать цикл внутри цикла внутри цикла (3+ уровня).
⚠️ Важно: Запуск другого триггера через
RunTriggerсоздаёт новый контекст. В вызванном триггере циклы начинают отсчёт заново и используют свои собственные переменные (${loop.i},${loop.item}). Переменные цикла не «протекают» из вызывающего триггера.
🧪 Примеры использования
Пример 1: Цикл по счётчику (5 итераций)
Задача: Отправить пользователю 5 сообщений с номерами.
Реакции:
For→Итерации:5
- Внутри:
SendMessage→ текст:Сообщение номер ${loop.i + 1}
Результат:
- Сообщение номер 1
- Сообщение номер 2
- Сообщение номер 3
- Сообщение номер 4
- Сообщение номер 5
Пример 2: Цикл по списку пользователей
Задача: Отправить сообщение каждому пользователю из списка user_ids.
Реакции:
For→Список:${var.local.user_ids}
-
Внутри:
SendMessage→ -
chat_id:${loop.item} -
Текст:
Уважаемый пользователь!
Пример 3: Обработка элементов массива с индексом
Задача: Вывести список товаров с нумерацией.
Реакции:
SetVarLocal→items:["Товар А", "Товар Б", "Товар В"]For→Список:${var.local.items}
- Внутри:
SendMessage→ текст:${loop.i + 1}. ${loop.item}
Результат:
1. Товар А
2. Товар Б
3. Товар В
Пример 4: Работа с объектами в списке
Задача: Отправить сообщение каждому пользователю из списка объектов.
Реакции:
For→Список:${var.local.users}
-
Внутри:
SendMessage→ -
chat_id:${loop.item.id} -
Текст:
Привет, ${loop.item.name}!
Пример 5: Вложенные циклы (максимум 2 уровня)
Задача: Создать таблицу умножения 3×3.
Реакции:
For→Итерации:3(внешний цикл, счётчикi)
-
Внутри:
For→Итерации:3(внутренний цикл, счётчикj) -
Внутри:
SendMessage→ текст:${loop.i + 1} × ${loop.j + 1} = ${(loop.i + 1) * (loop.j + 1)}
Пример 6: Переменная итерации из макроса
Задача: Повторить действие случайное количество раз (от 3 до 7).
Реакции:
For→Итерации:!{random.number|min:3; max:7}
- Внутри:
SendMessage→ текст:Итерация ${loop.i + 1}
🔄 Особенности поведения
| Ситуация | Поведение |
|---|---|
| Список пуст | Цикл не выполняется (0 итераций) |
| Итерации = 0 | Цикл не выполняется |
| Указаны и Список, и Итерации | Используется «Список» (приоритет выше) |
| Вложенность более 2 уровней | Не поддерживается |
| Continue внутри цикла | Прерывает текущую итерацию, переход к следующей |
| Break внутри цикла | Полностью завершает цикл |
| Exit внутри цикла | Останавливает выполнение триггера |
⚠️ Частые ошибки и их решение
Ошибка 1: Бесконечный цикл
Причина: Некорректное использование Continue или Break, или слишком большое количество итераций.
Решение: Всегда указывайте чёткое условие выхода. Используйте Break для досрочного завершения.
Ошибка 2: Неверный доступ к полям объекта
Причина: Использование ${loop.item} как строки, хотя это объект.
Решение: Используйте точечную нотацию: ${loop.item.field}.
Ошибка 3: Вложенность более 2 уровней
Причина: Попытка создать 3+ уровня вложенных циклов.
Решение: Переработайте логику — используйте RunTrigger для выноса части логики.
Ошибка 4: Переменные цикла не видны в RunTrigger
Причина: RunTrigger создаёт новый контекст выполнения.
Решение: Передайте нужные значения через параметр «Данные» в RunTrigger.
🔗 Связанные реакции
| Реакция | Назначение |
|---|---|
| Continue | Перейти к следующей итерации цикла |
| Break | Выйти из цикла |
| Exit | Досрочно остановить выполнение |