EnotPRO Logo EnotPRO

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} Текущий элемент внутреннего цикла (только в режиме «по списку»)

⚠️ Ограничение: Максимальная глубина вложенности For2 уровня. Нельзя создать цикл внутри цикла внутри цикла (3+ уровня).

⚠️ Важно: Запуск другого триггера через RunTrigger создаёт новый контекст. В вызванном триггере циклы начинают отсчёт заново и используют свои собственные переменные (${loop.i}, ${loop.item}). Переменные цикла не «протекают» из вызывающего триггера.

🧪 Примеры использования

Пример 1: Цикл по счётчику (5 итераций)

Задача: Отправить пользователю 5 сообщений с номерами.

Реакции:

  1. ForИтерации: 5
  • Внутри: SendMessage → текст: Сообщение номер ${loop.i + 1}

Результат:

  • Сообщение номер 1
  • Сообщение номер 2
  • Сообщение номер 3
  • Сообщение номер 4
  • Сообщение номер 5

Пример 2: Цикл по списку пользователей

Задача: Отправить сообщение каждому пользователю из списка user_ids.

Реакции:

  1. ForСписок: ${var.local.user_ids}
  • Внутри: SendMessage

  • chat_id: ${loop.item}

  • Текст: Уважаемый пользователь!

Пример 3: Обработка элементов массива с индексом

Задача: Вывести список товаров с нумерацией.

Реакции:

  1. SetVarLocalitems: ["Товар А", "Товар Б", "Товар В"]
  2. ForСписок: ${var.local.items}
  • Внутри: SendMessage → текст: ${loop.i + 1}. ${loop.item}

Результат:

1. Товар А
2. Товар Б
3. Товар В

Пример 4: Работа с объектами в списке

Задача: Отправить сообщение каждому пользователю из списка объектов.

Реакции:

  1. ForСписок: ${var.local.users}
  • Внутри: SendMessage

  • chat_id: ${loop.item.id}

  • Текст: Привет, ${loop.item.name}!

Пример 5: Вложенные циклы (максимум 2 уровня)

Задача: Создать таблицу умножения 3×3.

Реакции:

  1. ForИтерации: 3 (внешний цикл, счётчик i)
  • Внутри: ForИтерации: 3 (внутренний цикл, счётчик j)

  • Внутри: SendMessage → текст: ${loop.i + 1} × ${loop.j + 1} = ${(loop.i + 1) * (loop.j + 1)}

Пример 6: Переменная итерации из макроса

Задача: Повторить действие случайное количество раз (от 3 до 7).

Реакции:

  1. 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 Досрочно остановить выполнение
© 2025 EnotPRO. Все права защищены.