---
title: "Протестировать и отладить кампанию"
description: "Запустить тестовое выполнение из холста, прочитать историю выполнений, чтобы найти, какой узел не сработал и почему, и увидеть, что происходит с запущенными кампаниями при редактировании."
canonical: https://docs.afp.monster/ru/guides/test-and-debug-campaigns
updated: 2026-08-19
pageType: guide
---

Тестовое выполнение проходит ваш сохранённый граф, не обращаясь к Facebook или Instagram: нажмите **Тест** (Test) на холсте, при необходимости введите сообщение, которое кампания должна принять как входящее, и холст переключается на вид **Выполнения** (Executions) с подсвеченным путём, который прошло выполнение. Реальные выполнения попадают в тот же список, так что один вид показывает, какой узел сработал, какой не сработал и почему выполнение остановилось.

## Что нужно подготовить

- Кампанию, сохранённую на холсте, с хотя бы одним узлом-триггером. Тестовое выполнение запускает текущую сохранённую версию кампании, поэтому несохранённые изменения не тестируются. См. [Создать кампанию на холсте](/ru/guides/build-a-campaign).
- Никакой настройки страниц, кроме этого. Тестовое выполнение не привязано к подключённой странице и не делает вызовов к Facebook или Instagram.

## Как запустить тестовое выполнение?

1. Откройте кампанию на холсте и нажмите **Сохранить** (Save), если есть несохранённые изменения.
2. Нажмите **Тест**.
3. Введите тестовое сообщение, которое выполнение должно принять как входящий комментарий или ЛС. Оставьте поле пустым — выполнение будет вести себя так, будто текст сообщения — слово `test`.
4. Нажмите **Запустить тест** (Run test).
5. Холст переключается на вид **Выполнения**, и новое выполнение появляется вверху списка.
6. Нажмите на выполнение, чтобы наложить его путь на холст: узлы, через которые оно прошло, отмечены как посещённые, узел, на котором оно остановилось, отмечен как текущий, а узлы, которые оно не достигло, затемнены.

![Диалог теста на холсте кампании с полем ввода для сообщения, которое тестовое выполнение должно принять как входящий комментарий](../../../../assets/screenshots/guides/test-and-debug-campaigns/test-dialog.webp)

Весь обход завершается до того, как холст ответит, поэтому нет анимации прохождения выполнения по узлам — вы видите сразу завершённое состояние.

## Чем тестовое выполнение отличается от реального?

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

| Поведение | Тестовое выполнение | Реальное выполнение |
|---|---|---|
| Что запускает | Кнопка **Тест** | Комментарий или ЛС, совпавший с триггером |
| Получатель | Синтетический тестовый получатель | Человек, который написал комментарий или сообщение |
| Подключённая страница | Нет | Страница, к которой привязана кампания |
| ЛС, ответы на комментарии, скрытия, удаления | Записываются как описание того, что было бы сделано; ничего не отправляется | Отправляются через Facebook или Instagram |
| Теги | Не добавляются, не удаляются | Присваиваются контакту |
| Узлы `delay` | Записываются как пропущенные, и выполнение на этом заканчивается | Планируются, возобновляются по истечении ожидания |
| `condition`, настроенный на ожидание ответа | Паркуется и остаётся припаркованным — ответ не может прийти | Возобновляется, когда человек отвечает |
| В списке выполнений | Да, отмечено как тест | Да |

Поскольку тестовое выполнение останавливается на первом узле `delay`, оно ничего не говорит об узлах после этого задержки. Временно уберите задержку или проверьте этот участок реальным комментарием.

## Что мне говорит история выполнений?

Вид **Выполнения** показывает 20 самых последних выполнений для кампании, начиная с новых, тестовые и реальные вместе. Каждая строка содержит, является ли выполнение тестовым, активно ли оно ещё, получателя, когда оно началось, когда завершилось, на каком узле оно находится, и сообщение об ошибке, если она есть.

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

Список не обновляется сам. Используйте элемент обновления на панели, чтобы повторно опросить выполнение, которое ещё активно.

### Что записывает путь на каждом узле?

| Запись напротив узла | Что это значит |
|---|---|
| Триггер сработал (Trigger fired) | Выполнение началось здесь. Каждое выполнение имеет эту запись как первую |
| Описание действия | Сработал узел-действие: отправлено ЛС, дан ответ на комментарий или комментарий скрыт, теги изменены |
| Ожидание ответа (Waiting for reply) | Выполнение припарковано на `condition`, настроенном на ожидание ответа, и ещё не разбужено |
| Запланированная задержка (Scheduled delay), с ожиданием в секундах | Узел `delay` спланировал возобновление и перестал продвигаться |
| Взята ветвь 2 (Took arm 2) | `random_split` выбрал эту ветку, и выполнение пошло по ней |
| Поток остановлен (Flow stopped) | Узел `stop` намеренно завершил выполнение |
| Сообщение об ошибке | Узел вызвал ошибку. Выполнение не продолжается дальше неё |

```d2 title="What each kind of next node does to a run: continue, park, schedule, complete, or stop with an error" data-wide="true"
direction: right
starts: "Выполнение начинается на триггере"
next: "Следующий узел" {shape: diamond}
visited: "Записан как посещённый, выполнение продолжается"
parked: "Припарковано: всё ещё активно,\nтекущий узел — condition"
scheduled: "Запланировано: всё ещё активно,\nвозобновляется по истечении ожидания"
completed: "Завершено"
cycle: "Остановлено с ошибкой цикла"
errored: "Всё ещё активно, ошибка записана,\nвыполнение не продолжается"
starts -> next
next -> visited: "триггер, действие или узел тега"
visited -> next
next -> parked: "condition настроен ждать ответа"
next -> scheduled: "узел delay"
next -> completed: "узел stop, или выход без подключённого узла"
next -> cycle: "уже посещённый узел"
next -> errored: "действие вызвало ошибку"
```

