---
title: "Use Case 2: Розгалуження за вибором"
description: "Меню з кнопками, окремі edges на кожну гілку, змінна user_choice і опційно Router за змінною."
---

# Use Case 2: Розгалуження за вибором клієнта

**Рівень:** базовий · **Модулі:** Scenario Builder · **Ноди:** MessageKeyboard, Router (опційно)

> **Перед стартом:** прочитайте [Edge-driven flow](/uk/learn/implementer/training/concepts.md#edge-driven-flow) і [Розгалуження: Router / switch](/uk/learn/implementer/training/concepts.md#router-branching).

## Необхідні права та доступ

| Що потрібно | Де в меню | Навіщо |
|-------------|-----------|--------|
| **Scenario Builder** | Меню → Scenario Builder | Меню, edges, Router |

Якщо розділу немає в меню — перевірте права облікового запису або зверніться до підтримки ConnectiveOne.

## Бізнес-контекст

Бот показує меню: «Продаж», «Підтримка», «Інше» — і веде клієнта в різні гілки сценарію. Це основа більшості client-ботів: один вхід, кілька бізнес-напрямків.

## Очікуваний результат

- Кнопки меню ведуть у **різні гілки** сценарію.
- Значення вибору зберігається у змінній `user_choice` (для Runs і подальших кроків).
- Якщо клієнт написав текст замість кнопки — зрозуміла підказка (default).
- Розуміння різниці: **edges з кнопок** vs **Router за змінною** після збереження вибору.

## Архітектура flow

```text
Start → MessageKeyboard (3 кнопки)
   ├─ edge «sales»    → MessageKeyboard (гілка Продаж)
   ├─ edge «support»  → MessageKeyboard (гілка Підтримка)
   ├─ edge «other»    → MessageKeyboard (гілка Інше)
   └─ edge default / вільний текст → «Оберіть пункт меню»
```

> **Важливо:** для меню за кнопками — **окремий edge на кожну кнопку** MessageKeyboard. Альтернатива — нода **Router** (`first_match` + default) після збереження вибору в `user_choice`.

## Покрокова реалізація

### Крок 1. MessageKeyboard — меню

**Нода:** Повідомлення з кнопками.

| Параметр | Значення | Навіщо |
|----------|----------|--------|
| Текст | «Оберіть тему звернення:» | Меню |
| Тип клавіатури | **inline** | Кнопки під повідомленням |
| Кнопка 1 | Текст: «Продаж» · **payload / value:** `sales` | Стабільне значення |
| Кнопка 2 | «Підтримка» · `support` | |
| Кнопка 3 | «Інше» · `other` | |
| **Output Variable** | `user_choice` | Записує вибір — перевіряйте в Runs |

**Edges:**

| Edge | Куди | Навіщо |
|------|------|--------|
| `sales` | MessageKeyboard «Ви обрали Продаж…» | Окрема гілка за edge кнопки |
| `support` | «Підтримка…» | |
| `other` | «Інше…» | |
| **Default** | «Натисніть одну з кнопок меню.» | Не залишати клієнта без відповіді |

---

### Крок 2. Три гілки-відповіді

**Нода:** MessageKeyboard (×3).

| Гілка | Текст (приклад) |
|-------|-----------------|
| sales | «Відділ продажу. Напишіть, що вас цікавить.» |
| support | «Підтримка. Опишіть проблему.» |
| other | «Загальні питання. Чим можемо допомогти?» |

---

### Крок 3. Перевірка в Runs

1. Кожна кнопка → **своя** гілка.
2. У trace: `user_choice` = `sales` | `support` | `other`.
3. Випадковий текст → **default**.

---

### Крок 4 (опційно). Router — одна нода за `user_choice`

Замість трьох окремих edges після меню можна зібрати **Router** (`action_router`):

| Налаштування | Значення |
|--------------|----------|
| Режим | `first_match` |
| Правило 1 | `{{user_choice}}` equals `sales` → гілка Продаж |
| Правило 2 | equals `support` → Підтримка |
| Правило 3 | equals `other` → Інше |
| **Default branch** | «Оберіть пункт меню» |

**Альтернатива:** Action **`switch`** з тими самими умовами — зручно для JSON-сценаріїв.

> Legacy action **`if_else`** у старих ботах робить те саме; на навчанні використовуйте **Router** або **`switch`**.

## Критерії приймання (self-check Runs)

- [ ] Кожна з трьох кнопок веде в **окрему** гілку.
- [ ] У trace змінна `user_choice` відповідає натиснутій кнопці.
- [ ] Вільний текст (не кнопка) → default edge, клієнт бачить підказку.
- [ ] Edge **default** підключений — немає «тиші» після довільного вводу.
- [ ] (Опційно) Router за `user_choice` дає той самий результат, що окремі edges.

## Типові помилки

| Симптом | Причина | Що зробити |
|---------|---------|------------|
| Усі кнопки ведуть в одну гілку | Один edge на всі кнопки | Окремий edge на кожен payload |
| `user_choice` порожній | Не задано Output Variable | Увімкнути Output Variable на MessageKeyboard |
| Бот «замовкає» після тексту | Немає default edge | Підключити default → підказка |
| Невірна гілка в Router | Порівняння з іншим значенням | Звірити payload кнопок і правила Router |
| Завжди default у Router | Немає default branch | Увімкнути default branch у Router |

## Пов'язана документація

- [Edge-driven flow](/uk/learn/implementer/training/concepts.md#edge-driven-flow)
- [Розгалуження: Router / switch](/uk/learn/implementer/training/concepts.md#router-branching)
- [Умовні гілки (Router)](/uk/scenariobuilder/explanation/router-node.md)
- [Параметри MessageKeyboard](/uk/scenariobuilder/reference/message-keyboard-parameters.md)
- [FAQ — розгалуження](/uk/learn/implementer/training/reference/faq.md)
- Далі: [Use Case 3 — передача на оператора](/uk/learn/implementer/training/basic/use-case-03-handoff-to-operator.md)
