Разработка и Конфигурация · 10 мин
Условие «Если… Тогда» в 1С: синтаксис, примеры и ошибки
Как работает конструкция «Если Тогда Иначе» во встроенном языке 1С: синтаксис, операторы сравнения, вложенные условия, типичные ошибки и примеры кода.
Условный оператор «Если… Тогда» — базовая конструкция встроенного языка 1С, без которой невозможно написать ни одну нетривиальную процедуру. Она позволяет выполнять разные ветки кода в зависимости от данных: проверить заполненность реквизита, сравнить суммы, выбрать алгоритм расчёта. Ошибки в условиях — одна из самых частых причин неправильных расчётов в учётных системах, поэтому конструкцию важно понимать до мелочей.
Оператор работает одинаково во всех конфигурациях — от «Бухгалтерии» до самописных решений, поскольку относится к ядру платформы, а не к прикладному коду. Синтаксис одинаков и на клиенте, и на сервере, и в толстом, и в тонком клиенте.
Синтаксис оператора: полная и сокращённая формы
Минимальная форма состоит из ключевых слов «Если», «Тогда» и «КонецЕсли». Между «Если» и «Тогда» располагается логическое выражение, результатом которого должно быть значение типа Булево — Истина или Ложь.
Если ДокументПроведен Тогда
Сообщить("Документ уже проведён");
КонецЕсли;
Полная форма включает ветки «ИначеЕсли» (их может быть сколько угодно) и «Иначе», которая выполняется, если ни одно из условий не сработало:
Если Сумма > 100000 Тогда
СтавкаСкидки = 10;
ИначеЕсли Сумма > 50000 Тогда
СтавкаСкидки = 5;
Иначе
СтавкаСкидки = 0;
КонецЕсли;
Важная деталь синтаксиса: точка с запятой ставится только после «КонецЕсли», завершая весь оператор. После «Тогда» и «Иначе» точка с запятой не ставится — это одна из самых частых ошибок новичков, приводящая к синтаксической ошибке при проверке модуля.
Логические выражения и операторы сравнения
Внутри условия используются операторы сравнения: равно (=), не равно (<>), больше (>), меньше (<), больше или равно (>=), меньше или равно (<=). Для строк сравнение выполняется с учётом регистра и порядка символов, поэтому «А» и «а» — разные значения.
Сложные условия строятся логическими операторами: И (оба условия истинны), ИЛИ (хотя бы одно истинно), НЕ (отрицание). Приоритет: сначала НЕ, затем И, затем ИЛИ. Чтобы не зависеть от приоритетов, группируйте части выражения скобками — это делает код читаемее и защищает от ошибок.
Если (ТипДокумента = "Реализация" И Сумма > 0)
ИЛИ ПринудительнаяОтправка Тогда
ОтправитьУведомление();
КонецЕсли;
Отдельного внимания заслуживает проверка на Неопределено и пустые ссылки. Для проверки заполненности любого значения удобна функция ЗначениеЗаполнено() — она корректно обрабатывает пустые строки, нулевые числа, пустые ссылки, Неопределено и пустые даты, избавляя от необходимости писать отдельные проверки под каждый тип.
Способы проверки значения
Универсальная проверка для любых типов. Подходит в большинстве случаев, но не различает причину пустоты.
Точная проверка на отсутствие значения. Нужна, когда пустая ссылка и Неопределено должны обрабатываться по-разному.
Проверка именно пустой ссылки у ссылочного типа. Не сработает для Неопределено — сначала убедитесь, что значение ссылочное.
Тернарный оператор и компактные условия
Когда условие нужно только для выбора одного из двух значений, громоздкая конструкция «Если…Тогда…Иначе» избыточна. В 1С есть оператор выбора — аналог тернарного оператора в других языках:
Статус = ?(ДокументПроведен, "Проведён", "Черновик");
Синтаксис: ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь). Оператор удобен при присваивании, в выражениях и при формировании строк. Ограничение: внутри него нельзя выполнять несколько операторов — только возвращать значение. Для ветвлений с действиями используйте полный «Если…Тогда».
Не вкладывайте тернарные операторы друг в друга: конструкция вида ?(А, ?(Б, 1, 2), 3) читается тяжело и почти всегда проигрывает обычному «ИначеЕсли».
Вложенные условия и когда их заменить
Технически глубина вложенности «Если» не ограничена, но на практике код с тремя и более уровнями вложенности становится трудным для чтения и отладки. Каждый лишний уровень — это потенциальное место, где забыта ветка «Иначе» или перепутан порядок проверок.
Два рабочих приёма упрощения. Первый — ранний выход из процедуры: вместо вложенного «Если» проверяйте отрицательное условие и сразу делайте Возврат. Второй — вынос сложных проверок в отдельные функции, возвращающие Булево, с говорящими именами вроде ДокументТребуетСогласования().
// Вместо глубокой вложенности:
Если НЕ ЗначениеЗаполнено(Контрагент) Тогда
Возврат;
КонецЕсли;
Если Контрагент.ВАрхиве Тогда
Возврат;
КонецЕсли;
// Основная логика без лишних уровней
Условия в запросах: ГДЕ и ВЫБОР
Конструкция «Если…Тогда» относится к встроенному языку, но в языке запросов 1С есть свои условные механизмы, и путать их нельзя. Фильтрация строк выполняется секцией ГДЕ, а выбор значения по условию — конструкцией ВЫБОР…КОГДА…ТОГДА…ИНАЧЕ…КОНЕЦ:
ВЫБОР
КОГДА Продажи.Сумма > 100000
ТОГДА "Крупная"
ИНАЧЕ "Обычная"
КОНЕЦ КАК КатегорияСделки
Принципиальное отличие: условия в запросе выполняются на уровне СУБД и работают с миллионами записей за один проход, тогда как «Если» в коде обрабатывает данные по одной записи. Если задачу можно решить в запросе — решайте её в запросе: обход выборки с «Если» внутри цикла почти всегда медленнее.
Если в цикле обхода результата запроса стоит «Если», отсекающее часть строк, перенесите это условие в секцию ГДЕ самого запроса. Выборка станет меньше, код — проще, а выполнение — быстрее.
Отладка условий и проверка результата
Главный инструмент проверки условий — конфигуратор с точкой останова. Поставьте её на строку «Если», запустите отладку и в окне «Вычислить выражение» (Shift+F9) проверьте фактическое значение каждой части условия. Часто оказывается, что переменная содержит не то, что ожидалось: строку вместо числа, Неопределено вместо ссылки.
Полезный приём — табло (Ctrl+Shift+F9 в момент остановки): добавьте туда всё логическое выражение целиком и каждую его часть по отдельности. Так видно, какая именно часть сложного условия даёт неожиданный результат.
Как проверить результат
Тип и содержимое соответствуют ожиданию (число, ссылка, строка)
Неопределено, пустая строка или значение другого типа
Точка останова срабатывает в ожидаемой ветке
Выполняется «Иначе» или другая ветка — условие сформулировано неверно
Ноль, пустая ссылка и максимальное значение обрабатываются корректно
На границах условие «перескакивает» не туда — проверьте строгость сравнения (> или >=)
Безопасные границы: что проверить перед изменением кода
Условия в типовых конфигурациях часто затрагивают проведение документов и расчёт остатков. Изменение такого условия может изменить движения по регистрам и исказить учётные данные за прошлые периоды при перепроведении. Перед правкой типового кода убедитесь, что у вас есть актуальная резервная копия информационной базы.
Изменения вносите через расширение конфигурации, а не прямую правку модулей — так обновления типового релиза не затрут ваши доработки. Проверяйте новое условие на копии базы с реальными данными, включая граничные случаи: пустые реквизиты, нулевые суммы, документы прошлых периодов.
Часто задаваемые вопросы
Чем «ИначеЕсли» отличается от нескольких отдельных «Если»?
После срабатывания ветки «ИначеЕсли» остальные условия внутри того же оператора не проверяются. Несколько отдельных «Если» проверяются все независимо, и могут выполниться несколько веток подряд. Выбирайте «ИначеЕсли» для взаимоисключающих вариантов и отдельные «Если» — для независимых проверок.
Можно ли в условии вызывать функцию?
Да, вызов функции, возвращающей Булево или значение, приводимое к нему, допустим. Учитывайте, что функция будет вызываться при каждом вычислении условия. Если она выполняет запрос к базе, при вызове в цикле это создаст лишнюю нагрузку — результат лучше сохранить в переменную заранее.
Работает ли в 1С сокращённое вычисление условий (short-circuit)?
Да, платформа прекращает вычисление «И» после первого ложного операнда и «ИЛИ» — после первого истинного. Это позволяет ставить «дорогую» или потенциально падающую проверку второй: сначала проверяете, что значение заполнено, затем обращаетесь к его реквизиту.
Как проверить, что строка входит в список допустимых значений?
Длинная цепочка «ИЛИ» плохо читается. Удобнее поместить допустимые значения в массив или соответствие и проверять через метод Найти() массива или поиск по ключу соответствия: Если ДопустимыеСтатусы.Найти(Статус) <> Неопределено Тогда.
Почему условие с пустой ссылкой не срабатывает через сравнение с Неопределено?
Пустая ссылка и Неопределено — разные значения. Пустая ссылка имеет конкретный тип (например, СправочникСсылка.Контрагенты) и не равна Неопределено. Используйте ЗначениеЗаполнено() для универсальной проверки или метод Пустая() для точной проверки именно пустой ссылки.
Есть ли в 1С аналог switch/case?
Отдельного оператора выбора по значению нет. Его роль выполняет цепочка «Если…ИначеЕсли» либо соответствие, где ключ — вариант значения, а значение — имя процедуры или результат. Для выбора значения в запросах используется конструкция ВЫБОР…КОГДА.
Что важно запомнить
Оператор «Если…Тогда…ИначеЕсли…Иначе…КонецЕсли;» — основа ветвлений в 1С. Следите за точкой с запятой только после «КонецЕсли», проверяйте заполненность через ЗначениеЗаполнено(), упрощайте вложенность ранним выходом, а фильтрацию данных по возможности переносите в запрос. Перед правкой условий в типовых модулях делайте резервную копию и тестируйтесь на копии базы.