Опубликовано: 24.06.2022

Управляющие операторы и директивы языка

Условные операторы

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

В системе «1С:Предприятие» в качестве условного оператора используется оператор ЕслиТогда, который реализует выполнение определённых инструкций при условии, что некоторое логическое выражение (условие) принимает значение «истина». Он может использоваться в паре с операторами ИначеЕслиТогда (их может быть любое количество) и Иначе или без них. Завершает эту конструкцию ключевое слово КонецЕсли. При необходимости условные операторы можно многократно вкладывать друг в друга.

Синтаксис условного оператора:

Если <Логическое_выражение> Тогда
   // операторы, выполняющиеся при истинности данного условия
    . . .
ИначеЕсли <Логическое_выражение> Тогда
   // операторы, выполняющиеся при истинности данного
   // и ложности вышеуказанных условий
    . . .
Иначе
   // операторы, выполняющиеся при ложности вышеуказанных условий
    . . .
КонецЕсли;

Англоязычный вариант:

If <Логическое_выражение> Then
   // операторы, выполняющиеся при истинности данного условия
    . . .
ElsIf <Логическое_выражение> Then
   // операторы, выполняющиеся при истинности данного
   // и ложности вышеуказанных условий
    . . .
Else
   // операторы, выполняющиеся при ложности вышеуказанных условий
    . . .
EndIf;

Пример использования:

Если КолПоСчету = 0 Тогда
   Если ОтборСубконто[1] <> 3 Тогда
      Таб.ВывестиСекцию("Секция_8");
   ИначеЕсли ДанныеПоСубсчетам = 1 Тогда
      Таб.ВывестиСекцию("Секция_21");
   Иначе
      Таб.ВывестиСекцию("Секция_17");
   КонецЕсли;
Иначе
   Если ОтборСубконто[1] <> 3 Тогда
      Таб.ВывестиСекцию("Секция_13");
   Иначе
      Таб.ВывестиСекцию("Секция_18");
   КонецЕсли;
КонецЕсли;

Для организации ветвлений внутри выражений используется системная функция ?(). Чаще всего она применяется в формулах ячеек печатных форм, элементов диалога и типовых операций.

Синтаксис функции:

?(<Логическое_выражение>, <Выражение1>, <Выражение2>)

где

  • <ЛогическоеВыражение> — логическое выражение (условие), истинность которого проверяется;
  • <Выражение1> — выражение, результат вычисления которого станет возвращаемым значением функции при истинности условия;
  • <Выражение2> — выражение, результат вычисления которого станет возвращаемым значением функции при ложности условия.

Пример использования функции:

СерияНомерДокумента = ?(ПустоеЗначение(ФизЛицо.ДокументСерия)=1,"",ФизЛицо.ДокументСерия+", ")+ФизЛицо.ДокументНомер;

Операторы циклов

В системе «1С:Предприятие» существует два вида циклов. Для организации первого вида циклов используется оператор Пока (англоязычный синоним — While). Он предназначен для циклического повторения операторов, находящиеся внутри конструкции ЦиклКонецЦикла. Цикл выполняется пока <логическое выражение>, следующее за ключевым словом Пока, является истинным. Условие выполнения цикла всегда проверяется вначале, перед выполнением цикла (то есть возможна ситуация, что цикл не выполнится ни разу).

Синтаксис:

Пока <логическое выражение> Цикл
   // операторы тела цикла
    . . .
КонецЦикла;

Англоязычный вариант:

While <логическое выражение> Do
   // операторы тела цикла
    . . .
EndDo;

Пример организации цикла:

Док = СоздатьОбъект("Документ.БригадныйНаряд");
// Будем просматривать документы в интервале дат
Док.ВыбратьДокументы('11.01.88', '11.01.99');
// Цикл по всем Документам
Пока Док.ПолучитьДокумент() = 1 Цикл
   // отобразим Документ в строке состояния
   Состояние(Док.Вид() + " " + Док.НомерДок + " " + Док.ДатаДок);
   Док.ВыбратьСтроки();
   // вложенный цикл по всем строкам Документа
   Пока Док.ПолучитьСтроку() > 0 Цикл
      Если Док.КодРабот = 104 Тогда
         Сообщить(" " + Док.НомерДок);
      КонецЕсли;
   КонецЦикла;
