Зачем в коде 1С используется конструкция «Если Ложь Тогда» и как она работает

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При изучении чужого кода или типовых конфигураций разработчики 1С часто сталкиваются с кодом, содержащим заведомо невыполнимые условия. Рассмотрим типичный пример подобного блока:


Если Ложь Тогда
    ОпросныйЛист = Документы.бит_ОпросныйЛист.СоздатьДокумент();
КонецЕсли;

На первый взгляд эта конструкция кажется бессмысленной или ошибочной, ведь условие Если Ложь никогда не выполнится при исполнении программы. Однако данный приём имеет вполне конкретную цель. Разберём подробно, для чего используется подобная конструкция, как она работает изнутри и какими современными альтернативами ее можно заменить.

Зачем нужна конструкция с заведомо ложным условием

Основное назначение такой конструкции — подсказать среду разработки (Конфигуратору) тип переменной для работы контекстной подсказки (автодополнения или автокомплита). В языке 1С применяется динамическая типизация, поэтому среда разработки не всегда заранее знает, какой объект будет храниться в переменной, особенно если переменная инициализируется сложным образом или передается извне.

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

При этом сама ветка кода Если Ложь Тогда ... КонецЕсли во время выполнения программы просто пропускается и не вызывает обращения к базе данных или создания реального объекта в памяти.

Разновидности конструкции для автокомплита

За годы развития платформы 1С разработчики применяли различные вариации этого приема. Рассмотрим основные из них:

  1. Использование стандартного условия:
    
    Если Ложь Тогда
        ДокументОбъект = Документы.ПриходнаяНакладная.СоздатьДокумент();
    КонецЕсли;
    
    Это наиболее простой и универсальный вариант, работающий во всех версиях платформы 1С:Предприятие 8.
  2. Использование инструкций препроцессора:
    
    #Если Сервер И Не Сервер Тогда
        ДокументОбъект = Документы.ПриходнаяНакладная.СоздатьДокумент();
    #КонецЕсли
    
    Ранее разработчики часто применяли неинициализированные идентификаторы вроде #Если _ Тогда, однако начиная с платформы 8.3.9 препроцессор выдает ошибку при использовании неизвестных символов. Вариант #Если Сервер И Не Сервер позволяет обойти это ограничение на этапе компиляции.

Недостатки использования недостижимого кода

Несмотря на удобство быстрых подсказок при наборе кода, данный подход обладает рядом существенных недостатков, о которых важно помнить:

1. Нарушение стандартов разработки. Наличие недостижимых инструкций противоречит официальным стандартам качества кода 1С.

2. Замечания статических анализаторов. Автоматизированные системы проверки качества (например, SonarQube, BSL Language Server или встроенные проверки 1C:EDT) подсвечивают такие конструкции как дефекты категории «Dead Code» (недостижимый код).

3. Влияние на байт-код. Обычные инструкции внутри Если Ложь Тогда попадают в скомпилированный байт-код модуля и незначительно увеличивают его объем (в отличие от инструкций препроцессора, которые исключаются на этапе компиляции).

4. Локальный контекст. Контекстная подсказка, объявленная таким образом, работает только внутри текущего метода (процедуры или функции) и не передает данные о типе в вызывающие или вызываемые методы.

Современные и рекомендованные альтернативы

В современной разработке 1С существуют более чистые и правильные способы подсказывать типы данных среде разработки:

1. Аннотации типов в 1C:Enterprise Development Tools (EDT). При работе в средах разработки на базе EDT типы переменных указываются с помощью специальных документирующих комментариев без создания лишних инструкций в коде:


// @type ДокументОбъект.ПриходнаяНакладная
ЗаголовокДокумента = ПолучитьСсылкуНаДокумент();

2. Документирующие комментарии к функциям и процедурам. Оформление описания параметров и возвращаемых значений функций по стандарту 1С позволяет платформе корректно подтягивать типы при передаче переменных между методами:


// Функция создает новый опросный лист.
// 
// Возвращаемое значение:
//   ДокументОбъект.бит_ОпросныйЛист - Новый документ
//
Функция СоздатьОпросныйЛист() Экспорт
    Возврат Документы.бит_ОпросныйЛист.СоздатьДокумент();
КонецФункции

3. Использование пустых ссылок. Если требуется явно инициализировать переменную ссылочным типом без обращения к базе данных и без создания веток с Ложь, можно использовать вызов метода ПустаяСсылка():

СсылкаНаДокумент = Документы.бит_ОпросныйЛист.ПустаяСсылка();

Подводя итог: конструкция Если Ложь Тогда — это классический хак для упрощения набора кода в Конфигураторе. В новом коде рекомендуется отдавать предпочтение стандартизированным комментариям и возможностям 1C:EDT.

← На главную