Когда мы пишем код на встроенном языке 1С, особенно в сложных логических выражениях, возникает вопрос: как система ведет себя, если первое условие в цепочке с оператором «И» оказывается ложным? Прекратит ли 1С дальнейшую проверку остальных условий, или будет проверять все подряд? Этот вопрос критически важен для понимания производительности кода и, что еще более важно, для предотвращения ошибок времени выполнения.
В большинстве современных языков программирования, и 1С:Предприятие 8.x не исключение, используется так называемый механизм «короткого замыкания» (или «ленивых» вычислений) для логических выражений. Это означает, что не все части логического выражения обязательно будут вычислены. Вычисление прекращается, как только окончательный результат всего выражения становится однозначно определенным.
Давайте рассмотрим подробнее, как это работает для основных логических операторов.
Для оператора «И» (AND) правило «короткого замыкания» работает следующим образом:
Операнд1 И Операнд2) оказывается ложным, то весь результат выражения уже однозначно равен «Ложь», независимо от значения второго операнда.Операнд2) не будет вычисляться. Проверка на этом прервется.Это является ключевым моментом для безопасности и эффективности кода. Вернемся к исходному примеру из форума:
Если ЗначениеЗаполнено(КакойТоСправочник)
И КакойТоСправочник.Наименование <> "" Тогда
// Действия, если условие истинно
КонецЕсли;
Здесь происходит следующее:
ЗначениеЗаполнено(КакойТоСправочник).КакойТоСправочник не заполнен (например, это пустая ссылка или Неопределено), то функция ЗначениеЗаполнено() вернет Ложь.КакойТоСправочник.Наименование <> "" не будет вычислена.Это предотвращает критическую ошибку, которая могла бы возникнуть, если бы система попыталась обратиться к свойству Наименование у незаполненной ссылки. Попытка обращения к свойству несуществующего или незаполненного объекта приводит к ошибке времени выполнения. Благодаря «короткому замыканию» мы безопасно избегаем таких ситуаций.
Рассмотрим еще один пример для оператора «И»:
Если Объект <> Неопределено И Объект.Метод() Тогда
// Действия
КонецЕсли;
В этом случае, если Объект равен Неопределено, то первое условие Объект <> Неопределено будет Ложь. Второе условие Объект.Метод() не будет выполнено, что исключает ошибку вызова метода у несуществующего объекта.
Аналогичный принцип действует и для оператора «ИЛИ» (OR), но с противоположной логикой:
Операнд1 ИЛИ Операнд2) оказывается истинным, то весь результат выражения уже однозначно равен «Истина», независимо от значения второго операнда.Операнд2) не будет вычисляться. Проверка на этом прервется.Пример использования оператора «ИЛИ»:
Если ПользовательАдминистратор() ИЛИ ПользовательМенеджер() Тогда
// Открыть панель управления
КонецЕсли;
Если функция ПользовательАдминистратор() вернет Истина, то ПользовательМенеджер() уже не будет вызвана, так как общее условие с «ИЛИ» уже однозначно будет истинным.
Важно отметить, что такой механизм «короткого замыкания» стал стандартом в 1С:Предприятии 8 и более поздних версиях. В более ранних версиях, таких как 1С 7.7 (так называемых «клюшках»), поведение могло отличаться. В 1С 7.7, при оценке логических выражений в некоторых контекстах (например, в обычном коде без использования синтаксиса запросов), все операнды могли быть вычислены независимо от результата предыдущих. Это требовало более осторожного написания кода, часто с использованием вложенных операторов Если для предотвращения ошибок, когда мы обращались к свойствам объектов, которые могли быть неопределенными.
// Пример на 1С 7.7, где могло потребоваться такое
Если ЗначениеЗаполнено(КакойТоСправочник) Тогда
Если КакойТоСправочник.Наименование <> "" Тогда
// Действия
КонецЕсли;
КонецЕсли;
В 1С 8.x этот же код можно безопасно и лаконично записать в одну строку, используя преимущества «короткого замыкания».
// В 1С 8.x достаточно одной строки
Если ЗначениеЗаполнено(КакойТоСправочник) И КакойТоСправочник.Наименование <> "" Тогда
// Действия
КонецЕсли;
Механизм «короткого замыкания» предоставляет нам ряд существенных преимуществ:
Если делает код более читаемым и легким для понимания.Осознавая принцип «короткого замыкания», мы можем писать более качественный код:
Неопределено или пустой ссылкой, всегда ставьте проверку ее валидности первым условием в логическом выражении с оператором «И». Используйте функции ЗначениеЗаполнено(), сравнение с Неопределено, или проверку типа с ТипЗнч().Неопределено), в начале выражения. Это не только предотвратит ошибки, но и может повысить производительность, если эти условия часто дают результат, позволяющий «замкнуть» выражение.Если, когда каждое условие зависит от истинности предыдущего, объединяйте их в одно логическое выражение с оператором «И».Например:
// Плохой пример с избыточными проверками (логически, не синтаксически ошибочный)
Перем МойОбъект;
// ... получение МойОбъект ...
Если МойОбъект <> Неопределено Тогда
Если МойОбъект.ЭтоГруппа Тогда
Если МойОбъект.Наименование <> "" Тогда
Сообщить("Все условия выполнены!");
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Хороший пример с использованием "короткого замыкания"
Перем МойОбъект;
// ... получение МойОбъект ...
Если МойОбъект <> Неопределено И МойОбъект.ЭтоГруппа И МойОбъект.Наименование <> "" Тогда
Сообщить("Все условия выполнены!");
КонецЕсли;
Второй пример гораздо чище, и благодаря «короткому замыканию» он абсолютно безопасен: если МойОбъект будет Неопределено, остальные условия не будут проверяться, и ошибок не возникнет.
Понимание механизма «короткого замыкания» в логических выражениях 1С 8.x – это не просто теоретический нюанс, а практический инструмент, который каждый программист 1С должен использовать в своей повседневной работе. Он позволяет нам писать более надежный, производительный и читаемый код, минимизируя риски возникновения ошибок и улучшая общее качество программных решений.