К статье
Практический материал

Разработка и Конфигурация · 11 мин

Конструкция «Если…Тогда» в 1С: синтаксис и практические примеры

Как работает конструкция «Если…Тогда…Иначе…КонецЕсли» в языке 1С: синтаксис, логические операторы, вложенные условия, примеры кода и типичные ошибки разработчиков.

Условная конструкция «Если…Тогда» — базовый элемент встроенного языка 1С, без которого невозможно написать ни один осмысленный алгоритм. Она позволяет выполнять разные участки кода в зависимости от выполнения логического условия: проверить заполненность реквизита, сравнить сумму документа с лимитом, выбрать способ расчёта в зависимости от вида операции.

Синтаксис конструкции намеренно русифицирован и читается почти как обычная фраза: Если Условие Тогда ... Иначе ... КонецЕсли;. При этом за внешней простотой скрывается несколько важных нюансов — порядок вычисления логических выражений, правила сравнения дат и ссылок, типичные ошибки с типами данных. Именно эти детали чаще всего становятся причиной трудноуловимых ошибок в прикладных решениях.

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

Синтаксис конструкции «Если…Тогда» в 1С

Полная форма условного оператора выглядит так:

Если <Логическое выражение> Тогда

// код, выполняемый при истинном условии

ИначеЕсли <Другое условие> Тогда

// код при истинном втором условии

Иначе

// код, если ни одно условие не выполнилось

КонецЕсли;

Обязательными являются только три элемента: ключевое слово Если с условием, Тогда и завершающий КонецЕсли;. Ветки ИначеЕсли может быть несколько, ветка Иначе — только одна, и она всегда идёт последней. Точка с запятой ставится после КонецЕсли, потому что вся конструкция является одним оператором языка.

Условие — это любое выражение, результатом которого является значение типа Булево: сравнение (Если Сумма > 100000 Тогда), вызов функции, возвращающей Истина или Ложь, или сама булева переменная. Если выражение возвращает другой тип, платформа попытается привести его к Булево, но полагаться на неявное приведение не стоит — это частый источник ошибок.

Логические операторы И, ИЛИ, НЕ в условиях

Сложные условия строятся с помощью логических операторов. И требует истинности обеих частей, ИЛИ — хотя бы одной, НЕ инвертирует значение. Пример: Если Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо И СуммаДоговора > 0 Тогда.

Приоритет операторов стандартный: сначала вычисляется НЕ, затем И, затем ИЛИ. При смешивании И и ИЛИ всегда ставьте скобки — они делают логику явной и защищают от ошибок интерпретации: Если (Статус = "Новый" Или Статус = "ВРаботе") И Не Отменен Тогда.

Важная особенность платформы: логические выражения в 1С вычисляются полностью, сокращённое вычисление (short-circuit) не гарантируется. Поэтому конструкция вида Если ЗначениеЗаполнено(Ссылка) И Ссылка.Реквизит = 1 Тогда небезопасна — если ссылка пустая, обращение к реквизиту всё равно может быть вычислено и вызвать ошибку. Корректный приём — вложенные условия.

Вложенные условия и выбор из нескольких вариантов

Когда нужно проверить условие только после того, как выполнено другое, используют вложенные конструкции. Каждый внутренний Если требует собственного КонецЕсли;:

Если ЗначениеЗаполнено(Договор) Тогда

Если Договор.Валюта <> ВалютаРегл Тогда

ПересчитатьСумму();

КонецЕсли;

КонецЕсли;

Если вариантов больше двух и все они проверяют одно значение, длинную цепочку ИначеЕсли часто удобнее заменить соответствием или функцией. Например, вместо пяти веток по видам номенклатуры можно заполнить соответствие «вид → ставка» и получить значение одним обращением. Это сокращает код и упрощает сопровождение.

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

В ветках «ИначеЕсли» порядок условий имеет значение: проверки выполняются сверху вниз, и срабатывает первая истинная. Ставьте более частные условия выше общих, иначе общая ветка «перехватит» случаи, которые должны были попасть в частную.
ПЗ
Практическое замечание

Практические примеры использования

Проверка заполненности реквизита перед проведением документа — самый частый сценарий:

Если Не ЗначениеЗаполнено(Склад) Тогда

Сообщить("Не заполнен склад!");

Отказ = Истина;

Возврат;

КонецЕсли;

Присвоение значения по условию. Для простого выбора из двух значений вместо полной конструкции удобен тернарный оператор через выражение выбора: Ставка = ?(Сумма > 100000, 0.15, 0.2);. Он делает код компактнее, но подходит только для простых присваиваний — сложную логику в него вкладывать не следует.

Сравнение дат и ссылок выполняется обычными операторами сравнения: Если ДатаДокумента < НачалоМесяца(ТекущаяДата()) Тогда. Ссылки сравниваются на равенство напрямую: Если СтрокаТовары.Номенклатура = ОсновнаяНоменклатура Тогда. Для сравнения типов используется функция ТипЗнч() совместно с Тип().

Как добавить условие в процедуру
  1. 1
    Определите, какое логическое условие должно управлять логикой, и запишите его словами
  2. 2
    Сформулируйте выражение средствами языка: сравнение, ЗначениеЗаполнено(), ТипЗнч()
  3. 3
    Оберните код ветки в «Если … Тогда … КонецЕсли;», добавьте «Иначе» при необходимости
  4. 4
    Проверьте модуль через синтаксический контроль в конфигураторе
  5. 5
    Протестируйте обе ветки: когда условие истинно и когда ложно

