На рисунке изображен общий вид сценария IVR стандартного голосового приветствия.

В сценарии используются компоненты редактора сценариев IVR:
| - | Основные / "Старт"; |
| - | Основные / "Объявить переменную", на рисунке: [1],[2]; |
| - | Основные / "Присвоить значение", на рисунке: [7],[8]; |
| - | Основные / "Варианты", на рисунке: [4]; |
| - | Основные / "Стоп"; |
| - | IVR / "Проиграть файл", на рисунке: [3], [9], [10]; |
| - | IVR / "Ввод данных", на рисунке: [5]; |
| - | IVR / "Переключить", на рисунке: [6], [12]; |
| - | IVR / "Положить трубку", на рисунке: [13]; |
| - | Дополнительные / "Пауза", на рисунке [11]; |
Рассмотрим сценарий детально
Компоненты "Объявить переменную" ([1] и [2]) декларируют переменные, которые мы будем использовать в сценарии и определяют им начальные значения. Переменная Действие будет использоваться для получения и обработки вводимых абонентом цифр. Переменная Номер используется для определения номера секретаря. Переменной Действие определяем начальное значение пустая строка, а переменной Номер значение равное строковой переменной "100". Оба компонента "Объявить переменную" схожи между собой, внимательно рассмотрим свойства одного из них. Двойной щелчок мыши на компоненте "Объявить переменную" (на рисунке [2]) активирует свойства компонента:

В выпадающем списке слева указан тип переменной "Строка", а справа указывается ее имя – "Номер", а поле внизу активирует редактор выражений, который позволяет задать значение объявленной переменной:

Инициализация переменной очень важный момент в сценариях. Не инициализированная переменная будет иметь значение null, что в дальнейшем усложнит работу с ней.
Концепция восприятия значения null часто вводит в заблуждение новичков, которые считают, что null – то же, что и пустая строка "". Следует помнить, что значение null и "пустая строка" отличаются друг от друга. Для того, чтобы правильно воспринимать понятие null его можно ассоциировать в своем понимании с термином "неизвестность". Неизвестно равна ли одна неизвестность другой неизвестности; неизвестно что получится, если к заданной переменной прибавить неизвестность или к одной неизвестности прибавить другу.
Инициализация переменных на этом завершена, и сценарий подготовлен к тому, чтобы воспроизвести приветствие. Реализуется это при помощи компонента "Проиграть файл" [3]. Остановимся на его свойствах подробнее.

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

В данном случае файл будет проигрываться из локальной медиа-библиотеки сценария. У каждого сценария IVR существует собственная медиа-библиотека звуковых файлов, попасть в которую можно начав выбирать файл в поле "Значение".

