Блок «Подворонка»
Блок «Подворонка» запускает другую воронку проекта как вложенный вызов и после её завершения возвращает управление обратно в текущую воронку. Это не переход (goto) — подворонка выполняется «в скобках», а затем поток продолжается с того места, откуда был вызван.
Используйте подворонки, чтобы вынести повторяющиеся куски логики (оформление заказа, сбор контактов, проверка оплаты) в отдельную воронку и переиспользовать её из нескольких мест, не дублируя блоки.
Когда использовать
- Один и тот же сценарий нужен в нескольких воронках — выносите его в подворонку и вызывайте.
- Большую воронку хочется разбить на смысловые модули, чтобы её было проще читать и поддерживать.
- Нужно выполнить вспомогательный сценарий (например, сбор email или согласия) и вернуться к основному диалогу.
Настройки
В редакторе блока одна вкладка «Подворонка» с единственным полем:
- Подворонка — выпадающий список воронок проекта; выбранная воронка сохраняется в поле `flowId`. Текущая воронка в списке намеренно скрыта, чтобы исключить прямой рекурсивный вызов самой себя. Если других воронок в проекте нет, появится подсказка «Нет других воронок» — сначала создайте воронку, затем вернитесь к блоку. Поле обязательное: пока подворонка не выбрана, блок считается ненастроенным.
Как работает
- Движок читает из блока только поле `flowId`. Если оно пустое — блок ничего не делает и поток идёт дальше (тихий пропуск, без ошибки).
- По выбранной воронке находится её стартовый блок (`start`), создаётся вложенный движок с тем же контекстом (тот же клиент, те же переменные) и выполнение начинается с первого блока после старта.
- После завершения подворонки управление возвращается в текущую воронку — поток продолжается со следующего за «Подворонкой» блока. Собственных выходов-веток у блока нет: один линейный выход «дальше».
- Глубина вложенности ограничена: при достижении предела цепочка вызовов обрывается (вложенная воронка просто не запускается), чтобы исключить бесконечную рекурсию. В подсказках интерфейса указан предел в 5 уровней; фактический жёсткий стоп в движке срабатывает на глубине 10 — на практике до этого порога доходить не стоит.
- Счётчик посещённых блоков общий на всю вложенность: защита от циклов не сбрасывается при входе в подворонку, поэтому зациклить поток через цепочку подворонок не получится.
- Блок не записывает никаких переменных. Подворонка работает с тем же набором переменных клиента, что и родительская воронка, — изменения переменных внутри подворонки видны после возврата.
- Воронки, содержащие блок «Подворонка», не сохраняются в resume-checkpoint: при перезапуске такой поток не восстанавливается с середины через механизм чекпоинтов.
Пример
В проекте есть воронка «Сбор контактов»: спрашивает имя и телефон, сохраняет их в переменные. В основной воронке продаж после показа товара ставим блок «Подворонка» и выбираем «Сбор контактов». Клиент проходит мини-диалог сбора данных, после чего возвращается в воронку продаж — и следующий блок уже использует собранные `#{name}` и `#{phone}` для оформления заказа. Ту же подворонку можно вызвать из воронки записи на консультацию, не копируя блоки.
Частые ошибки
- Не выбрана подворонка. Если поле `flowId` пустое, блок молча пропускается и ничего не запускает — всегда выбирайте воронку из списка.
- Ожидание глубокой вложенности. Цепочки «подворонка вызывает подворонку» обрываются по лимиту глубины. Не стройте длинные рекурсивные цепочки — держитесь в пределах нескольких уровней (ориентир из интерфейса — 5).
- Косвенная рекурсия. Прямой вызов самой себя заблокирован (текущая воронка скрыта в списке), но воронка A → B → A по-прежнему создаёт цикл. Его остановит лимит глубины и общий счётчик посещений, но логику лучше проектировать без взаимных вызовов.
- Надежда на resume-checkpoint. Воронки с подворонками не чекпоинтятся — не закладывайте восстановление такого потока «с середины».