рубрики: Язык программирования 1С | Дата: 5 мая, 2017
В любом языке программирования существуют операторы ветвления (условные операторы). Когда в зависимости от истинности некоторого условия выполняется один либо другой набор команд.
В языке программирования 1С этой цели служит конструкция
Если <Логическое выражение> Тогда
//Набор команд 1
ИначеЕсли <Логическое выражение> Тогда
//Набор команд 2
Иначе
//Набор команд 3
КонецЕсли;
Алгоритм работы достаточно прост. По очереди проверяются логические выражения следующие за операторами Если и ИначеЕсли. Как только очередное логическое выражение принимает значение Истина выполняется набор команд, следующих за этим логическим выражением. Больше никаких проверок не делается и выполнение блока Если…КонецЕсли; на этом завершается. Если у всех логических выражений значение оказалось Ложь, будет выполнен набор команд, следующих за оператором Иначе.
Конструкция ИначеЕсли <Логическое выражение> Тогда может повторяться столько раз сколько необходимо. При этом она может вообще не использоваться как и оператор Иначе. То есть в простейшем случае мы имеем:
Если <Логическое выражение> Тогда
//Набор команд
КонецЕсли;
В логических выражениях могут применяться математические операторы сравнения (=, >, <, >=, <=, <>) и булевы операции (И, ИЛИ, НЕ). Важно понимать, что логическое выражение должно возвращать либо Ложь либо Истина.
И тогда становиться ясно, что в качестве него могут использоваться и булевы переменные и даже функции. Вот пара примеров:
&НаКлиенте
Функция ПроверитьПрава()
Возврат Истина;
КонецФункции
&НаКлиенте
Функция ПолучитьКакоеТоЧисло()
Возврат 1;
КонецФункции
&НаКлиенте
Процедура ПримерыЛогическихВыражений()
Отказ = Ложь;
Если НЕ Отказ Тогда
//Набор команд
КонецЕсли;
Если ПолучитьКакоеТоЧисло() = 1 Тогда
//Набор команд
КонецЕсли;
Если ПроверитьПрава() Тогда
//Набор команд
КонецЕсли;
КонецПроцедуры
А теперь рассмотрим одну особенность, связанную с использованием булевых операций. Допустим у нас есть вот такая конструкция:
Если <ЛогическоеВыражение_1> ИЛИ <ЛогическоеВыражение_2> Тогда
Совершенно очевидно, что если у нас ЛогическоеВыражение_1 = Истина, то проверять на истинность ЛогическоеВыражение_2 нет никакого смысла, т.к. в этом случае все равно ЛогическоеВыражение_1 ИЛИ ЛогическоеВыражение_2 = Истина. И начиная с версии 8.0 платформа так и поступает, т.е. последующие логические выражения будет вычисляться только в том случае, если уже вычисленные не позволяют однозначно определить результат в целом. Знание этого факта позволяет избежать ошибок и сократить количество кода.
В качестве примера обратимся к распространенной ситуации, когда у нас есть реквизит составного типа и нам надо проверить его на заполненность. Пусть у нас есть реквизит составного типа Контрагент, который может принимать тип Справочник.Физлица либо Справочник.Организации. На время этого примера забудем про функцию ЗначениеЗаполнено(). Как известно когда у нас еще не выбран тип составного реквизита, его значение равно Неопределено. Таким образом реквизит незаполнен, когда его значение неопределено либо пустая ссылка. И мы можем записать наше условие в двух вариантах:
// Вариант_1
Если Контрагент = Неопределено ИЛИ Контрагент.Пустая() Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не выбран контрагент";
Сообщение.Сообщить();
КонецЕсли;
// Вариант_2
Если Контрагент.Пустая() ИЛИ Контрагент = Неопределено Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не выбран контрагент";
Сообщение.Сообщить();
КонецЕсли;
Так вот, корректно будет работать только первый вариант, потому что когда тип у нас еще не выбран и значение реквизита равно Неопределено для него не существует метода Пустая() и второй вариант в этом случае завершится с ошибкой, а в первом варианте платформа не будет проверять значение на пустую ссылку, если тип не определен, т.к. ей будет достаточно первого услови. Как видим, иногда от перестановки слагаемых результат очень даже меняется.
В некоторых случаях можно применять сокращенную запись конструкции с условием. Синтаксис ее следующий:
?(<Логическое выражение>, <ВыражениеЕслиИстина>, <ВыражениеЕслиЛожь>)
Как правило применяется, когда надо присвоить переменной разные значения в зависимости от выполнения какого-то условия. Также удобно применять при формировании динамических запросов. С ее помощью мы сможем, например, вот такой код:
Если Отказ Тогда
ТекстСообщения = "Ошибка";
Иначе
ТекстСообщения = "Операция завершена";
КонецЕсли;
записать всего одной строчкой:
ТекстСообщения = ?(Отказ, "Ошибка", "Операция завершена");
Добавить комментарий