Ссылка <> Неопределено И Ссылка.Свойство
ОператорСмысл
Илогическое И — истина, только если оба операнда истинны
ИЛИлогическое ИЛИ — истина, если хотя бы один операнд истинен
НЕинверсия — НЕ Истина = Ложь
Если Цена > 0 И Количество > 0 Тогда ...
Если Статус = "Новый" ИЛИ Статус = "ВРаботе" Тогда ...
Если НЕ ЗначениеЗаполнено(Комментарий) Тогда ...

Сокращённое вычисление (short-circuit)

Платформа вычисляет логическое выражение только до того места, где результат уже однозначно ясен и не может измениться от оставшейся части — как &&/|| в C-подобных языках:

  • у И — если первый операнд Ложь, весь результат уже Ложь, второй операнд не вычисляется;
  • у ИЛИ — если первый операнд Истина, весь результат уже Истина, второй операнд не вычисляется.

Именно поэтому классическая проверка-предохранитель работает безопасно одной строкой:

// безопасно: если Ссылка = Неопределено, до Ссылка.Свойство дело не доходит —
// первый операнд уже сделал И ложным целиком
Если Ссылка <> Неопределено И Ссылка.Свойство = Истина Тогда ...
КонецЕсли;

Порядок операндов при этом важен — проверка-предохранитель должна идти первой. Переставленное условие вычисляется в обычном порядке слева направо, и без короткого замыкания на первом операнде опасное обращение всё равно случится раньше:

// опасно: порядок операндов обратный — Ссылка.Свойство вычисляется первым,
// до того, как выяснится, что Ссылка вообще Неопределено
Если Ссылка.Свойство = Истина И Ссылка <> Неопределено Тогда ...

Аналогично для ИЛИ — предохранитель, отсекающий опасный случай, ставится первым операндом.

В отличие от ?()

Короткое замыкание есть только у И/ИЛИ как у операторов — у ?() его нет, это обычная функция, и оба её значения-аргумента вычисляются всегда, независимо от условия. Одну и ту же проверку-предохранитель через И писать безопасно, а через ?() — нет.

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