КонецЦикла;

Ещё один вид циклов, используемый в системе «1С:Предприятие» — это цикл ДляПо (англоязычный синоним — ForTo). Он также предназначен для циклического повторения операторов, находящиеся внутри конструкции ЦиклКонецЦикла. Перед началом выполнения цикла значение <Выражение1> присваивается переменной <Имя_переменной>. Значение <Имя_переменной> автоматически увеличивается при каждом проходе цикла. Цикл выполняется пока значение переменной <Имя_переменной> меньше или равно значению <Выражение2>. Величина приращения счётчика при каждом выполнении цикла равна 1. Условие выполнения цикла всегда проверяется в начале, перед выполнением цикла (то есть возможна ситуация, что цикл не выполнится ни разу).

Синтаксис:

Для <Имя_переменной> = <Выражение1> По <Выражение2> Цикл
   // операторы тела цикла
    . . .
КонецЦикла;

где

  • <Имя_переменной> — идентификатор переменной (счётчика цикла), значение которой автоматически увеличивается при каждом повторении цикла;
  • <Выражение1> — числовое выражение, которое задаёт начальное значение, присваиваемое счетчику цикла при первом проходе цикла;
  • <Выражение2> — максимальное значение счётчика цикла. Когда переменная <Имя_переменной> становится больше чем <Выражение2>, выполнение оператора цикла прекращается. Величина приращения счетчика при каждом выполнении цикла равна 1.

Англоязычный вариант:

For <Имя_переменной> = <Выражение1> To <Выражение2> Do
   // операторы тела цикла
    . . .
EndDo;

Пример использования:

// Выведем все строки текста
Выв = СоздатьОбъект("Текст");
Выв.Открыть("D:\1S_Base\SSTDB\detail.txt");
Для i = 1 По Выв.КоличествоСтрок() Цикл
   Сообщить(Выв.ПолучитьСтроку(i));
КонецЦикла;

Операторы безусловного перехода

Выполнить безусловную передачу управления на другой оператор программы по указанной метке позволяет оператор Перейти (англоязычный синоним — GoTo). Метка в этом операторе не должна быть меткой перехода на такие операторы, как Процедура или Функция. Область действия оператора Перейти ограничивается программным модулем, процедурой или функцией; он не может передать управление за пределы программного модуля, процедуры или функции. Оператор не может быть также использован для передачи управления на операторы, находящиеся внутри конструкций ЕслиКонецЕсли и ПопыткаКонецПопытки извне этих конструкций, а также на операторы, находящиеся внутри циклов извне этих циклов.

Синтаксис оператора:

Перейти <Метка>;

где <Метка> — специальный идентификатор, начинающийся с символа «~» (тильда) и состоящий из последовательности букв, цифр и символов подчёркивания («_»).

Примечание: Любой исполняемый оператор может иметь метку, используемую в качестве точки перехода в операторе Перейти. Чтобы пометить оператор, надо поместить перед ним метку и следующий за ней символ «:» (двоеточие).

Пример использования:

     // Выведем строки текста
     Выв = СоздатьОбъект("Текст");
     Выв.Открыть("D:\1S_Base\SSTDB\detail.txt");
     Для i = 1 По Выв.КоличествоСтрок() Цикл
        Если i = 10 Тогда
           Перейти ~М1;
        КонецЕсли;
        Сообщить(Выв.ПолучитьСтроку(i));
        Перейти ~М2;
~М1:     Сообщить("Это десятая строка");
~М2: КонецЦикла;

Завершить выполнение процедуры или функции и передать управление в вызвавшую точку программы позволяет оператор безусловного перехода Возврат (англоязычный синоним — Return). Данный оператор обязателен в функции и необязателен в процедуре. Если в процедуре не используется оператор Возврат, то его неявное выполнение происходит вслед за последним исполняемым оператором процедуры.

