Реализация IVR-систем и очередей вызовов

Мы переходим к одной из самых важных тем в построении корпоративной телефонии. Если до этого мы учились маршрутизировать вызовы по внутренним номерам и внешним базам данных, то сегодня мы создадим «лицо» компании — интерактивное голосовое меню и интеллектуальную систему распределения вызовов.

Анатомия IVR: логика под капотом

IVR (Interactive Voice Response) — это способ общения АТС с человеком через тональный набор (DTMF). Во FreePBX вы привыкли видеть IVR как отдельный модуль, но в «чистом» Asterisk это просто последовательность команд в диалплане.

Чтобы меню работало корректно, нужны три функции:

  1. Answer() — снимает трубку. Это критично: пока канал не «отвечен», многие операторы не передадут DTMF-сигналы от клиента в вашу систему.
  2. Background() — включает аудиозапись и одновременно слушает нажатия клавиш. В отличие от Playback(), эта функция не заставляет пользователя дослушивать фразу до конца.
  3. WaitExten() — ставит диалплан на паузу после записи, чтобы дать человеку время нажать кнопку.

Процесс обработки вызова показан на Схеме 1.

Пишем IVR вручную в extensions_custom.conf

Работа в конфигах напрямую избавляет от ограничений GUI. Разберем пример надежного меню. Обратите внимание на экстеншены i (invalid) и t (timeout) — без них звонок оборвется при первой же ошибке пользователя.

[custom-main-menu]
exten => s,1,Answer()
   same => n,Background(custom/welcome-message) ; "Нажмите 1 для техподдержки..."
   same => n,WaitExten(5) ; Ждем ввода 5 секунд

; Обработка выбора
exten => 1,1,Goto(sub-support,s,1)
exten => 2,1,Goto(sub-sales,s,1)

; Обработка ошибок
exten => i,1,Playback(custom/invalid-choice) ; Сообщаем о неверном вводе
   same => n,Goto(s,1)

exten => t,1,Playback(custom/timeout-notice) ; Сообщаем об истечении времени
   same => n,Goto(s,1)

🎙 Качество звука: В 2026 году используйте кодек Opus или формат SLN16 (16 кГц). Это обеспечит чистое звучание приветствия без «телефонного» дребезжания.

Очереди вызовов (Queue): управление потоком

Если IVR — это указатель, то Queue (очередь) — это диспетчерская. В отличие от групп вызова, очереди умеют удерживать клиентов, проигрывать музыку (MoH) и распределять нагрузку на операторов по алгоритмам.

Приложение Queue — блокирующее. Пока клиент в очереди, выполнение диалплана «замирает» на этой строке, пока оператор не ответит или не выйдет время.

Настройка параметров в queues.conf

Синтаксис вызова: Queue(queuename,[options],...). Основная логика задается параметрами:

  • Strategy: Как выбирать оператора?
    • ringall — звонят все одновременно.
    • leastrecent — вызов идет тому, кто дольше всех не разговаривал.
    • random — случайный выбор.
  • Joinempty: Пускать ли клиента в очередь, если все операторы оффлайн?
  • Musicclass: Какую музыку крутить в ожидании.

Практикум: связываем IVR и Queue

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

[ivr-with-queue]
exten => s,1,Answer()
   same => n,Background(custom/select-dept)
   same => n,WaitExten(5)

; Очередь техподдержки
exten => 1,1,Log(NOTICE, "User selected Support")
   same => n,Queue(support_q,t) ; Опция 't' позволяет оператору перевести звонок
   same => n,Hangup()

; Очередь продаж
exten => 2,1,Queue(sales_q,t)
   same => n,Hangup()

💡 Совет эксперта: Всегда готовьте «план Б». Если за 60 секунд в очереди никто не ответил, пропишите в диалплане следующей строкой перевод на мобильный дежурного или голосовую почту.

IVR работает как фильтр, направляющий трафик в «бассейны» — очереди. Это экономит время сотрудников и нервы клиентов.

Теперь, когда мы научились строить логику и удерживать вызовы, пора сделать АТС еще умнее. Должно ли меню работать одинаково в полдень и в три часа ночи? В следующей теме мы внедрим маршрутизацию на основе времени и CallerID.

Понравился урок?

Сохраните прогресс и получите персональный курс по любой теме — без форм и паролей

Продолжить в Telegram