Разработка и Конфигурация · 11 мин
Конструкция «Если…Тогда» в 1С: синтаксис и практические примеры
Как работает конструкция «Если…Тогда…Иначе…КонецЕсли» в языке 1С: синтаксис, логические операторы, вложенные условия, примеры кода и типичные ошибки разработчиков.
Условная конструкция «Если…Тогда» — базовый элемент встроенного языка 1С, без которого невозможно написать ни один осмысленный алгоритм. Она позволяет выполнять разные участки кода в зависимости от выполнения логического условия: проверить заполненность реквизита, сравнить сумму документа с лимитом, выбрать способ расчёта в зависимости от вида операции.
Синтаксис конструкции намеренно русифицирован и читается почти как обычная фраза: Если Условие Тогда ... Иначе ... КонецЕсли;. При этом за внешней простотой скрывается несколько важных нюансов — порядок вычисления логических выражений, правила сравнения дат и ссылок, типичные ошибки с типами данных. Именно эти детали чаще всего становятся причиной трудноуловимых ошибок в прикладных решениях.
Материал рассчитан на начинающих разработчиков 1С и внедренцев, которые пишут или дорабатывают код в модулях объектов, форм и общих модулях. Разобраны полный синтаксис, логические операторы, вложенные условия, практические примеры и способы проверки корректности логики.
Синтаксис конструкции «Если…Тогда» в 1С
Полная форма условного оператора выглядит так:
Если <Логическое выражение> Тогда
// код, выполняемый при истинном условии
ИначеЕсли <Другое условие> Тогда
// код при истинном втором условии
Иначе
// код, если ни одно условие не выполнилось
КонецЕсли;
Обязательными являются только три элемента: ключевое слово Если с условием, Тогда и завершающий КонецЕсли;. Ветки ИначеЕсли может быть несколько, ветка Иначе — только одна, и она всегда идёт последней. Точка с запятой ставится после КонецЕсли, потому что вся конструкция является одним оператором языка.
Условие — это любое выражение, результатом которого является значение типа Булево: сравнение (Если Сумма > 100000 Тогда), вызов функции, возвращающей Истина или Ложь, или сама булева переменная. Если выражение возвращает другой тип, платформа попытается привести его к Булево, но полагаться на неявное приведение не стоит — это частый источник ошибок.
Логические операторы И, ИЛИ, НЕ в условиях
Сложные условия строятся с помощью логических операторов. И требует истинности обеих частей, ИЛИ — хотя бы одной, НЕ инвертирует значение. Пример: Если Контрагент.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо И СуммаДоговора > 0 Тогда.
Приоритет операторов стандартный: сначала вычисляется НЕ, затем И, затем ИЛИ. При смешивании И и ИЛИ всегда ставьте скобки — они делают логику явной и защищают от ошибок интерпретации: Если (Статус = "Новый" Или Статус = "ВРаботе") И Не Отменен Тогда.
Важная особенность платформы: логические выражения в 1С вычисляются полностью, сокращённое вычисление (short-circuit) не гарантируется. Поэтому конструкция вида Если ЗначениеЗаполнено(Ссылка) И Ссылка.Реквизит = 1 Тогда небезопасна — если ссылка пустая, обращение к реквизиту всё равно может быть вычислено и вызвать ошибку. Корректный приём — вложенные условия.
Вложенные условия и выбор из нескольких вариантов
Когда нужно проверить условие только после того, как выполнено другое, используют вложенные конструкции. Каждый внутренний Если требует собственного КонецЕсли;:
Если ЗначениеЗаполнено(Договор) Тогда
Если Договор.Валюта <> ВалютаРегл Тогда
ПересчитатьСумму();
КонецЕсли;
КонецЕсли;
Если вариантов больше двух и все они проверяют одно значение, длинную цепочку ИначеЕсли часто удобнее заменить соответствием или функцией. Например, вместо пяти веток по видам номенклатуры можно заполнить соответствие «вид → ставка» и получить значение одним обращением. Это сокращает код и упрощает сопровождение.
Признак того, что пора переработать логику — вложенность глубже трёх уровней или повторяющиеся условия в разных ветках. Такой код выносится в отдельные функции с говорящими именами: ТребуетсяПересчетСуммы(Документ) читается лучше, чем пять строк сравнений.
В ветках «ИначеЕсли» порядок условий имеет значение: проверки выполняются сверху вниз, и срабатывает первая истинная. Ставьте более частные условия выше общих, иначе общая ветка «перехватит» случаи, которые должны были попасть в частную.
Практические примеры использования
Проверка заполненности реквизита перед проведением документа — самый частый сценарий:
Если Не ЗначениеЗаполнено(Склад) Тогда
Сообщить("Не заполнен склад!");
Отказ = Истина;
Возврат;
КонецЕсли;
Присвоение значения по условию. Для простого выбора из двух значений вместо полной конструкции удобен тернарный оператор через выражение выбора: Ставка = ?(Сумма > 100000, 0.15, 0.2);. Он делает код компактнее, но подходит только для простых присваиваний — сложную логику в него вкладывать не следует.
Сравнение дат и ссылок выполняется обычными операторами сравнения: Если ДатаДокумента < НачалоМесяца(ТекущаяДата()) Тогда. Ссылки сравниваются на равенство напрямую: Если СтрокаТовары.Номенклатура = ОсновнаяНоменклатура Тогда. Для сравнения типов используется функция ТипЗнч() совместно с Тип().
- 1Определите, какое логическое условие должно управлять логикой, и запишите его словами
- 2Сформулируйте выражение средствами языка: сравнение, ЗначениеЗаполнено(), ТипЗнч()
- 3Оберните код ветки в «Если … Тогда … КонецЕсли;», добавьте «Иначе» при необходимости
- 4Проверьте модуль через синтаксический контроль в конфигураторе
- 5Протестируйте обе ветки: когда условие истинно и когда ложно
Проверка корректности условной логики
Первый уровень проверки — синтаксический контроль модуля в конфигураторе (меню «Конфигурация — Проверка конфигурации» или кнопка в редакторе модуля). Он отловит незакрытый КонецЕсли, пропущенное Тогда и ошибки в выражениях, но не проверит саму логику.
Логику проверяют через отладчик: точка останова на строке Если, просмотр значения условия в табло и пошаговое выполнение по веткам. Важно пройти обе ветки — и «Тогда», и «Иначе», — потому что ошибки чаще всего сидят в ветке, которая редко выполняется.
Признак корректно работающего условия — предсказуемое поведение на граничных значениях: ноль, пустая ссылка, пустая строка, дата-граница периода. Именно на них условия ломаются чаще всего, поэтому тестировать стоит сначала границы, а потом типичные значения.
Как проверить результат
Синтаксический контроль проходит без ошибок
Сообщения о незакрытом «КонецЕсли» или неверном выражении
Код выполняется только при истинном условии
Ветка срабатывает всегда или никогда
Ноль, пустая ссылка и пустая строка обрабатываются корректно
Ошибка выполнения на пустых значениях
Типичные ошибки при работе с условиями
Самая распространённая ошибка — сравнение значений разных типов без приведения, например строки с числом. Платформа может не выдать ошибку, а просто вернуть неожиданный результат сравнения, и логика молча пойдёт не по той ветке. Всегда приводите значения к одному типу явно.
Вторая группа ошибок связана с «битыми» и пустыми ссылками: обращение к реквизиту пустой ссылки, сравнение с Неопределено там, где ожидается NULL из запроса. В запросах результат соединения может содержать NULL, и проверять его нужно через Если Значение = NULL Тогда, а не через Неопределено.
Чем заменить длинные цепочки условий
Когда веток становится много, полная конструкция «Если…ИначеЕсли» перестаёт быть лучшим решением. Основные альтернативы: тернарный оператор ?() для выбора одного из двух значений, соответствие для выбора по ключу, вынос логики в функции с ранним возвратом (Возврат в начале процедуры при невыполненном условии).
Приём «раннего выхода» особенно полезен для проверок предусловий: вместо того чтобы оборачивать всё тело процедуры в Если, в начале пишут Если Не УсловиеВыполнено Тогда Возврат; КонецЕсли; — и дальше код идёт без лишнего уровня вложенности. Такой стиль рекомендуют стандарты разработки 1С.
Сравнение вариантов
Универсальный вариант для развилок логики; ограничение — громоздкость при множестве веток
Компактный выбор одного из двух значений; не подходит для многострочной логики
Удобно при выборе значения по одному ключу; не работает для сложных составных условий
Упрощает проверки предусловий и снижает вложенность; применим только внутри процедур и функций
Часто задаваемые вопросы
Обязательна ли ветка «Иначе» в конструкции «Если…Тогда»?
Нет. Минимальная форма — «Если Условие Тогда … КонецЕсли;». Ветка «Иначе» добавляется только когда нужно выполнить код при невыполнении условия. Если действий для ложного случая нет, «Иначе» не пишут.
Чем «ИначеЕсли» отличается от нескольких отдельных «Если»?
В цепочке «ИначеЕсли» выполняется только первая истинная ветка, остальные пропускаются. Несколько отдельных «Если» проверяются независимо, и могут сработать все. Выбор зависит от логики: взаимоисключающие варианты — «ИначеЕсли», независимые проверки — отдельные «Если».
Можно ли в условии вызывать функции?
Да, если функция возвращает значение типа Булево. Это рекомендуемая практика: сложную проверку выносят в функцию с понятным именем, например «ДокументГотовКПроведению()», и условие читается как обычная фраза.
Почему условие с «И» выдаёт ошибку, хотя первая часть ложна?
Платформа 1С не гарантирует сокращённое вычисление логических выражений — вторая часть условия может быть вычислена даже при ложной первой. Если вторая часть обращается к реквизитам ссылки, разносите проверки во вложенные «Если».
Как сравнить тип значения в условии?
Используйте функцию «ТипЗнч()» в сочетании с «Тип()»: «Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда». Это стандартный способ проверки типа перед обращением к специфичным реквизитам.
Что лучше для выбора из двух значений — «Если» или «?()»?
Для простого присваивания лучше тернарный оператор: «Ставка = ?(Условие, Значение1, Значение2);» — одна строка вместо пяти. Если в ветках выполняется несколько операторов или сложная логика, используйте полную конструкцию «Если…Иначе».
Что важно запомнить
Конструкция «Если…Тогда…Иначе…КонецЕсли;» управляет выполнением кода по логическому условию; обязательны только «Если», «Тогда» и «КонецЕсли;». Следите за типами сравниваемых значений, не полагайтесь на сокращённое вычисление «И», выносите сложные проверки в функции и тестируйте обе ветки на граничных значениях.