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

Материал из Call Office Wiki
Перейти к навигации Перейти к поиску
(Новая страница: « Category:Помощь (версия 3.xx)»)
 
 
(не показано 7 промежуточных версий этого же участника)
Строка 1: Строка 1:
:Первая часть скрипта подготавливает классы и объекты, необходимые для работы скрипта. Описание дано в комментариях к каждой строке за исключением класса Script, который отвечает за непосредственное выполнение скрипта.
<syntaxhighlight lang="javascript">
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')); // Режим обработки входящего звонка
// =================== Начало работы сценария ===================
</syntaxhighlight>
:Командой '''Script.SetDebug''' включается/отключается режим вывода дополнительных отладочных сообщений во время работы сценария. Как правило, это излишняя информация. Включать данный параметр рекомендуется только в случае, если сценарий выполняется некорректно и надо отправить разработчикам журнал с большим количеством информации. Без передачи параметра (true/false) функция включает режим отображения так, как установлено в конфигурации.
<syntaxhighlight lang="javascript">
Script.SetDebug ();
</syntaxhighlight>
:Команда '''Script.InLogInfo''' позволяет выводить информацию в журнал в интерфейсе программы и одновременно записывать её в системный журнал. В данном случае будет отметка о том, что сценарий загрузил все необходимые данные и запустился.
<syntaxhighlight lang="javascript">
Script.InLogInfo ('Старт');
try {
</syntaxhighlight>
:Далее определяется переменная '''Device''' класса '''CDevice''', отвечающая за управление нашим устройством приёма звонков (модем, SIP и т.д.). Используется метод [[Объект_Device/Методы/Open|Open]] для устройства с проверкой успешности.
:Определяется переменная '''Info''' класса '''CInfo''', отвечающая за отображение статистики во вкладке [[Запуск конфигурации_(версия_3.xx)|«Журнал»]]. Проводится первый подсчёт статистики на основе выбранных в конфигурации параметров.
<syntaxhighlight lang="javascript">
  var Device = new CDevice ();
  var Info = new CInfo ();
  if (Device.Open ()) {                                          // Если устройство открыто успешно
</syntaxhighlight>
:Далее определяются переменные: '''AnswerMode''' класса '''CAnswerMode''', отвечающая за режим обработки входящих звонков, '''Time''' класса '''CTime''', отвечающая за работу с временем и расписание.
<syntaxhighlight lang="javascript">
      var AnswerMode = new CAnswerMode ();
      var Time      = new CTime      ();
</syntaxhighlight>
:Блок, выполняемый, если есть поиск в базе данных или запись звонков в базу данных.
<syntaxhighlight lang="javascript">
      if (AnswerMode.IsDatabase ()) {                                // Если есть запись или поиск телефона в базе
</syntaxhighlight>
:Определяется переменная '''Database''' класса '''CDatabase''', отвечающая за работу с источником данных. Проверяется соединение с базой данных.
<syntaxhighlight lang="javascript">
        var Database = new CDatabase ();
        if (Database.Open ()) {                                    // Если соединение с базой данных успешное
</syntaxhighlight>
:Проверяется время наступления работы, если определено расписание.
<syntaxhighlight lang="javascript">
            while (Time.WaitTime ()) {                              // Выполняем, пока совпадает время работы
</syntaxhighlight>
:При нажатии кнопки «Пауза» ожидается действие пользователя. Если пауза не нажата, выводится в журнал текст «Ожидание входящего звонка...». Если указано расписание работы, то время ожидания звонка определяется функцией '''Time.TimeOut ()''', если расписание не включено, то ожидание бесконечное. При входящем звонке (метод [[Объект_Device/Методы/WaitForIncoming|WaitForIncoming]] возвращает ноль) обрабатывается входящий звонок.
<syntaxhighlight lang="javascript">
              Script.WaitPause ();                                      // Ожидание, если нажали на Паузу
              Script.InLogInfo ('Ожидание входящего звонка...');
              switch (Device.WaitForIncoming (Time.TimeOut (), 1)) {    // Ждем звонка заданное время
                  case 0:                    // Звонок поступил
</syntaxhighlight>
:В переменную '''Phone''' заносится номер, с которого поступил входящий звонок (только цифры). Если номер определился, выводим в журнал сообщение о входящем звонке с указанием номера, если не определился, то просто о входящем звонке. Добавляется глобальная переменная сценария '''Phone''', содержащая полученный номер телефона.
<syntaxhighlight lang="javascript">
                    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;
</syntaxhighlight>
:В переменную '''StartTime''' заносится время начала разговора.
:Определяется переменная '''Recording''' класса '''CRecording''', отвечающая за запись ответа абонента, при соответствующих настройках сценария включается запись разговора.
:Определяется переменная '''DataSearch''' класса '''CDataSearch''', отвечающая за поиск номера телефона в базе данных.
<syntaxhighlight lang="javascript">
                    var StartTime = new Date ();                    // Время начала разговора
                    var Recording = new CRecording ();
                    Recording.Start (Device);                      // проверка на включение записи разговора перед сообщением
                    var DataSearch = new CDataSearch ();
</syntaxhighlight>
:При включенном поиске номера телефона в базе данных определяется переменная '''Record''', содержащая записи базы данных с указанным номером телефона. Если записи есть и номер телефона определён, производится переход к произнесению сообщения для найденных номеров телефонов.
<syntaxhighlight lang="javascript">
                    if (DataSearch.IsSearch ()) {                  // если есть поиск в базе данных
                        var Record = DataSearch.GetRecord (Database, Phone);    // выбираем записи в БД
                        if (Record.Fetch () && Phone) {                          // Нашли телефон, произносим для него сообщение
</syntaxhighlight>
:Определяется переменная '''Sound''' класса '''CSound''', отвечающая за произнесение сообщений для найденных номеров ('Found'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение. В статистике добавляется успешно принятый звонок.
<syntaxhighlight lang="javascript">
                          var Sound = new CSound ('Found');
                          Script.InLogInfo ('Номер абонента найден в базе данных');
                          Script.InLogInfo ('Начало передачи сообщения');
                          Sound.Say (Device, Record);
                          Info.Ok++;                          // добавляем найденный телефон в статистику
                        }
</syntaxhighlight>
:Определяется переменная '''Sound''' класса '''CSound''', отвечающая за произнесение сообщений для ненайденных номеров ('NotFound'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение. В статистике добавляется неизвестный принятый звонок.
<syntaxhighlight lang="javascript">
                        else {                                // Не нашли, произносим общее для не найденных
                          var Sound = new CSound ('NotFound');
                          Script.InLogInfo ('Номер абонента не найден в базе данных');
                          Script.InLogInfo ('Начало передачи сообщения');
                          Sound.Say (Device, Record);
                          Info.Fail++;                        // добавляем неизвестный телефон в статистику
                        }
</syntaxhighlight>
:Завершается, если была включена, запись разговора, записывается ответ абонента, если в конфигурации определена запись после произнесения сообщения.
<syntaxhighlight lang="javascript">
                        Recording.Stop (Device, Record);      // Завершаем запись разговора, если была включена
</syntaxhighlight>
:Закрывается соединение с выбранными по номеру телефона записями.
<syntaxhighlight lang="javascript">
                        Record.Close ();
                    }
</syntaxhighlight>
:Определяется переменная '''Sound''' класса '''CSound''', отвечающая за произнесение сообщения для всех входящих без поиска в базе данных ('ForAll'). Выводится сообщение в журнал о произнесении сообщения и произносится определённое конфигурацией звуковое сообщение.
<syntaxhighlight lang="javascript">
                    else {                                    // Поиск не включен, произноcим общее сообщение для всех
                        var Sound = new CSound ('ForAll');
                        Script.InLogInfo ('Начало передачи сообщения');
                        Sound.Say (Device, Record);
</syntaxhighlight>
:Завершается, если была включена, запись разговора, записывается ответ абонента, если в конфигурации определена запись после произнесения сообщения. После завершения записи устройство «кладёт трубку».
<syntaxhighlight lang="javascript">
                        Recording.Stop (Device);              // Завершаем запись разговора, если была включена
                    }
                    Device.HangUp ();                        // Кладём трубку
</syntaxhighlight>
:Увеличивается значение счётчика успешных звонков, обновляется информация в окне статистики.
<syntaxhighlight lang="javascript">
                    Info.All++;                              // Увеличиваем счетчик принятых звонков в статистике
                    Info.Update (DataSearch.IsSearch ());    // Показываем статистику
</syntaxhighlight>
:Определяется переменная '''DataWrite''' класса '''CDataWrite''', отвечающая за запись в базу данных информации о звонке. Если это указано в конфигурации, записывается информация о поступившем звонке в базу данных.
:В журнал выводится информация о том, что звонок обработан.
<syntaxhighlight lang="javascript">
                    var DataWrite = new CDataWrite ();
                    DataWrite.WriteResult (Database, Phone);  // Записываем звонок, если необходимо
                    if (!empty (Phone)) Script.InLogInfo ('Входящий звонок от %s обработан.', Phone);
                    else                Script.InLogInfo ('Входящий звонок обработан.');
                    break;
</syntaxhighlight>
:В случае, если ожидание прервано пользователем.
<syntaxhighlight lang="javascript">
                  case 4:
                    break;
              }
              if (Script.IsStop ()) break;
            }
            Database.Close ();      // Закрываем БД
        }
      }
</syntaxhighlight>
:Блок, выполняемый в случае, если нет поиска и записи в базу данных.
<syntaxhighlight lang="javascript">
      else {                                                  // Без записи и поиска в БД
        while (Time.WaitTime ()) {                            // Выполняем, пока совпадает время работы
</syntaxhighlight>
:При нажатии кнопки «Пауза» ожидается действие пользователя. Если пауза не нажата, выводится в журнал текст «Ожидание входящего звонка...». Если указано расписание работы, то время ожидания звонка определяется функцией '''Time.TimeOut ()''', если расписание не включено, то ожидание бесконечное. При входящем звонке (метод [[Объект_Device/Методы/WaitForIncoming|WaitForIncoming]] возвращает ноль) обрабатывается входящий звонок.
<syntaxhighlight lang="javascript">
            Script.WaitPause ();                                      // Ожидание, если нажали на Паузу
            Script.InLogInfo ('Ожидание входящего звонка...');
            switch (Device.WaitForIncoming (Time.TimeOut (), 1)) {    // Ждем звонка заданное время
              case 0:                    // Звонок поступил
</syntaxhighlight>
:В переменную '''Phone''' заносится номер, с которого поступил входящий звонок (только цифры). Если номер определился, выводим в журнал сообщение о входящем звонке с указанием номера, если не определился, то просто о входящем звонке. Добавляется глобальная переменная сценария '''Phone''', содержащая полученный номер телефона.
<syntaxhighlight lang="javascript">
                  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;
</syntaxhighlight>
:В переменную '''StartTime''' заносится время начала разговора.
:Определяется переменная '''Recording''' класса '''CRecording''', отвечающая за запись ответа абонента, при соответствующих настройках сценария включается запись разговора.
<syntaxhighlight lang="javascript">
                  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 ('Стоп');
</syntaxhighlight>


[[Category:Помощь (версия 3.xx)]]
[[Category:Помощь (версия 3.xx)]]

Текущая версия на 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 ('Стоп');