Третий параметр ("Пауза") определяет значение паузы в секундах, которое система будет ждать после окончания проигрывания звукового файла.
В нашем случае выставлено значение 3. Это означает, что по окончанию проигрывания звукового файла "Наберите номер абонента в тоновом режиме или дождитесь ответа оператора" система будет ждать еще три секунды, для того, чтобы дать абоненту время нажать какую либо клавишу на телефоне.
Не рекомендуется указывать как нулевое значение паузы, так и слишком большое значение величины паузы. В первом случае, абонент может не успеть среагировать на приглашение нажатия кнопки, а слишком большая пауза будет вызывать излишние подозрения в работоспособности сервиса.
Параметр "стоп по кнопке" определяет будет ли воспроизведение голосового файла сразу же прервано, если абонент нажал какую либо кнопку на телефоне. Нажатие абонентом кнопки на телефоне эквивалентно передачу одиночного DTMF символа в систему.
В нашем случае мы ждем от абонента ввода трехзначного номера телефона, поэтому, чтобы не вводить абонента в сомнение, мы останавливаем воспроизведение файла "Стоп по кнопке", с тем, чтобы получить от него оставшиеся две цифры ввода.
Последнее поле свойства компонента определяет переменную в которую будет записано значение переданного DTMF сигнала (нажатой клиентом кнопки). Для обработки действий клиента мы используем переменную Действие, ее и указываем в свойствах компонента: "Редактор выражений / Переменная: Действие".
DTMF сигналы, полученные от абонента, трансформируются системой в строковую переменную. Несколько полученных подряд DTMF сигналов называются DTFM последовательностью. DTMF сигнал и DTMF последовательность могут состоять только из символов {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, *, #}, нажатие других кнопок абонентом в системой не воспринимается.
Из компонента "Проиграть файл" ведут четыре различных перехода:
| - | "Галочка" [ОК] – звуковой ролик был озвучен до конца и в процессе воспроизведения со стороны абонента не была получена последовательность DTMF ни одна клавиша на телефоне абонентом нажата не была; |
| - | "Звездочка" [Кнопка] – в момент воспроизведения звукового файла абонентом была нажата какая либо клавиша а системой получен DTMF сигнал; |
| - | "Крестик" [Ошибка] – во время воспроизведения файла произошла какая либо ошибка. Например, нужного файла не оказалось на месте; |
| - | "Кирпич" [Положили трубку] – во время воспроизведения файла оператором была положена трубка. |
Если в процессе воспроизведения файла абонентом была положена трубка (разорвана связь) продолжение сценария становится бесполезным, поэтому переход из "Кирпичика" ведет на компонент "Стоп". Компонент "Стоп" означает, что сценарий IVR завершает свою работу и передает управление АТС, и если АТС не получила других инструкций от «Infinity Call-центр X», то при разрыве соединения абонентом, АТС так же разорвет соединение.
Непосредственно при выходе из данного компонента система уже знает была или нет нажата абонентом какая либо кнопка на телефоне (выходы "Галочка" или "Звездочка"). Вместе с тем, в этом сценарии анализ получения от абонента DTMF сигнала проводится в следующем компоненте "Варианты". Все выходы первые три выхода из компонента ("Галочка", "Звездочка", "Крестик") ведут на следующий компонент "Варианты".
Компонент "Варианты" сравнивает заданный аргумент с перечисленными вариантами значений. Если аргумент совпадает с определенным вариантом, то выход из компонента происходит по соответствующей ветке блок-схемы. В конкретном случае, мы сравниваем аргумент переменную Действие с пустой строкой.

Аргумент компонента "Варианты" указывается в верхнем поле компонента, а кнопкой "Добавить" задается произвольное число перечисленных вариантов значений. В случае совпадения аргумента с одним из перечисленных вариантов выход из компонента осуществляется по соответствующей зеленой ветке вправо, а если ни один из предложенных вариантов не подошел, то по красной ветке вниз.
В том случае, если абонент не нажал никакой кнопки на телефоне, система не получит никакой DTMF символ, строковая переменная Действие останется пустой. Это означает, что вызов абонента необходимо перевести на секретаря – переход по правой ветке на компонент "Переключить" [12].
Если же в предыдущем компоненте "Проиграть файл" от абонента был получен DTMF символ, то он будет записан в переменную Действие, которая примет отличное от пустоты значение.
Заметим, что компонент "Проиграть файл" воспринимает всего один нажатый символ. Для ввода двух и более символов используется другой компонент IVR "Ввод данных". Вместе с тем, компонент "Ввод данных" не предназначен для воспроизведения звукового файла. Для совмещения ввода строки длинной 2 и более символов с голосовым сопровождением используется комбинация двух компонентов "Проиграть файл" и "Ввод данных", расположенных следом друг за другом.
Для того, чтобы получить оставшиеся две цифры номера в сценарии используется компонент "Ввод данных". Первое свойство компонента это его уникальное имя в пределах данного сценария, он назван "Ввод_номера".

В компоненте "Ввод данных" задаются условия при выполнении хотя бы одного из которых ввод данных считается завершенным и указывается переменная в которую будет сохранена полученная DTMF последовательность. Задаем, что общая длинна переменной при которой ввод считается завершенным это три символа (Длина: 3), общее время отведенное на ввод данных 10 секунд (Таймаут: 10 сек.) и если от клиента получен символ "решетка", то ввод данных тоже считается завершенным (Прерыватель: "#"). Полученная от абонента последовательность сохраняется в строковую переменную Действие.
Три важных замечания:
| 1. | Символ прерывания обрабатывается отдельно и не входит в полученную DTMF последовательность. |
Например, перед входом в компонент "Ввод данных" переменная Действие имела строковое значение равное "1". От абонента компонентом "Ввод данных" была получена DTMF последовательность вида "2#". При выходе из компонента к имеющемуся значению "1" добавится полученная строка "2", а символ "#" будет отброшен, как символ прерывания. Таким образом переменная Действие получит значение равное "12".
| 2. | Используемая для сохранения строковая переменная не инициализируется перед записью. Вся полученная компонентом DTMF последовательность добавляется к имеющемуся значению переменной. |
Например, перед входом в компонент "Ввод данных" переменная Действие имела строковое значение равное "1". От абонента компонентом "Ввод данных" была получена DTMF последовательность вида "23". Общая длина строки переменной Действие становится равной трем символам и ввод данных считается завершенным, а переменная Действие получит значение равное "123".
| 3. | Ввод данных прерывается когда общая длина строки переменной в которую сохраняются данные будет равна заданной длине строки. |
Например, перед входом в компонент "Ввод данных" переменная Действие имела строковое значение равное "111", то ввод данных будет изначально считаться выполненным, поскольку длина строки Действие уже равна или более трех символов.
Выход из компонента "Ввод данных" предусматривает три варианта:
| - | "Галочка" [OK] – ввод данных в отведенное время завершен успешно и в переменной находится строка заданной длины; |
| - | "Песочные часы" [Таймаут] – отведенное время для ввода данных закончилось, строка получена не полностью и не нажата клавиша с символом прерывания; |
| - | "Кирпич" [Положили трубку] – во время ожидания системой ввода данных абонент положил трубку. |
Очевидно, что в случае, если абонентом была положена трубка, сценарий IVR тоже должен завершить работу. Поэтому стрелку из выхода [Положили трубку] ведет на компонент "Стоп".
Если за отведенное время абонент не ввел номер или ввел его не полностью, то вызов направляется на телефон секретаря – компонент "Переключить" [12].
При успешном вводе номера переход из компонента идет в компонент "Переключить" [6].
Компонент "Переключить" отвечает за переключение телефонного вызова на указанный телефонный номер. Телефонный номер может быть любым внутренним, групповым, внешним городским или мобильным номером. Компонент имеет всего три параметра. Первый – это уникальное название компонента в пределах данного сценария "На внутренний номер".

Второй параметр "Таймаут" – время в секундах, в течении которого мы будем ожидать успешного переключения. Последний основной параметр это "Номер" – телефонный номер на который будет производится переключение вызова.
Внимание! В этом сценарии не проводится проверка корректности номера для переключения Если логика используемой АТС предполагает возможность осуществления вызовов на внешние короткие номера, перед компонентом "Переключить" имеет смысл проверить совпадение введенного номера с одним из внешних коротких номеров и в целях исключения злоупотреблений исключить возможность переключения на внешний городской короткий номер.
По результатам попытки переключения компонентом "Переключить" возможны 6 различных вариантов:
| - | "Галочка" [ОК] – успешное переключение за заданное время осуществлено. Если переключение успешное, то в дальнейшем выполнении сценария IVR необходимости нет. Переводим на компонент "Стоп". |
| - | "Красная трубка" [Занято] – выход из компонента, если вызываемый номер занят; |
| - | "Серая трубка" [Нет ответа] – выход из компонента, если вызываемый номер не отвечает в течении заданного параметром "Таймаут" времени; |
| - | "Крест" [Номер не существует] – выход из компонента, если набранный номер не существует, например, попытка переключить на внутренний номер не описанный в номерном плане; |
| - | "Крестик" [Ошибка] – переключение не удалось по причине ошибки, например, во время соединения произошел обрыв связи; |
| - | "Кирпич" [Положена трубка] – если в момент переключения вызова абонент положил трубку не дождавшись ответа вызываемой стороны, то сработает этот вариант выхода из компонента, в дальнейшем выполнении сценария IVR необходимости нет. Переводим на компонент "Стоп". |
Если события по результату переключения не заданы, то сценарий после выполнения компонента "Переключить" завершится.
Если необходимо дополнительным образом обработать случаи успешного или не успешного переключения, можно по выходу перед переходом на компонентом "Стоп" выполнить и другие действия. Например, выполнить запрос в базу данных или отправить уведомление.
Таким образом при успешном и не успешном переводе вызова, мы завершаем работу сценария IVR.
Обработаем случаи неудачного переключения. С точки зрения абонента возможны два разных варианта – номер занят или номер не отвечает.
Озвучим, что вызываемый номер занят в случаях если переключение не удалось по причинам [Занято] , [Номер не существует] и [Ошибка], переход на компонент [7]. В телефонных станциях все случаи таких вызовов обрабатываются короткими гудками. Вместо коротких гудков озвучим клиенту причину по которой мы не смогли соединить его с вызываемым номером: "Вызываемый номер занят, пожалуйста введите другой номер или дождитесь ответа секретаря". Делается это по уже известной последовательностью компонентов "Проиграть файл" [9] и "Ввод данных" [5]. В переменной Действие, которую мы используем для фиксации вводимого абонентом номера, могут находится данные, поэтому перед тем как использовать ее повторно, присвоим в компоненте "Присвоить значение" [7] переменной Действие значение, равное пустой строке.
Аналогичным образом построена схема обработки варианта, если вызываемый номер не ответил. Из компонента "Переключить" [6] по ветке [Нет ответа] переходим на компонент "Присвоить значение" [8], где переменной Действие присваивается значение, равное пустой строке. Далее компонент "Проиграть файл" [10] воспроизводит записанную фразу "Вызываемый номер не отвечает, пожалуйста введите другой номер или дождитесь ответа секретаря".
Для того, чтобы не дублировать дальнейшую логику выход из компонентов "Проиграть файл" [9] и [10] ведет на компонент [11] "Пауза", возвращающий нас на проверку переменной Действие в компонент [4].

Обратите внимание, что в компонентах "Проиграть файл" используется переменная Действие для сохранения нажатий кнопки абонентом.
Дальнейшее выполнение сценария будет происходить в цикле до тех пор пока абонент не будет переключен на введенный им номер или вызов не будет направлен на номер секретаря – компонент "Переключить" [12]. В том случае, если переключение на секретаря произошло успешно завершаем сценарий (компонент "Стоп"). В случае если телефон секретаря занят, не отвечает, номер не существует, ошибка или положили трубку – со стороны сценария остается положить трубку: компонент "Положить трубку", затем "Стоп".

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