Руководство разработчика

Циклы, определенные в модулях

В подключаемых модулях могут быть определены специальные циклы, которые перебирают некоторые последовательности элементов. Специальные циклы идентифицируются по их именам, следующим за ключевым словом ЦИКЛ.

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

Синтаксис:

ЦИКЛ <имя цикла>(<параметры цикла>)
  <секция цикла>
КОНЕЦ_ЦИКЛА

Пример:

Для примера рассмотрим случай перебора файлов в папке. Пусть задается некоторая маска "MyDir\*.txt" и необходимо перебрать в цикле файлы, которые соответствуют этой маске. Для этой цели в некотором модуле может быть определен цикл с именем ФАЙЛЫ, который реализует зависимый от операционной системы механизм перебора файлов.

Переменная-счетчик в этом случае является выходным параметром строкового типа и будет последовательно принимать значения имен файлов. Другой входной строковый параметр задает маску файлов. При использовании стандартных параметров цикл будет иметь следующий синтаксис:

ЦИКЛ ФАЙЛЫ(ПЕРЕМ СТРОКА: имя_файла; СТРОКА: маска)

Следующий пример иллюстрирует использование описанного цикла ФАЙЛЫ. В цикле выводятся имена найденных файлов. Если не найдено ни одного файла, соответствующего маске, то цикл не выполняется ни разу.

ВЫЧИСЛИТЬ
  ЦИКЛ ФАЙЛЫ(ИмяФайла, "MyDir\*.txt")
    CООБЩЕНИЕ(ИмяФайла)
  КОНЕЦ_ЦИКЛА
КОНЕЦ

При использовании нестандартных параметров цикла в круглых скобках может быть что угодно. Например, для перебора файлов может использоваться следующий синтаксис:

ЦИКЛ ФАЙЛЫ(<имя_файла> = <маска>)

С нестандартными параметрами использование цикла будет выглядеть следующим образом:

ВЫЧИСЛИТЬ
  ЦИКЛ ФАЙЛЫ(ИмяФайла = "MyDir\*.txt")
    CООБЩЕНИЕ(ИмяФайла)
  КОНЕЦ_ЦИКЛА
КОНЕЦ

Циклы с секцией ИНАЧЕ

Некоторые циклы, определенные в модулях, могут поддерживать обработку ошибок, возникающих при инициализации и итерациях цикла. В таких циклах допускается размещение дополнительной секции, начинающейся с ключевого слова ИНАЧЕ и заканчивающейся ключевым словом КОНЕЦ_ЦИКЛА.

Синтаксис:

ЦИКЛ <имя цикла>(<параметры цикла>)
  <секция цикла>
[ ИНАЧЕ  
    <секция обработки ошибки> ]
КОНЕЦ_ЦИКЛА

Допустимость указания секции "иначе" зависит от конкретного цикла. Циклы, поддерживающие секцию "иначе", не требуют ее обязательного указания. При возникновении ошибки в цикле без секции "иначе" (даже если он ее поддерживает) генерируется ошибка времени выполнения.

Какие ошибки при выполнении цикла могут обрабатываться в секции "иначе", а какие безусловно порождают ошибки времени выполнения, зависит от реализации конкретного цикла. Здесь под "выполнением" цикла понимается внутренняя реализация его инициализации (подготовки перебора) и итераций (переключения на следующий элемент перебора). Ошибки, порождаемые операторами секции цикла, никогда не обрабатываются в секции "иначе".

Ошибки, связанные с передачей параметров цикла, обычно не обрабатываются в секции "иначе". Например, несоответствие типов параметров и ожидаемых типов значений.

В секции "иначе" допускается использование операторов управления циклами. Операторы СТОП и ПРОДОЛЖИТЬ прекращают выполнение секции "иначе" (и всего цикла).

Оператор ПОВТОР в секции "иначе" позволяет перезапустить цикл с начала. Эта возможность позволяет сделать несколько попыток выполнения цикла при устранимых ошибках. При перезапуске цикла значения входных параметров цикла не вычисляются снова. Значения выходных параметров сохраняют свои значения на момент возникновения ошибки. Это может быть важно при возникновении ошибки во время итераций цикла, когда значения выходных параметров (параметров-переменных) уже были изменены. При необходимости можно изменить значения этих переменных в секции "иначе" перед оператором ПОВТОР.

Пример:

ВЫЧИСЛИТЬ
  ПЕРЕМ СТРОКА: журнал = "ЖурналХозОпер"
  ПЕРЕМ ФИЛЬТР: фильтр 
  ПЕРЕМ МАСКА_ОПЕР: маска 
  ПЕРЕМ СОРТ_ОПЕР: сортировка 
  ПЕРЕМ ОПЕРАЦИЯ: операция
  
  ПЕРЕМ ЦЕЛОЕ: попытка = 1
  
  ЦИКЛ ОПЕРАЦИИ(журнал, фильтр, маска, сортировка, операция)
    // полезная работа цикла
    ОТЛАДКА(операция)
  ИНАЧЕ
    // обрабатываем ошибку
    ПЕРЕМ СТРОКА: текст
    ПЕРЕМ код = ПОСЛ_ОШИБКА(текст)
    ОТЛАДКА(код)
    ОТЛАДКА(текст)

    // до 3-х попыток повторного выполнения
    ЕСЛИ попытка < 3 ТО
      попытка++
      ПОВТОР // перезапустить цикл
    КОНЕЦ_ЕСЛИ  
  КОНЕЦ_ЦИКЛА
КОНЕЦ

См. также: