Результат = ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь);Возвращает ЗначениеЕслиИстина, если Условие истинно, иначе ЗначениеЕслиЛожь. Удобен, когда нужно значение прямо внутри выражения — там, где Если...Тогда...КонецЕсли синтаксически не встанет:
Скидка = ?(Сумма > 1000, 10, 0);
Сообщить("Статус: " + ?(Оплачен, "оплачен", "не оплачен"));Оба аргумента вычисляются всегда — главная ловушка
В отличие от Если, который выполняет только выбранную ветку, ?() — обычная функция платформы, а не оператор ветвления: оба значения-аргумента вычисляются перед вызовом, независимо от того, какое из них в итоге вернётся. Условие лишь выбирает, какой из уже вычисленных результатов отдать наружу.
Ссылка = Неопределено;
// упадёт с исключением — Ссылка.Наименование вычисляется,
// даже когда Условие (Ссылка = Неопределено) истинно и выбрана первая ветка
Имя = ?(Ссылка = Неопределено, "", Ссылка.Наименование);Обращение к свойству Неопределено внутри невыбранной ветки — исключение, которое произойдёт всё равно. Безопасный вариант — обычный Если, который так не делает:
Если Ссылка = Неопределено Тогда
Имя = "";
Иначе
Имя = Ссылка.Наименование;
КонецЕсли;Та же ловушка — с делением на ноль или другим выражением, которое может упасть само по себе:
// упадёт при Количество = 0, даже если это и есть проверяемый случай
Среднее = ?(Количество = 0, 0, Сумма / Количество);?() стоит использовать, когда оба варианта — простые готовые значения без побочных вычислений и без риска исключения; как только в одной из веток появляется обращение, которое может быть небезопасным при определённом условии, — обычный Если.