Scripts (версия 3.xx)/Отправка SMS: различия между версиями

Материал из Call Office Wiki
Перейти к навигации Перейти к поиску
 
(не показано 7 промежуточных версий этого же участника)
Строка 1: Строка 1:
:Первая часть скрипта подготавливает классы и объекты, необходимые для работы скрипта. Описание дано в комментариях к каждой строке за исключением класса Script, который отвечает за непосредственное выполнение скрипта.
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
eval (GetFileContent ('Common\\Classes\\Script.js'));
eval (GetFileContent ('Common\\Classes\\Script.js'));             // необходимо для работоспособности сценария
var Script = new Script ();
var Script = new Script ();                                       // необходимо для работоспособности сценария


eval (Script.GetFileContent ('Common\\Classes\\Database.js'));
// =================== Подключение модулей ===================
eval (Script.GetFileContent ('Common\\Classes\\Time.js'));
eval (Script.GetFileContent ('Common\\Classes\\Device.js'));
eval (Script.GetFileContent ('Common\\Classes\\SMS.js'));
eval (Script.GetFileContent ('Common\\Classes\\DataRead.js'));


eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\Info.js'));
eval (Script.GetFileContent ('Common\\Classes\\Database.js'));                  // База данных
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\CDataWriteSMS.js'));
eval (Script.GetFileContent ('Common\\Classes\\Time.js'));                       // Расписание
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\COptions.js'));
eval (Script.GetFileContent ('Common\\Classes\\Device.js'));                    // Устройство
eval (Script.GetFileContent ('Common\\Classes\\SMS.js'));                       // Обработка SMS
eval (Script.GetFileContent ('Common\\Classes\\DataRead.js'));                   // Чтение данных