Проверка корректности условной логики

Первый уровень проверки — синтаксический контроль модуля в конфигураторе (меню «Конфигурация — Проверка конфигурации» или кнопка в редакторе модуля). Он отловит незакрытый КонецЕсли, пропущенное Тогда и ошибки в выражениях, но не проверит саму логику.

Логику проверяют через отладчик: точка останова на строке Если, просмотр значения условия в табло и пошаговое выполнение по веткам. Важно пройти обе ветки — и «Тогда», и «Иначе», — потому что ошибки чаще всего сидят в ветке, которая редко выполняется.

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

Контрольные точки

Как проверить результат

Синтаксис модуля
Норма

Синтаксический контроль проходит без ошибок

Тревожный признак

Сообщения о незакрытом «КонецЕсли» или неверном выражении

Ветка «Тогда»
Норма

Код выполняется только при истинном условии

Тревожный признак

Ветка срабатывает всегда или никогда

Граничные значения
Норма

Ноль, пустая ссылка и пустая строка обрабатываются корректно

Тревожный признак

Ошибка выполнения на пустых значениях

Типичные ошибки при работе с условиями

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

Вторая группа ошибок связана с «битыми» и пустыми ссылками: обращение к реквизиту пустой ссылки, сравнение с Неопределено там, где ожидается NULL из запроса. В запросах результат соединения может содержать NULL, и проверять его нужно через Если Значение = NULL Тогда, а не через Неопределено.

Типичные ошибки
01
Сравнение разных типов без приведения — условие молча даёт неверный результат
02
Обращение к реквизиту пустой ссылки внутри условия — ошибка выполнения
03
Проверка NULL из запроса через «Неопределено» — условие никогда не срабатывает
04
Отсутствие скобок при смешении «И» и «ИЛИ» — логика вычисляется не так, как задумано
05
Глубокая вложенность «Если» вместо выноса проверок в функции — код нечитаем и хрупок

Чем заменить длинные цепочки условий

Когда веток становится много, полная конструкция «Если…ИначеЕсли» перестаёт быть лучшим решением. Основные альтернативы: тернарный оператор ?() для выбора одного из двух значений, соответствие для выбора по ключу, вынос логики в функции с ранним возвратом (Возврат в начале процедуры при невыполненном условии).

Приём «раннего выхода» особенно полезен для проверок предусловий: вместо того чтобы оборачивать всё тело процедуры в Если, в начале пишут Если Не УсловиеВыполнено Тогда Возврат; КонецЕсли; — и дальше код идёт без лишнего уровня вложенности. Такой стиль рекомендуют стандарты разработки 1С.

Сравнение вариантов

Полная конструкция «Если…Иначе»

Универсальный вариант для развилок логики; ограничение — громоздкость при множестве веток

Тернарный оператор ?()

Компактный выбор одного из двух значений; не подходит для многострочной логики

Соответствие (ключ → значение)

Удобно при выборе значения по одному ключу; не работает для сложных составных условий

Ранний выход через «Возврат»

Упрощает проверки предусловий и снижает вложенность; применим только внутри процедур и функций

Часто задаваемые вопросы

Обязательна ли ветка «Иначе» в конструкции «Если…Тогда»?

Нет. Минимальная форма — «Если Условие Тогда … КонецЕсли;». Ветка «Иначе» добавляется только когда нужно выполнить код при невыполнении условия. Если действий для ложного случая нет, «Иначе» не пишут.

Чем «ИначеЕсли» отличается от нескольких отдельных «Если»?

В цепочке «ИначеЕсли» выполняется только первая истинная ветка, остальные пропускаются. Несколько отдельных «Если» проверяются независимо, и могут сработать все. Выбор зависит от логики: взаимоисключающие варианты — «ИначеЕсли», независимые проверки — отдельные «Если».

Можно ли в условии вызывать функции?

Да, если функция возвращает значение типа Булево. Это рекомендуемая практика: сложную проверку выносят в функцию с понятным именем, например «ДокументГотовКПроведению()», и условие читается как обычная фраза.

Почему условие с «И» выдаёт ошибку, хотя первая часть ложна?

Платформа 1С не гарантирует сокращённое вычисление логических выражений — вторая часть условия может быть вычислена даже при ложной первой. Если вторая часть обращается к реквизитам ссылки, разносите проверки во вложенные «Если».

Как сравнить тип значения в условии?

Используйте функцию «ТипЗнч()» в сочетании с «Тип()»: «Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда». Это стандартный способ проверки типа перед обращением к специфичным реквизитам.

Что лучше для выбора из двух значений — «Если» или «?()»?

Для простого присваивания лучше тернарный оператор: «Ставка = ?(Условие, Значение1, Значение2);» — одна строка вместо пяти. Если в ветках выполняется несколько операторов или сложная логика, используйте полную конструкцию «Если…Иначе».

Итог

Что важно запомнить

Конструкция «Если…Тогда…Иначе…КонецЕсли;» управляет выполнением кода по логическому условию; обязательны только «Если», «Тогда» и «КонецЕсли;». Следите за типами сравниваемых значений, не полагайтесь на сокращённое вычисление «И», выносите сложные проверки в функции и тестируйте обе ветки на граничных значениях.