Синтаксис оператора:

Возврат <ВозвращаемоеЗначение>;

где <ВозвращаемоеЗначение> — выражение, результат которого будет возвращаемым значением функции. Параметр обязателен для оператора Возврат в теле описания функции, но не может использоваться в процедуре.

Пример использования:

Функция ДеньНедели(Номер)
   Если Номер = 1 Тогда
      Возврат "Понедельник";
   ИначеЕсли Номер = 2 Тогда
      Возврат "Вторник";
   ИначеЕсли Номер = 3 Тогда
      Возврат "Среда";
   ИначеЕсли Номер = 4 Тогда
      Возврат "Четверг";
   ИначеЕсли Номер = 5 Тогда
      Возврат "Пятница";
   ИначеЕсли Номер = 6 Тогда
      Возврат "Суббота";
   ИначеЕсли Номер = 7 Тогда
      Возврат "Воскресенье";
   Иначе
      Возврат "Ошибка";
   КонецЕсли;
КонецФункции

Прервать выполнение цикла позволяет безусловный оператор Прервать (англоязычный синоним — Break), вызов которого приводит к немедленному прекращению выполнения цикла и передаче управления первому оператору, следующему за ключевым словом КонецЦикла.

Пример использования:

Функция ПроверитьТипЭлементаАдреса(Стр, ВидЭлемента)
 
   Проверено = 0;
   ТипЭлемента = глТипИзАдреснойСтроки(Стр, ВидЭлемента);
   Если ПустоеЗначение(ТипЭлемента) = 0 Тогда
      ВидПеречисления = Перечисление.ПолучитьАтрибут(ВидЭлемента);
      Для Ном = 1 По ВидПеречисления.КоличествоЗначений() Цикл 
         Если ВидПеречисления.ЗначениеПоНомеру(Ном) = ТипЭлемента Тогда
            Проверено = 1;
            Прервать;
         КонецЕсли;  
      КонецЦикла; 
   КонецЕсли;
	
   Возврат Проверено;

КонецФункции

Изменить порядок выполнение операторов в теле цикла позволяет безусловный оператор Продолжить (англоязычный синоним — Continue), вызов которого приводит к немедленной передаче управления в начало цикла, где производится вычисление и проверка условий выполнения цикла.

Пример использования:

Функция ЕстьДубльЦены()

   ВыборкаЦен = СоздатьОбъект("Справочник.Цены");
   ВыборкаЦен.ИспользоватьВладельца(Владелец);
   ВыборкаЦен.ВыбратьЭлементы();

   Пока ВыборкаЦен.ПолучитьЭлемент() = 1 Цикл
      Если ВыборкаЦен.ТипЦен <> ТипЦен Тогда
         Продолжить;
      КонецЕсли;
      Если Выбран() = 0 Тогда
         // Новый элемент
         Возврат ВыборкаЦен.ТекущийЭлемент();
      Иначе
         // Для сохраненного элемента проверить несовпадение типов цен
         // недостаточно, т.к. из выборки можно получить редактируемый элемент
         Если ТекущийЭлемент() <> ВыборкаЦен.ТекущийЭлемент() Тогда
            Возврат ВыборкаЦен.ТекущийЭлемент();
         КонецЕсли;
      КонецЕсли;
   КонецЦикла;
	
   Возврат "";

КонецФункции   // ЕстьДубльЦены()

Операторы обработки исключений

Оператор обработки исключений ПопыткаИсключениеКонецПопытки управляет выполнением программы, основываясь на возникающих при выполнении модуля ошибочных (исключительных) ситуациях и определяет обработку этих ситуаций. Если при выполнении последовательности каких-либо операторов, стоящих после оператора Попытка, происходит ошибка времени выполнения (RunTimeError), то выполнение оператора, вызвавшего ошибку, прерывается и управление передаётся на первый оператор, стоящий за оператором Исключение. При этом управление будет передано даже в том случае, если ошибку вызвал оператор, находящийся в процедуре или функции, вызванной одним из операторов, стоящих после оператора Попытка. Если ошибка произошла в вызванной процедуре или функции, то её выполнение будет прервано, а локальные переменные уничтожены. Это справедливо для любой вложенности вызовов.

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

