Исходы и ошибки действий
Как выбрать следующий ответ по результату действия и не показать успешное подтверждение после конфликта или ошибки.
На этой странице
Пользователь подтверждает заявку. Бот должен изменить её статус, только если она ещё новая, и затем выбрать ответ: заявка принята, уже изменилась или больше не найдена. Эти ответы можно привязать прямо к исходам действия, без отдельного сравнения строки со статусом.
Маршрут исхода задаёт, какую реакцию выполнить дальше. После выбранного перехода текущая цепочка заканчивается: действия, расположенные ниже, не выполняются.
У отдельных действий branch_value и branch_result другое правило продолжения. Вне блока после нормального выполнения выбранной реакции выполняются следующие действия родительской реакции. Внутри переиспользуемого блока такое ветвление завершает вызов блока. Учитывайте это, выбирая место для следующего сообщения или расчёта.
Пример: подтвердить заявку
Для учебной проверки создайте коллекцию requests с текстовым полем state и записью со значением new. Укажите ID этой записи непосредственно в действии. В JSON ниже показан вариант, где ID уже получен из поиска или кнопки и сохранён как ctx.selected_id.
- Подготовьте реакции с ответами для успешного изменения, конфликта, отсутствующей записи и технической ошибки.
- Добавьте Изменить запись при условии. Укажите коллекцию, ID заявки, ожидаемый статус и новый статус.
- В разделе Маршруты исходов выберите реакции для Запись изменена (
updated), Конфликт (conflict), Запись не найдена (not_found) и Техническая ошибка (error). - Разместите сообщение об успешном подтверждении в реакции
updated.
Пример технического формата. ID маршрутов нужно заменить ID своих реакций:
{
"type":"record_update_if",
"params":{
"collection":"requests",
"record_id":"{{ctx.selected_id}}",
"expected":{"state":"new"},
"values":{"state":"confirmed"},
"save_to_ctx":"transition"
},
"outcomes":{
"updated":"00000000-0000-4000-8000-000000000001",
"conflict":"00000000-0000-4000-8000-000000000002",
"not_found":"00000000-0000-4000-8000-000000000003",
"error":"00000000-0000-4000-8000-000000000004"
}
}
Значения expected и values передаются строками и приводятся к типам коллекции. Если менять заявку может только её владелец, проверяйте владельца вместе со статусом в той же операции. Подробности условного изменения.
| Результат | Подходящий ответ |
|---|---|
updated | «Заявка принята» |
conflict | «Состояние заявки изменилось. Откройте карточку заново» |
not_found | «Заявка не найдена» |
error | «Не получилось сохранить заявку. Повторите позже» |
conflict означает, что запись есть, но ожидаемые значения не совпали. Это отдельный результат, даже если операция БД выполнилась без технической ошибки. Текущие значения записи при конфликте не раскрываются.
Как настроить переходы в редакторе
На вкладке Действия откройте карточку нужного действия и раздел Маршруты исходов. Для каждого результата выберите реакцию этого же проекта. Настройка доступна и у поддерживаемых действий внутри цикла.
Пункт Продолжить по правилам действия означает, что отдельный переход для этого исхода не задан. Это не обещание продолжить цепочку при любом результате: правила конфликта и ошибки описаны ниже. Чтобы убрать уже выбранный переход, нажмите Удалить маршрут возле соответствующего исхода.
Если после изменения типа действия или его настроек прежние переходы больше не поддерживаются, редактор сохранит их до явного исправления. Выберите подходящие реакции или удалите неподдерживаемые маршруты. При попытке сохранить ошибку можно раскрыть прямо из свёрнутой карточки.
При импорте JSON с несовместимыми исходами сначала откроется черновик для исправления. Исправьте переходы и сохраните его как новую реакцию. Реакция с исходным ID из файла не перезаписывается.
После сохранения проверьте целевые реакции и подписи исходов на графе. Режим Список реакций показывает эти же связи текстом.
Если исход направлен в эту же реакцию, при копировании он будет направлен в новую копию. Ссылки на другие реакции останутся прежними. Копия создаётся выключенной: проверьте её условия и действия перед включением.
Какие исходы доступны
| Действие | Исходы |
|---|---|
| Поддерживаемый синхронный расчёт, обработка списка или работа с данными | success, error |
| Обычное сообщение без ожидания ответа и встроенного вызова реакции | success, error |
Синхронный HTTP-запрос без отдельных переходов on_success / on_error | success, error |
| Изменение записи при условии | updated, conflict, not_found, error |
| Атомарная транзакция коллекций | committed, conflict, error |
Для условного изменения общий исход success не используется и отклоняется при проверке. Выберите updated, чтобы успешный ответ не мог сработать при конфликте.
У транзакции успешный исход называется committed: все её операции сохранены вместе. conflict останавливает цепочку, цикл и вызов блока даже без выбранного маршрута и при outcomes: {}. Позднее сообщение об успехе не выполнится. Практический урок с последним местом.
Управляющие действия, например переход, ветка или цикл, используют собственную логику переходов. Асинхронные шаги и вопросы с ожиданием ответа не получают эти исходы автоматически. Редактор предлагает только поддерживаемые для выбранного действия варианты.
Новые исходы пока не поддерживаются у создания оплаты, создания, отмены и изменения подписки, а также у встроенных действий GetCourse, Google Таблиц и Google Диска (payment_create, subscription_create, subscription_cancel, subscription_update, getcourse, gsheets, gdrive). Настройка непустого outcomes для них отклоняется при проверке. Самими действиями можно пользоваться без этой настройки.
У HTTP-запроса можно использовать новые исходы либо его отдельные переходы on_success / on_error. Совместное использование отклоняется, чтобы запрос не запускал два маршрута. Настроенные повторы HTTP остаются частью самого запроса; исход error не добавляет автоматических повторов.
Когда цепочка продолжается, а когда заканчивается
- Если для полученного исхода выбран маршрут, бот выполняет целевую реакцию и заканчивает текущую цепочку.
- Обычный
successилиcommittedбез выбранного маршрута позволяет перейти к следующему действию. - Техническая ошибка без обработчика завершает выполнение с ошибкой.
- Если у условного изменения настроен хотя бы один маршрут, но для полученного
updated,conflictилиnot_foundмаршрут отсутствует, цепочка останавливается. В журнале будет видно, что подходящий переход не выбран.
Без настроенных исходов сохраняется прежнее поведение существующих реакций. Пустой объект outcomes: {} тоже означает отсутствие этой настройки. Например, прежняя цепочка «условно изменить запись → выбрать ветку по transition.status» продолжает работать как раньше.
Внутри нового повторно используемого блока условное изменение дополнительно останавливает вызов при conflict или not_found, даже без собственных исходов. Это не даёт блоку вернуть успешный расчёт после отказа записи. Для своего ответа настройте маршрут у внутреннего действия.
Если исход настроен у действия внутри цикла, выбранный маршрут завершает и цикл, и оставшиеся действия текущей реакции. Следующая итерация после такого перехода не запускается.
Если целевая реакция уже выбрана, ошибка в ней не вызывает дополнительно маршрут error исходного действия. Решение о маршруте остаётся прежним, а ошибка относится к выбранной реакции.
Что означает успех
Успех определяется правилами самого действия. Если сервис вернул важный бизнес-статус в теле ответа, проверьте его отдельно веткой по значению.
Исход отправки сообщения не подтверждает, что пользователь прочитал сообщение. Доставку проверяйте по журналу соответствующего канала. Исходы также не превращают последовательность нескольких изменений в одну транзакцию.
При повторном выполнении задачи сохраняется решение о завершении или переходе, чтобы не продолжить действия после уже выбранного маршрута. Это не обещание однократного выполнения любого внешнего сервиса.
Проверка на учебных данных
- Подтвердите новую заявку и проверьте ответ
updated. - Повторите подтверждение: должен сработать
conflict, без успешного ответа ниже по цепочке. - Проверьте отсутствующий ID и маршрут
not_found. - Оставьте только маршрут
updated, затем вызовите конфликт: цепочка должна остановиться. - В безопасном тестовом режиме задайте ошибку внешнего шага и проверьте маршрут
error.
Связанные материалы: действия, условное изменение и ветвление, практические упражнения.