Scripts (версия 3.xx)/Приём звонков: различия между версиями

Материал из Call Office Wiki
Перейти к навигации Перейти к поиску
 
(не показано 5 промежуточных версий этого же участника)
Строка 17: Строка 17:


// =================== Начало работы сценария ===================
// =================== Начало работы сценария ===================
</syntaxhighlight>


:Командой '''Script.SetDebug''' включается/отключается режим вывода дополнительных отладочных сообщений во время работы сценария. Как правило, это излишняя информация. Включать данный параметр рекомендуется только в случае, если сценарий выполняется некорректно и надо отправить разработчикам журнал с большим количеством информации. Без передачи параметра (true/false) функция включает режим отображения так, как установлено в конфигурации.
<syntaxhighlight lang="javascript">
Script.SetDebug ();
</syntaxhighlight>
:Команда '''Script.InLogInfo''' позволяет выводить информацию в журнал в интерфейсе программы и одновременно записывать её в системный журнал. В данном случае будет отметка о том, что сценарий загрузил все необходимые данные и запустился.
<syntaxhighlight lang="javascript">
Script.InLogInfo ('Старт');
Script.InLogInfo ('Старт');


try {
try {
</syntaxhighlight>


:Далее определяется переменная '''Device''' класса '''CDevice''', отвечающая за управление нашим устройством приёма звонков (модем, SIP и т.д.). Используется метод [[Объект_Device/Методы/Open|Open]] для устройства с проверкой успешности.
:Определяется переменная '''Info''' класса '''CInfo''', отвечающая за отображение статистики во вкладке [[Запуск конфигурации_(версия_3.xx)|«Журнал»]]. Проводится первый подсчёт статистики на основе выбранных в конфигурации параметров.
<syntaxhighlight lang="javascript">
   var Device = new CDevice ();
   var Device = new CDevice ();


Строка 27: Строка 41:


   if (Device.Open ()) {                                          // Если устройство открыто успешно
   if (Device.Open ()) {                                          // Если устройство открыто успешно
</syntaxhighlight>


:Далее определяются переменные: '''AnswerMode''' класса '''CAnswerMode''', отвечающая за режим обработки входящих звонков, '''Time''' класса '''CTime''', отвечающая за работу с временем и расписание.
<syntaxhighlight lang="javascript">
       var AnswerMode = new CAnswerMode ();
       var AnswerMode = new CAnswerMode ();
       var Time      = new CTime      ();
       var Time      = new CTime      ();
</syntaxhighlight>


      if (AnswerMode.IsDatabase ()) {                            // Если есть запись или поиск телефона в базе
:Блок, выполняемый, если есть поиск в базе данных или запись звонков в базу данных.


<syntaxhighlight lang="javascript">
      if (AnswerMode.IsDatabase ()) {                                // Если есть запись или поиск телефона в базе
</syntaxhighlight>
:Определяется переменная '''Database''' класса '''CDatabase''', отвечающая за работу с источником данных. Проверяется соединение с базой данных.
<syntaxhighlight lang="javascript">
         var Database = new CDatabase ();
         var Database = new CDatabase ();


         if (Database.Open ()) {                                 // Если соединение с базой данных успешное
         if (Database.Open ()) {                                     // Если соединение с базой данных успешное
</syntaxhighlight>
 
:Проверяется время наступления работы, если определено расписание.
 
<syntaxhighlight lang="javascript">
            while (Time.WaitTime ()) {                              // Выполняем, пока совпадает время работы
</syntaxhighlight>


            while (Time.WaitTime ()) {                            // Выполняем, пока совпадает время работы
:При нажатии кнопки «Пауза» ожидается действие пользователя. Если пауза не нажата, выводится в журнал текст «Ожидание входящего звонка...». Если указано расписание работы, то время ожидания звонка определяется функцией '''Time.TimeOut ()''', если расписание не включено, то ожидание бесконечное. При входящем звонке (метод [[Объект_Device/Методы/WaitForIncoming|WaitForIncoming]] возвращает ноль) обрабатывается входящий звонок.


               Script.WaitPause ();                               // Ожидание, если нажали на Паузу
<syntaxhighlight lang="javascript">
               Script.WaitPause ();                                     // Ожидание, если нажали на Паузу


               Script.InLogInfo ('Ожидание входящего звонка...');
               Script.InLogInfo ('Ожидание входящего звонка...');


               switch (Device.WaitForCall (Time.TimeOut (), 1)) {    // Ждем звонка заданное время
               switch (Device.WaitForIncoming (Time.TimeOut (), 1)) {    // Ждем звонка заданное время


                   case 0:                    // Звонок поступил
                   case 0:                    // Звонок поступил
</syntaxhighlight>


:В переменную '''Phone''' заносится номер, с которого поступил входящий звонок (только цифры). Если номер определился, выводим в журнал сообщение о входящем звонке с указанием номера, если не определился, то просто о входящем звонке. Добавляется глобальная переменная сценария '''Phone''', содержащая полученный номер телефона.
<syntaxhighlight lang="javascript">
                     var Phone = ('' + Device.GetCallerId ()).replace (new RegExp (/[^0-9]*/g), '');
                     var Phone = ('' + Device.GetCallerId ()).replace (new RegExp (/[^0-9]*/g), '');


                     if (Phone) Script.InLogInfo ('Входящий звонок от %s поступил', Phone);
                     if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s поступил', Phone);
                     else       Script.InLogInfo ('Входящий звонок поступил');
                     else               Script.InLogInfo ('Входящий звонок поступил');


                     Script.AddVariable ('Phone', Phone);
                     Script.AddVariable ('Phone', Phone);


                     if (Script.IsStop ()) break;
                     if (Script.IsStop ()) break;
</syntaxhighlight>


                     var StartTime = new Date ();       // Время начала разговора
:В переменную '''StartTime''' заносится время начала разговора.
 
:Определяется переменная '''Recording''' класса '''CRecording''', отвечающая за запись ответа абонента, при соответствующих настройках сценария включается запись разговора.
 
:Определяется переменная '''DataSearch''' класса '''CDataSearch''', отвечающая за поиск номера телефона в базе данных.
 
<syntaxhighlight lang="javascript">
                     var StartTime = new Date ();                   // Время начала разговора


                     var Recording = new CRecording ();
                     var Recording = new CRecording ();


                     Recording.Start (Device);           // проверка на включение записи разговора перед сообщением
                     Recording.Start (Device);                       // проверка на включение записи разговора перед сообщением


                     var DataSearch = new CDataSearch ();
                     var DataSearch = new CDataSearch ();
</syntaxhighlight>
:При включенном поиске номера телефона в базе данных определяется переменная '''Record''', содержащая записи базы данных с указанным номером телефона. Если записи есть и номер телефона определён, производится переход к произнесению сообщения для найденных номеров телефонов.


                     if (DataSearch.IsSearch ()) {       // если есть поиск в базе данных
<syntaxhighlight lang="javascript">
                     if (DataSearch.IsSearch ()) {                   // если есть поиск в базе данных


                         var Record = DataSearch.GetRecord (Database, Phone);    // выбираем записи в БД
                         var Record = DataSearch.GetRecord (Database, Phone);    // выбираем записи в БД


                         if (Record.Fetch () && Phone) {                          // Нашли телефон, произносим для него сообщение
                         if (Record.Fetch () && Phone) {                          // Нашли телефон, произносим для него сообщение
</syntaxhighlight>
:Определяется переменная '''Sound''' класса '''CSound''', отвечающая за произнесение сообщений для найденных номеров ('Found'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение. В статистике добавляется успешно принятый звонок.


<syntaxhighlight lang="javascript">
                           var Sound = new CSound ('Found');
                           var Sound = new CSound ('Found');


Строка 76: Строка 130:
                           Sound.Say (Device, Record);
                           Sound.Say (Device, Record);


                           Info.Ok++;                   // добавляем найденный телефон в статистику
                           Info.Ok++;                         // добавляем найденный телефон в статистику
                         }
                         }
                         else {                           // Не нашли, произносим общее для не найденных
</syntaxhighlight>
 
:Определяется переменная '''Sound''' класса '''CSound''', отвечающая за произнесение сообщений для ненайденных номеров ('NotFound'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение. В статистике добавляется неизвестный принятый звонок.
 
<syntaxhighlight lang="javascript">
                         else {                                 // Не нашли, произносим общее для не найденных


                           var Sound = new CSound ('NotFound');
                           var Sound = new CSound ('NotFound');
Строка 86: Строка 145:
                           Sound.Say (Device, Record);
                           Sound.Say (Device, Record);


                           Info.Fail++;                     // добавляем неизвестный телефон в статистику
                           Info.Fail++;                       // добавляем неизвестный телефон в статистику
                         }
                         }
</syntaxhighlight>


                        Recording.Stop (Device, Record);    // Завершаем запись разговора, если была включена
:Завершается, если была включена, запись разговора, записывается ответ абонента, если в конфигурации определена запись после произнесения сообщения.


<syntaxhighlight lang="javascript">
                        Recording.Stop (Device, Record);      // Завершаем запись разговора, если была включена
</syntaxhighlight>
:Закрывается соединение с выбранными по номеру телефона записями.
<syntaxhighlight lang="javascript">
                         Record.Close ();
                         Record.Close ();


                     }
                     }
                     else {                                 // Поиск не включен, произноcим общее сообщение для всех
</syntaxhighlight>
 
:Определяется переменная '''Sound''' класса '''CSound''', отвечающая за произнесение сообщения для всех входящих без поиска в базе данных ('ForAll'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение.
 
<syntaxhighlight lang="javascript">
                     else {                                   // Поиск не включен, произноcим общее сообщение для всех


                         var Sound = new CSound ('ForAll');
                         var Sound = new CSound ('ForAll');
Строка 101: Строка 174:


                         Sound.Say (Device, Record);
                         Sound.Say (Device, Record);
</syntaxhighlight>
:Завершается, если была включена, запись разговора, записывается ответ абонента, если в конфигурации определена запись после произнесения сообщения. После завершения записи устройство «кладёт трубку».


                         Recording.Stop (Device);           // Завершаем запись разговора, если была включена
<syntaxhighlight lang="javascript">
                         Recording.Stop (Device);               // Завершаем запись разговора, если была включена
                     }
                     }


                     Device.HangUp ();                     // Кладём трубку
                     Device.HangUp ();                         // Кладём трубку
</syntaxhighlight>
 
:Увеличивается значение счётчика успешных звонков, обновляется информация в окне статистики.
 
<syntaxhighlight lang="javascript">
                    Info.All++;                              // Увеличиваем счетчик принятых звонков в статистике
                    Info.Update (DataSearch.IsSearch ());    // Показываем статистику
</syntaxhighlight>
 
:Определяется переменная '''DataWrite''' класса '''CDataWrite''', отвечающая за запись в базу данных информации о звонке. Если это указано в конфигурации, записывается информация о поступившем звонке в базу данных.


                    Info.All++;                            // Увеличиваем счетчик принятых звонков в статистике
:В журнал выводится информация о том, что звонок обработан.
                    Info.Update (DataSearch.IsSearch ());  // Показываем статистику


<syntaxhighlight lang="javascript">
                     var DataWrite = new CDataWrite ();
                     var DataWrite = new CDataWrite ();


                     DataWrite.WriteResult (Database, Phone);  // Записываем звонок, если необходимо
                     DataWrite.WriteResult (Database, Phone);  // Записываем звонок, если необходимо


                     if (Phone) Script.InLogInfo ('Входящий звонок от %s обработан.', Phone);
                     if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s обработан.', Phone);
                     else       Script.InLogInfo ('Входящий звонок обработан.');
                     else               Script.InLogInfo ('Входящий звонок обработан.');


                     break;
                     break;
</syntaxhighlight>
:В случае, если ожидание прервано пользователем.


<syntaxhighlight lang="javascript">
                   case 4:
                   case 4:
                     break;
                     break;
Строка 129: Строка 220:
         }
         }
       }
       }
</syntaxhighlight>
:Блок, выполняемый в случае, если нет поиска и записи в базу данных.
<syntaxhighlight lang="javascript">
       else {                                                  // Без записи и поиска в БД
       else {                                                  // Без записи и поиска в БД


         while (Time.WaitTime ()) {                            // Выполняем, пока совпадает время работы
         while (Time.WaitTime ()) {                            // Выполняем, пока совпадает время работы
</syntaxhighlight>
:При нажатии кнопки «Пауза» ожидается действие пользователя. Если пауза не нажата, выводится в журнал текст «Ожидание входящего звонка...». Если указано расписание работы, то время ожидания звонка определяется функцией '''Time.TimeOut ()''', если расписание не включено, то ожидание бесконечное. При входящем звонке (метод [[Объект_Device/Методы/WaitForIncoming|WaitForIncoming]] возвращает ноль) обрабатывается входящий звонок.
<syntaxhighlight lang="javascript">
            Script.WaitPause ();                                      // Ожидание, если нажали на Паузу


             Script.InLogInfo ('Ожидание входящего звонка...');
             Script.InLogInfo ('Ожидание входящего звонка...');


             switch (Device.WaitForCall (Time.TimeOut (), 1)) {    // Ждем звонка заданное время
             switch (Device.WaitForIncoming (Time.TimeOut (), 1)) {    // Ждем звонка заданное время


               case 0:                    // Звонок поступил
               case 0:                    // Звонок поступил
</syntaxhighlight>
:В переменную '''Phone''' заносится номер, с которого поступил входящий звонок (только цифры). Если номер определился, выводим в журнал сообщение о входящем звонке с указанием номера, если не определился, то просто о входящем звонке. Добавляется глобальная переменная сценария '''Phone''', содержащая полученный номер телефона.


                   var Phone = Device.GetCallerId ();
<syntaxhighlight lang="javascript">
                   var Phone = ('' + Device.GetCallerId ()).replace (new RegExp (/[^0-9]*/g), '');


                   if (Phone) Script.InLogInfo ('Входящий звонок от %s поступил', Phone);
                   if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s поступил', Phone);
                   else       Script.InLogInfo ('Входящий звонок поступил');
                   else               Script.InLogInfo ('Входящий звонок поступил');


                   Script.AddVariable ('Phone', Phone);
                   Script.AddVariable ('Phone', Phone);


                   if (Script.IsStop ()) break;
                   if (Script.IsStop ()) break;
</syntaxhighlight>
:В переменную '''StartTime''' заносится время начала разговора.
:Определяется переменная '''Recording''' класса '''CRecording''', отвечающая за запись ответа абонента, при соответствующих настройках сценария включается запись разговора.


<syntaxhighlight lang="javascript">
                   var StartTime = new Date ();        // Время начала разговора
                   var StartTime = new Date ();        // Время начала разговора


Строка 165: Строка 277:
                   Info.Update (false);                  // Показываем статистику
                   Info.Update (false);                  // Показываем статистику


                   if (Phone) Script.InLogInfo ('Входящий звонок от %s обработан.', Phone);
                   if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s обработан.', Phone);
                   else       Script.InLogInfo ('Входящий звонок обработан.');
                   else               Script.InLogInfo ('Входящий звонок обработан.');


                   break;
                   break;

Текущая версия на 07:50, 31 октября 2013

Первая часть скрипта подготавливает классы и объекты, необходимые для работы скрипта. Описание дано в комментариях к каждой строке за исключением класса Script, который отвечает за непосредственное выполнение скрипта.
eval (GetFileContent ('Common\\Classes\\Script.js'));
var Script = new Script ();                                                      // Основной класс сценария

// =================== Подключение модулей ===================
eval (Script.GetFileContent ('Common\\Classes\\Database.js'));                   // База данных
eval (Script.GetFileContent ('Common\\Classes\\Time.js'));                       // Расписание
eval (Script.GetFileContent ('Common\\Classes\\Sound.js'));                      // Воспроизведение звуков
eval (Script.GetFileContent ('Common\\Classes\\Device.js'));                     // Устройство
eval (Script.GetFileContent ('Common\\Classes\\Recording.js'));                  // Запись разговора
eval (Script.GetFileContent ('Common\\Classes\\DataSearch.js'));                 // Поиск данных

eval (Script.GetFileContent ('Solutions\\Basic\\IncomingCall\\Info.js'));        // Информация и статистика
eval (Script.GetFileContent ('Solutions\\Basic\\IncomingCall\\CDataWrite.js'));  // Запись данных
eval (Script.GetFileContent ('Solutions\\Basic\\IncomingCall\\CAnswerMode.js')); // Режим обработки входящего звонка

// =================== Начало работы сценария ===================
Командой Script.SetDebug включается/отключается режим вывода дополнительных отладочных сообщений во время работы сценария. Как правило, это излишняя информация. Включать данный параметр рекомендуется только в случае, если сценарий выполняется некорректно и надо отправить разработчикам журнал с большим количеством информации. Без передачи параметра (true/false) функция включает режим отображения так, как установлено в конфигурации.
Script.SetDebug ();
Команда Script.InLogInfo позволяет выводить информацию в журнал в интерфейсе программы и одновременно записывать её в системный журнал. В данном случае будет отметка о том, что сценарий загрузил все необходимые данные и запустился.
Script.InLogInfo ('Старт');

try {
Далее определяется переменная Device класса CDevice, отвечающая за управление нашим устройством приёма звонков (модем, SIP и т.д.). Используется метод Open для устройства с проверкой успешности.
Определяется переменная Info класса CInfo, отвечающая за отображение статистики во вкладке «Журнал». Проводится первый подсчёт статистики на основе выбранных в конфигурации параметров.
   var Device = new CDevice ();

   var Info = new CInfo ();

   if (Device.Open ()) {                                          // Если устройство открыто успешно
Далее определяются переменные: AnswerMode класса CAnswerMode, отвечающая за режим обработки входящих звонков, Time класса CTime, отвечающая за работу с временем и расписание.
      var AnswerMode = new CAnswerMode ();
      var Time       = new CTime       ();
Блок, выполняемый, если есть поиск в базе данных или запись звонков в базу данных.
      if (AnswerMode.IsDatabase ()) {                                // Если есть запись или поиск телефона в базе
Определяется переменная Database класса CDatabase, отвечающая за работу с источником данных. Проверяется соединение с базой данных.
         var Database = new CDatabase ();

         if (Database.Open ()) {                                     // Если соединение с базой данных успешное
Проверяется время наступления работы, если определено расписание.
            while (Time.WaitTime ()) {                               // Выполняем, пока совпадает время работы
При нажатии кнопки «Пауза» ожидается действие пользователя. Если пауза не нажата, выводится в журнал текст «Ожидание входящего звонка...». Если указано расписание работы, то время ожидания звонка определяется функцией Time.TimeOut (), если расписание не включено, то ожидание бесконечное. При входящем звонке (метод WaitForIncoming возвращает ноль) обрабатывается входящий звонок.
               Script.WaitPause ();                                      // Ожидание, если нажали на Паузу

               Script.InLogInfo ('Ожидание входящего звонка...');

               switch (Device.WaitForIncoming (Time.TimeOut (), 1)) {    // Ждем звонка заданное время

                  case 0:                    // Звонок поступил
В переменную Phone заносится номер, с которого поступил входящий звонок (только цифры). Если номер определился, выводим в журнал сообщение о входящем звонке с указанием номера, если не определился, то просто о входящем звонке. Добавляется глобальная переменная сценария Phone, содержащая полученный номер телефона.
                     var Phone = ('' + Device.GetCallerId ()).replace (new RegExp (/[^0-9]*/g), '');

                     if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s поступил', Phone);
                     else                Script.InLogInfo ('Входящий звонок поступил');

                     Script.AddVariable ('Phone', Phone);

                     if (Script.IsStop ()) break;
В переменную StartTime заносится время начала разговора.
Определяется переменная Recording класса CRecording, отвечающая за запись ответа абонента, при соответствующих настройках сценария включается запись разговора.
Определяется переменная DataSearch класса CDataSearch, отвечающая за поиск номера телефона в базе данных.
                     var StartTime = new Date ();                    // Время начала разговора

                     var Recording = new CRecording ();

                     Recording.Start (Device);                       // проверка на включение записи разговора перед сообщением

                     var DataSearch = new CDataSearch ();
При включенном поиске номера телефона в базе данных определяется переменная Record, содержащая записи базы данных с указанным номером телефона. Если записи есть и номер телефона определён, производится переход к произнесению сообщения для найденных номеров телефонов.
                     if (DataSearch.IsSearch ()) {                   // если есть поиск в базе данных

                        var Record = DataSearch.GetRecord (Database, Phone);     // выбираем записи в БД

                        if (Record.Fetch () && Phone) {                          // Нашли телефон, произносим для него сообщение
Определяется переменная Sound класса CSound, отвечающая за произнесение сообщений для найденных номеров ('Found'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение. В статистике добавляется успешно принятый звонок.
                           var Sound = new CSound ('Found');

                           Script.InLogInfo ('Номер абонента найден в базе данных');
                           Script.InLogInfo ('Начало передачи сообщения');
                           Sound.Say (Device, Record);

                           Info.Ok++;                          // добавляем найденный телефон в статистику
                        }
Определяется переменная Sound класса CSound, отвечающая за произнесение сообщений для ненайденных номеров ('NotFound'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение. В статистике добавляется неизвестный принятый звонок.
                        else {                                 // Не нашли, произносим общее для не найденных

                           var Sound = new CSound ('NotFound');

                           Script.InLogInfo ('Номер абонента не найден в базе данных');
                           Script.InLogInfo ('Начало передачи сообщения');
                           Sound.Say (Device, Record);

                           Info.Fail++;                        // добавляем неизвестный телефон в статистику
                        }
Завершается, если была включена, запись разговора, записывается ответ абонента, если в конфигурации определена запись после произнесения сообщения.
                        Recording.Stop (Device, Record);       // Завершаем запись разговора, если была включена
Закрывается соединение с выбранными по номеру телефона записями.
                        Record.Close ();

                     }
Определяется переменная Sound класса CSound, отвечающая за произнесение сообщения для всех входящих без поиска в базе данных ('ForAll'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение.
                     else {                                    // Поиск не включен, произноcим общее сообщение для всех

                        var Sound = new CSound ('ForAll');

                        Script.InLogInfo ('Начало передачи сообщения');

                        Sound.Say (Device, Record);
Завершается, если была включена, запись разговора, записывается ответ абонента, если в конфигурации определена запись после произнесения сообщения. После завершения записи устройство «кладёт трубку».
                        Recording.Stop (Device);               // Завершаем запись разговора, если была включена
                     }

                     Device.HangUp ();                         // Кладём трубку
Увеличивается значение счётчика успешных звонков, обновляется информация в окне статистики.
                     Info.All++;                               // Увеличиваем счетчик принятых звонков в статистике
                     Info.Update (DataSearch.IsSearch ());     // Показываем статистику
Определяется переменная DataWrite класса CDataWrite, отвечающая за запись в базу данных информации о звонке. Если это указано в конфигурации, записывается информация о поступившем звонке в базу данных.
В журнал выводится информация о том, что звонок обработан.
                     var DataWrite = new CDataWrite ();

                     DataWrite.WriteResult (Database, Phone);  // Записываем звонок, если необходимо

                     if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s обработан.', Phone);
                     else                Script.InLogInfo ('Входящий звонок обработан.');

                     break;
В случае, если ожидание прервано пользователем.
                  case 4:
                     break;
               }

               if (Script.IsStop ()) break;
            }

            Database.Close ();      // Закрываем БД
         }
      }
Блок, выполняемый в случае, если нет поиска и записи в базу данных.
      else {                                                   // Без записи и поиска в БД

         while (Time.WaitTime ()) {                            // Выполняем, пока совпадает время работы
При нажатии кнопки «Пауза» ожидается действие пользователя. Если пауза не нажата, выводится в журнал текст «Ожидание входящего звонка...». Если указано расписание работы, то время ожидания звонка определяется функцией Time.TimeOut (), если расписание не включено, то ожидание бесконечное. При входящем звонке (метод WaitForIncoming возвращает ноль) обрабатывается входящий звонок.
            Script.WaitPause ();                                      // Ожидание, если нажали на Паузу

            Script.InLogInfo ('Ожидание входящего звонка...');

            switch (Device.WaitForIncoming (Time.TimeOut (), 1)) {    // Ждем звонка заданное время

               case 0:                    // Звонок поступил
В переменную Phone заносится номер, с которого поступил входящий звонок (только цифры). Если номер определился, выводим в журнал сообщение о входящем звонке с указанием номера, если не определился, то просто о входящем звонке. Добавляется глобальная переменная сценария Phone, содержащая полученный номер телефона.
                  var Phone = ('' + Device.GetCallerId ()).replace (new RegExp (/[^0-9]*/g), '');

                  if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s поступил', Phone);
                  else                Script.InLogInfo ('Входящий звонок поступил');

                  Script.AddVariable ('Phone', Phone);

                  if (Script.IsStop ()) break;
В переменную StartTime заносится время начала разговора.
Определяется переменная Recording класса CRecording, отвечающая за запись ответа абонента, при соответствующих настройках сценария включается запись разговора.
                  var StartTime = new Date ();        // Время начала разговора

                  var Recording = new CRecording ();

                  Recording.Start (Device);           // проверка на включение записи разговора перед сообщением

                  var Sound = new CSound ('ForAll');

                  Sound.Say (Device);

                  Recording.Stop (Device);            // Завершаем запись разговора, если была включена

                  Device.HangUp ();                      // Кладём трубку

                  Info.All++;                            // Увеличиваем счетчик принятых звонков в статистике
                  Info.Update (false);                   // Показываем статистику

                  if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s обработан.', Phone);
                  else                Script.InLogInfo ('Входящий звонок обработан.');

                  break;

               case 4:
                  break;
            }

            if (Script.IsStop ()) break;
         }
      }

      Device.Close ();           // Закрываем устройство
   }
}
catch (Err) {
   Script.InLogError ('Ошибка при работe сценария. %s. Код ошибки: %s', Err.description, Err.number);
   if (Database) Database.Close ();
   if (Device  ) Device.Close ();
}

Script.InLogInfo ('Стоп');