Синтаксис оператора обработки исключений:

Попытка
   // какая-то последовательность операторов
    . . .
Исключение
   // обработчик (последовательность операторов,
   // обрабатывающих исключительную ситуацию)
    . . .
КонецПопытки;

Англоязычный вариант:

Try
   // какая-то последовательность операторов
    . . .
Except
   // обработчик (последовательность операторов,
   // обрабатывающих исключительную ситуацию)
    . . .
EndTry;

Пример использования:

Процедура СформироватьВЕхсеl()

   // На тот случай, если программа MS Excel
   // не установлена на компьютере
   Попытка
      // Пытаемся обратиться к программе MS Excel
      ТаблЕхсеl = СоздатьОбъект("Excel.Application");
   Исключение
      Предупреждение(ОписаниеОшибки() +
                     "; Excel не установлен на данном компьютере!");
      Возврат;
   КонецПопытки;

   // Формирование отчета
    . . .

КонецПроцедуры

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

Схема передачи управления при возникновении ошибок

Иногда для того, чтобы при наступлении исключительной ситуации во вложенной конструкции передать управление сразу на внешний обработчик, в тело вложенного обработчика (то есть между операторными скобками ИсключениеКонецПопытки вложенной конструкции) помещают специальный оператор ВызватьИсключение (англоязычный синоним — Raise). Данный оператор позволяет искусственно вызывать исключительные ситуации, и система реагирует на его вызов, как на естественно возникшую ошибку. Параметров этот оператор не имеет и может использоваться только внутри операторных скобок ИсключениеКонецПопытки.

В выдаче диагностики помощь разработчику может оказать встроенная функция ОписаниеОшибки() (англоязычный синоним имени функции — GetErrorDescription()). Эта функция не имеет параметров, а в качестве значения возвращает описание ошибки, такое же, как было бы выдано в окне сообщений, в случае отсутствия обработчика исключительной ситуации, за исключением описания модуля и строки, в которой ошибка возникла. Применять данную функцию имеет смысл только в теле обработчика (то есть внутри операторных скобок ИсключениеКонецПопытки, как это показано в примере выше), так как в ином случае она вернёт пустую строку.

Специальная директива языка

Специальная директива языка #ЗагрузитьИзФайла (англоязычный синоним — #ftLoadFromFile) указывает системе, что загрузку программного модуля следует произвести из указанного файла. Директива должна быть записана в первой строке программного модуля с первой позиции. Остальное содержимое программного модуля конфигурации при этом игнорируется.

Синтаксис:

#ЗагрузитьИзФайла <ИмяФайла>

где <ИмяФайла> — имя файла, содержащего исходный текст программного модуля (записывается без кавычек и скобок).

Примечание: Директива #ЗагрузитьИзФайла является не оператором, а специальной конструкцией, поэтому не должна заканчиваться точкой с запятой.

Использование директивы рекомендуется для отладки, чтобы быстро отлаживать код какого-либо программного модуля без промежуточного сохранения всей конфигурации. Считывание текста файла и его компиляция происходит в момент открытия окна формы (документа, отчёта и т.д.). Таким образом, в режиме исполнения, после внесения изменений и записи файла, содержащего текст модуля, следует просто закрыть и открыть окно формы заново. Внесенные в текст файла изменения сразу сработают.

Для редактирования собственно файла, откуда загружается текст программного модуля, можно использовать встроенный текстовый редактор системы «1С:Предприятие», открывая его через главное меню «Файл -> Открыть». Далее, если выбрать в главном меню «Действия -> Текст модуля», то это позволит при редактировании использовать свойства контекстного выделения цветом синтаксических конструкций языка и установленную для программных модулей ширину табуляции.

После окончания отладки текста программного модуля в файле, следует перенести этот текст из файла в программный модуль конфигурации.

Пример записи директивы:

#ЗагрузитьИзФайла new_mod.txt

Другие статьи по схожей тематике