### Как прочитать состояние одного выполнения?

| Что вы видите | Что это значит | Что делать |
|---|---|---|
| Неактивно (Not active), с временем завершения | Выполнение достигло узла `stop` или выхода без подключённого узла | Ничего. Это нормальное завершение |
| Активно (Still active), текущий узел — `condition` | Condition настроен на ожидание ответа, и ответ не пришёл | Ждите ответа. Тестовое выполнение остаётся здесь, потому что ответ не может до него добраться |
| Активно, текущий узел — `delay` | Задержка запланирована и ещё не истекла | Ждите истечения задержки |
| Активно, с сообщением об ошибке на последнем посещённом узле | Действие не сработало. Выполнение записывает ошибку и не продолжается дальше этого узла | Устраните причину, затем запустите новое выполнение — это не возобновляется само |
| Неактивно, ошибка называет цикл на узле | Путь вернулся к узлу, который уже был посещён. Каждый узел срабатывает не более одного раза за выполнение | Перестройте ветку, чтобы путь никогда не посещал узел повторно |
| Неактивно, ошибка говорит, что запланированный шаг не сработал | `delay` был запланирован, но его возобновление не произошло | Протестируйте ветку снова. Если повторится, обратитесь в поддержку |
| Неактивно, ошибка говорит, что человек не ответил в течение 7 дней | Выполнение ожидало ответа на `condition` целую неделю | Ничего. Истечение — ожидаемый конец для переписок, которые никто не продолжает |

Повторные попытки узкие. Возобновление после `delay` повторяется до трёх раз, прежде чем выполнение будет помечено как неудачное с последней ошибкой. Действие, которое не срабатывает во время прохождения выполнения по графу, не повторяется вообще, и ни одно выполнение никогда не запускается заново с начала.

## Как долго выполнение ждёт ответ?

Семь дней. Выполнение, припаркованное на `condition`, который ждёт ответа, закрывается как неудачное после семи дней молчания с сообщением о том, что человек не ответил, и тестовые выполнения истекают так же.

Запланированное возобновление, которое никогда не происходит, ловится отдельно: как только оно опаздывает более чем на час, выполнение закрывается как неудачное с сообщением о том, что шаг не сработал.

Оба дедлайна проверяются периодическим обходом, а не в точный момент их наступления, поэтому выполнение может ещё показываться активным некоторое время после истечения его времени.

## Что происходит с выполняющимся выполнением, когда я редактирую или удаляю кампанию?

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

Старые версии хранятся до тех пор, пока выполнения на них ссылаются, поэтому выполнение, которое вы открываете в виде **Выполнения**, может показывать узлы, которых больше нет в графе, который вы редактируете. Подсветка также может не совпадать на выполнениях, которые слишком старые, чтобы версия, которую они использовали, была записана; панель в таком случае использует текущий граф.

Удаление кампании удаляет все сохранённые версии её графа и все записи выполнений, включая активные.

:::caution
Удаление кампании необратимо и забирает с собой историю выполнений. Выполнение, которое ждало истечения задержки, не возобновится — для него больше ничего не будет отправлено.
:::

## Почему ничего не произошло при тесте?

| Симптом | Причина | Исправление |
|---|---|---|
| **Тест** сообщает, что кампания не имеет триггера | Сохранённый граф не содержит узла-триггера | Добавьте узел-триггер, нажмите **Сохранить**, затем протестируйте снова |
| Выполнение завершается после одного или двух узлов | Выход, который ему нужен, ни с чем не подключён, поэтому выполнение остановилось там | Подключите ветку и сохраните |
| Узел `send_dm` отмечен как посещённый, но сообщение не приходит | Тестовые выполнения записывают действия вместо их отправки | Подтвердите доставку реальным комментарием или ЛС на подключённой странице |
| Ничего не приходит и на реальный комментарий | Кампания сохранена, но не активна, или комментарий не совпал с триггером и условием | Проверьте переключатель **Активно** (Active), затем прочитайте [Совпадение комментариев со списками ключевых слов](/ru/guides/keyword-lists) |
| Второй комментарий от того же человека не даёт результата | У одного человека не может быть два активных выполнения одной и той же кампании одновременно, поэтому второе совпавшее событие пропускается | Дождитесь завершения первого выполнения или протестируйте с другого аккаунта |
| Выполнение останавливается на узле-действии с ошибкой | Действие не сработало против Facebook или Instagram, и выполнение никогда не продолжается после неудачного действия | Устраните причину, затем запустите новое выполнение |

## Связанное

- [Состояния выполнения](/ru/reference/execution-states) — каждое состояние, в котором может быть выполнение, и как оно покидает каждое из них.
- [Сопоставление комментариев со списками ключевых слов](/ru/guides/keyword-lists) — почему `condition` взял **Match** или **No Match**.
- [Типы узлов](/ru/reference/node-types) — что делает каждый узел, когда выполнение до него доходит.
- [Построение кампании на холсте](/ru/guides/build-a-campaign) — граф, который вы тестируете.