// локальные модули для конкретного решения
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\Info.js'));            // Информация и статистика
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\CDataWriteSMS.js'));    // Запись данных
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\COptions.js'));        // Расширенные настройки
// =================== Начало работы сценария ===================
</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''', отвечающая за управление нашим устройством рассылки сообщений (модем, SMS-шлюз). Используется метод [[Объект_Device/Методы/Open|Open]] для устройства с проверкой успешности.
<syntaxhighlight lang="javascript">
   var Device  = new CDevice ();
   var Device  = new CDevice ();


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


       Script.InLogDebug ('Устройство открыто успешно');
       Script.InLogDebug ('Устройство открыто успешно');
</syntaxhighlight>


:Определяется переменная '''Options''' класса '''COptions''', отвечающая за управление нашим устройством рассылки сообщений (модем, SMS-шлюз). Используется метод [[Объект_Device/Методы/Open|Open]] для устройства с проверкой успешности.
:Устанавливается в единицу переменная '''CycleCount''', отвечающая за количество сеансов обзвона.
<syntaxhighlight lang="javascript">
       var Options = new COptions ();
       var Options = new COptions ();


       var CycleCount = 1;
       var CycleCount = 1;
</syntaxhighlight>


:Определяется переменная '''DataRead''' класса '''CDataRead''', отвечающая за получение данных из базы данных, проверяется переменная '''CycleCount''' на превышение значения. Если переменная не превышает значения, записанного в конфигурации, пишется сообщение в журнал о порядковом номере цикла рассылки в текущем сеансе.
<syntaxhighlight lang="javascript">
       var DataRead = new CDataRead ();
       var DataRead = new CDataRead ();


       while (DataRead.CheckCycle (CycleCount)) {   // Проверка количества попыток обзвона в сеансе
       while (DataRead.CheckCycle (CycleCount)) {                           // Проверка количества попыток обзвона в сеансе


         Script.InLogInfo ('Цикл рассылки <b>%s</b>', CycleCount);
         Script.InLogInfo ('Цикл рассылки <b>%s</b>', CycleCount);
</syntaxhighlight>


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


         if (Database.Open ()) {
         if (Database.Open ()) {                                           // Если соединение с базой данных успешное
</syntaxhighlight>


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


             if (Info.Count (Database, DataRead)) {
             if (Info.Count (Database, DataRead)) {
</syntaxhighlight>
:Определяется переменная '''Record''', содержащая набор методов и свойств работы с выборкой запроса, делается проверка на её корректность.


               var Record = Database.Query (DataRead.Query ());     // Выбор записей в базе данных
<syntaxhighlight lang="javascript">
               var Record = Database.Query (DataRead.Query ());           // Выбор записей в базе данных
               if (Record) {
               if (Record) {
</syntaxhighlight>
:Определяется переменная '''DataWriteSMS''' класса '''CDataWritSMSe''', отвечающая за запись результатов в базу данных. Проверяется наличие полей в источнике данных, необходимых для чтения и/или записи данных во время выполнения сценария.


<syntaxhighlight lang="javascript">
                   var DataWriteSMS = new CDataWriteSMS ();
                   var DataWriteSMS = new CDataWriteSMS ();


                   if (DataRead.CheckFields  (Record) &&
                   if (DataRead.CheckFields  (Record) &&
                       DataWriteSMS.CheckFields (Record)) {
                       DataWriteSMS.CheckFields (Record)) {
</syntaxhighlight>


:Запускается цикл рассылки для выбранных записей базы данных.
<syntaxhighlight lang="javascript">
                     while (Record.Fetch ()) {
                     while (Record.Fetch ()) {


                         Script.WaitPause ();                              // Ожидание, если нажали на Паузу
                         Script.WaitPause ();                              // Ожидание, если нажали на Паузу


                         Info.DataShow (Record);
                         Info.DataShow (Record);                           // Показываем текущую запись в информационном окне
</syntaxhighlight>
 
:Определяется переменная '''Time''' класса '''CTime''', отвечающая за работу с временем и расписание.
 
:Устанавливается пустое значение для переменной '''Status''', в которую записывается результат отправления сообщения.


<syntaxhighlight lang="javascript">
                         var Time = new CTime ();
                         var Time = new CTime ();


Строка 60: Строка 114:


                           var Status = '';
                           var Status = '';
</syntaxhighlight>


:Определяется массив '''Phone''', содержащий номера очередных телефонов из базы данных. Даже если не указан параметр «Несколько номеров в ячейке», всё равно приходит в виде массива.
<syntaxhighlight lang="javascript">
                           var Phone = DataRead.GetPhone (Record);
                           var Phone = DataRead.GetPhone (Record);


Строка 68: Строка 126:
                                                                   // и не достигнут предел количества попыток
                                                                   // и не достигнут предел количества попыток
                                 try {
                                 try {
</syntaxhighlight>


:Запускается цикл внутри массива '''Phone'''.
:Проверяется и выполняется, если задано, ожидание перед отправкой очередного сообщения.
<syntaxhighlight lang="javascript">
                                     for (var i in Phone) {
                                     for (var i in Phone) {


                                       if (DataRead.WaitBeforeCall ()) {    // Ожидание перед звонком
                                       if (DataRead.WaitBeforeCall ()) {    // Ожидание перед звонком
</syntaxhighlight>


:Определяется переменная '''SMS''' класса '''CSMS''', отвечающая за с сообщениями. В переменную '''TextSMS''' заносится текст сообщения для текущего абонента. При условии, что текст сообщения не пуст, запускается процесс рассылки.
<syntaxhighlight lang="javascript">
                                           var SMS = new CSMS ();
                                           var SMS = new CSMS ();


Строка 78: Строка 146:


                                           if (!empty (TextSMS)) {
                                           if (!empty (TextSMS)) {
</syntaxhighlight>


:Устанавливается статус текущей рассылки в переменной '''PhoneStatus'''.
<syntaxhighlight lang="javascript">
                                             var PhoneStatus = 'OK';
                                             var PhoneStatus = 'OK';
</syntaxhighlight>


:Происходит отправка сообщения и вывод в журнал результата, который вернул метод [[Объект_Device/Методы/SendSMS|'''SendSMS''']].
<syntaxhighlight lang="javascript">
                                             switch (Device.SendSMS (Phone[i], TextSMS, SMS.GetSender ())) {
                                             switch (Device.SendSMS (Phone[i], TextSMS, SMS.GetSender ())) {
                                                 case 0:  Script.InLogInfo ('Сообщение по номеру %s отправлено успешно', Phone[i]); break;
                                                 case 0:  Script.InLogInfo ('Сообщение по номеру %s отправлено успешно', Phone[i]); break;
Строка 87: Строка 163:
                                                 default: PhoneStatus = 'Ошибка отправки сообщения'; break;
                                                 default: PhoneStatus = 'Ошибка отправки сообщения'; break;
                                             }
                                             }
</syntaxhighlight>
:Вносится, если необходимо, результат текущей рассылки в переменную '''Status'''.


                                             if (Status != 'OK') Status = PhoneStatus; // Статус записи
:Проверяется необходимость при успешной рассылке рассылать сообщения по оставшимся номерам в ячеке.
 
:Проверяется остановка скрипта пользователем.
 
<syntaxhighlight lang="javascript">
                                             if (Status != 'OK') Status = PhoneStatus;     // Статус записи


                                             if (DataRead.IsRemaining (PhoneStatus)) break; // Если удачный дозвон
                                             if (DataRead.IsRemaining (PhoneStatus)) break; // Если удачный дозвон
Строка 94: Строка 178:
                                                                                             // по оставшимся номерам в ячейке
                                                                                             // по оставшимся номерам в ячейке
                                             if (Script.IsStop ()) break;
                                             if (Script.IsStop ()) break;
</syntaxhighlight>
:В случае, если пустой текст сообщения, выводится соответствующее сообщение в журнал и останавливается выполнение сценария.
<syntaxhighlight lang="javascript">


                                           } else Script.StopError ('Отсутствует текст сообщения. Выполнение сценария прервано.');
                                           } else Script.StopError ('Отсутствует текст сообщения. Выполнение сценария прервано.');


                                           if (!Record.SetStatus (Status)) break;
                                           if (!DataWriteSMS.SetStatus (Record, Phone[i],Status)) break;


                                       }
                                       }
Строка 106: Строка 195:
                                     if (Script.IsStop ()) break;
                                     if (Script.IsStop ()) break;
                                 }
                                 }
</syntaxhighlight>
:При возникновении ошибки в выполнении сценария выводится в журнал сообщение об ошибке и останавливается выполнение сценария.
<syntaxhighlight lang="javascript">
                                 catch (Err) {
                                 catch (Err) {
                                     Status = Err.description;
                                     Status = Err.description;
                                     Script.StopError ('Ошибка в процессе отправки сообщений. ' + Err.description);
                                     Script.StopError ('Ошибка в процессе отправки сообщений. ' + Err.description);
                                 }
                                 }
</syntaxhighlight>


:Записывается при необходимости статус рассылки в базу данных, обновляется информация в окне статистики.
<syntaxhighlight lang="javascript">
                                 DataWriteSMS.SetStatus (Record, DataRead.GetPhone (Record, true), Status); // Запись результата звонка
                                 DataWriteSMS.SetStatus (Record, DataRead.GetPhone (Record, true), Status); // Запись результата звонка
                                 Info.Update (Status);
                                 Info.Update (Status);
                               }
                               }
</syntaxhighlight>
:Останавливается скрипт, если пуст номер телефона. Выводится соответствующее сообщение в журнал.
<syntaxhighlight lang="javascript">
                           } else Script.StopError ('Номер телефона пуст.');
                           } else Script.StopError ('Номер телефона пуст.');
</syntaxhighlight>
:Если устройство не готово, ожидание в течение 1 секунды, затем проверка на остановку
<syntaxhighlight lang="javascript">
                         } else Device.Wait (1000);
                         } else Device.Wait (1000);


                         if (Script.IsStop ()) break;
                         if (Script.IsStop ()) break;
</syntaxhighlight>
:Переход к следующей записи в базе данных.
<syntaxhighlight lang="javascript">


                         Record.Next ();
                         Record.Next ();
Строка 123: Строка 236:


                     if (Script.IsStop ()) break;
                     if (Script.IsStop ()) break;
</syntaxhighlight>
:Если проверка на наличие необходимых полей в базе данных не прошла, закрывается выборка. Если нужна остановка, завершается цикл.
<syntaxhighlight lang="javascript">
                   } // Отсутствуют необходимые поля базы данных
                   } // Отсутствуют необходимые поля базы данных


                   Record.Close ();
                   Record.Close ();
                   if (Script.IsStop ()) break;
                   if (Script.IsStop ()) break;
</syntaxhighlight>
:Не получены записи из базы данных. Выполнение сценария остановлено, соответствующее сообщение записывается в журнал.
<syntaxhighlight lang="javascript">
               } else Script.InLogError ('Ошибка получения данных для отправки сообщения');
               } else Script.InLogError ('Ошибка получения данных для отправки сообщения');
</syntaxhighlight>
:Ни одна запись в базе данных не соответствует условиям выполнения. Соответствующее сообщение записывается в журнал, закрывается соединение с базой данных.
<syntaxhighlight lang="javascript">
             } else Script.InLogInfo ('Отсутствуют кандидаты на отправку SMS');
             } else Script.InLogInfo ('Отсутствуют кандидаты на отправку SMS');


             Database.Close ();
             Database.Close ();
         }
         }
</syntaxhighlight>
:Увеличивается значение счетчика циклов '''CycleCount'''. Проводится проверка на остановку сценария.


<syntaxhighlight lang="javascript">
         CycleCount++;
         CycleCount++;


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


:Соединение с устройством закрывается. Конец цикла.
<syntaxhighlight lang="javascript">
       Device.Close ();
       Device.Close ();
   }
   }
}
}
</syntaxhighlight>
:Обработка ошибки выполнения сценария. Запись соответствующего сообщения в журнал. Закрытие соединения с базой данных. Закрытие устройства.
<syntaxhighlight lang="javascript">
catch (Err) {
catch (Err) {
   Script.InLogError ('Ошибка при работe сценария. %s. Код ошибки: %s', Err.description, Err.number);
   Script.InLogError ('Ошибка при работe сценария. %s. Код ошибки: %s', Err.description, Err.number);
Строка 146: Строка 287:
   if (Device  ) Device.Close ();
   if (Device  ) Device.Close ();
}
}
</syntaxhighlight>
:Выводится в журнал метка остановки выполнения сценария.


<syntaxhighlight lang="javascript">
Script.InLogInfo ('Стоп');
Script.InLogInfo ('Стоп');
</syntaxhighlight>
</syntaxhighlight>


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

Текущая версия на 10:04, 5 февраля 2014

Первая часть скрипта подготавливает классы и объекты, необходимые для работы скрипта. Описание дано в комментариях к каждой строке за исключением класса 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\\Device.js'));                     // Устройство
eval (Script.GetFileContent ('Common\\Classes\\SMS.js'));                        // Обработка SMS
eval (Script.GetFileContent ('Common\\Classes\\DataRead.js'));                   // Чтение данных

// локальные модули для конкретного решения
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\Info.js'));             // Информация и статистика
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\CDataWriteSMS.js'));    // Запись данных
eval (Script.GetFileContent ('Solutions\\Basic\\SendSMS\\COptions.js'));         // Расширенные настройки

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

try {
Далее определяется переменная Device класса CDevice, отвечающая за управление нашим устройством рассылки сообщений (модем, SMS-шлюз). Используется метод Open для устройства с проверкой успешности.
   var Device   = new CDevice ();

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

      Script.InLogDebug ('Устройство открыто успешно');
Определяется переменная Options класса COptions, отвечающая за управление нашим устройством рассылки сообщений (модем, SMS-шлюз). Используется метод Open для устройства с проверкой успешности.
Устанавливается в единицу переменная CycleCount, отвечающая за количество сеансов обзвона.
      var Options = new COptions ();

      var CycleCount = 1;
Определяется переменная DataRead класса CDataRead, отвечающая за получение данных из базы данных, проверяется переменная CycleCount на превышение значения. Если переменная не превышает значения, записанного в конфигурации, пишется сообщение в журнал о порядковом номере цикла рассылки в текущем сеансе.
      var DataRead = new CDataRead ();

      while (DataRead.CheckCycle (CycleCount)) {                           // Проверка количества попыток обзвона в сеансе

         Script.InLogInfo ('Цикл рассылки <b>%s</b>', CycleCount);
Определяется переменная Database класса CDatabase, отвечающая за работу с источником данных. Проверяется соединение с базой данных.
         var Database = new CDatabase ();

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

            if (Info.Count (Database, DataRead)) {
Определяется переменная Record, содержащая набор методов и свойств работы с выборкой запроса, делается проверка на её корректность.
               var Record = Database.Query (DataRead.Query ());            // Выбор записей в базе данных
               if (Record) {
Определяется переменная DataWriteSMS класса CDataWritSMSe, отвечающая за запись результатов в базу данных. Проверяется наличие полей в источнике данных, необходимых для чтения и/или записи данных во время выполнения сценария.
                  var DataWriteSMS = new CDataWriteSMS ();

                  if (DataRead.CheckFields  (Record) &&
                      DataWriteSMS.CheckFields (Record)) {
Запускается цикл рассылки для выбранных записей базы данных.
                     while (Record.Fetch ()) {

                        Script.WaitPause ();                               // Ожидание, если нажали на Паузу

                        Info.DataShow (Record);                            // Показываем текущую запись в информационном окне
Определяется переменная Time класса CTime, отвечающая за работу с временем и расписание.
Устанавливается пустое значение для переменной Status, в которую записывается результат отправления сообщения.
                        var Time = new CTime ();

                        if (Time.CheckTime ()) { // Проверка расписания

                           var Status = '';
Определяется массив Phone, содержащий номера очередных телефонов из базы данных. Даже если не указан параметр «Несколько номеров в ячейке», всё равно приходит в виде массива.
                           var Phone = DataRead.GetPhone (Record);

                           if (!empty (Phone)) {   // Если номер телефона не пуст

                              if (!DataRead.CheckIsOK (Record)) { // Если статус - не прозвонен
                                                                  // и не достигнут предел количества попыток
                                 try {
Запускается цикл внутри массива Phone.
Проверяется и выполняется, если задано, ожидание перед отправкой очередного сообщения.
                                    for (var i in Phone) {

                                       if (DataRead.WaitBeforeCall ()) {    // Ожидание перед звонком
Определяется переменная SMS класса CSMS, отвечающая за с сообщениями. В переменную TextSMS заносится текст сообщения для текущего абонента. При условии, что текст сообщения не пуст, запускается процесс рассылки.
                                          var SMS = new CSMS ();

                                          var TextSMS = SMS.GetText (Record);

                                          if (!empty (TextSMS)) {
Устанавливается статус текущей рассылки в переменной PhoneStatus.
                                             var PhoneStatus = 'OK';
Происходит отправка сообщения и вывод в журнал результата, который вернул метод SendSMS.
                                             switch (Device.SendSMS (Phone[i], TextSMS, SMS.GetSender ())) {
                                                case 0:  Script.InLogInfo ('Сообщение по номеру %s отправлено успешно', Phone[i]); break;
                                                case 4:  PhoneStatus = 'Отправка сообщения прервана пользователем'; break;
                                                case 5:  PhoneStatus = 'Истекло время ожидания отправки сообщения абоненту ' + Phone[i]; break;
                                                default: PhoneStatus = 'Ошибка отправки сообщения'; break;
                                             }
Вносится, если необходимо, результат текущей рассылки в переменную Status.
Проверяется необходимость при успешной рассылке рассылать сообщения по оставшимся номерам в ячеке.
Проверяется остановка скрипта пользователем.
                                             if (Status != 'OK') Status = PhoneStatus;      // Статус записи

                                             if (DataRead.IsRemaining (PhoneStatus)) break; // Если удачный дозвон
                                                                                            // и не включен параметр звонить
                                                                                            // по оставшимся номерам в ячейке
                                             if (Script.IsStop ()) break;
В случае, если пустой текст сообщения, выводится соответствующее сообщение в журнал и останавливается выполнение сценария.
                                          } else Script.StopError ('Отсутствует текст сообщения. Выполнение сценария прервано.');

                                          if (!DataWriteSMS.SetStatus (Record, Phone[i],Status)) break;

                                       }

                                       if (Script.IsStop ()) break;
                                    }

                                    if (Script.IsStop ()) break;
                                 }
При возникновении ошибки в выполнении сценария выводится в журнал сообщение об ошибке и останавливается выполнение сценария.
                                 catch (Err) {
                                    Status = Err.description;
                                    Script.StopError ('Ошибка в процессе отправки сообщений. ' + Err.description);
                                 }
Записывается при необходимости статус рассылки в базу данных, обновляется информация в окне статистики.
                                 DataWriteSMS.SetStatus (Record, DataRead.GetPhone (Record, true), Status); // Запись результата звонка
                                 Info.Update (Status);
                              }
Останавливается скрипт, если пуст номер телефона. Выводится соответствующее сообщение в журнал.
                           } else Script.StopError ('Номер телефона пуст.');
Если устройство не готово, ожидание в течение 1 секунды, затем проверка на остановку
                        } else Device.Wait (1000);

                        if (Script.IsStop ()) break;
Переход к следующей записи в базе данных.
                         Record.Next ();
                     }

                     if (Script.IsStop ()) break;
Если проверка на наличие необходимых полей в базе данных не прошла, закрывается выборка. Если нужна остановка, завершается цикл.
                  } // Отсутствуют необходимые поля базы данных

                  Record.Close ();
                  if (Script.IsStop ()) break;
Не получены записи из базы данных. Выполнение сценария остановлено, соответствующее сообщение записывается в журнал.
               } else Script.InLogError ('Ошибка получения данных для отправки сообщения');
Ни одна запись в базе данных не соответствует условиям выполнения. Соответствующее сообщение записывается в журнал, закрывается соединение с базой данных.
            } else Script.InLogInfo ('Отсутствуют кандидаты на отправку SMS');

            Database.Close ();
         }
Увеличивается значение счетчика циклов CycleCount. Проводится проверка на остановку сценария.
         CycleCount++;

         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 ('Стоп');