{}const=>[]async()letfn</>var
1CEntwicklung

Условия в 1С: если, иначе и логика бизнес-правил

Подробное руководство по условным конструкциям в 1С. Разберём синтаксис Если-Тогда-Иначе, ИначеЕсли, тернарный оператор и оператор ВЫБОР в запросах. Покажем на четырёх реальных бизнес-сценариях — от контроля остатков на складе до автоматического согласования документов. Разберём типичные ошибки новичков и научимся писать чистый, читаемый код с условиями.

К

Kodik

Autor

calendar_today
schedule7 Min. Lesezeit

Условные конструкции — это фундамент любой бизнес-логики в 1С:Предприятие. Скидка для оптового клиента, блокировка отгрузки при отрицательном остатке, выбор ставки НДС в зависимости от номенклатурной группы — все эти задачи решаются через ветвление кода. В этой статье разберём синтаксис условий, типичные паттерны и реальные бизнес-сценарии, с которыми сталкивается каждый разработчик 1С.

Базовый синтаксис: Если … Тогда … КонецЕсли

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

// Простая проверка: запрет проведения при нулевой сумме
Если Объект.СуммаДокумента = 0 Тогда
    Сообщить("Сумма документа не может быть равна нулю!");
    Отказ = Истина;
КонецЕсли;

Обратите внимание: в 1С нет фигурных скобок, как в JavaScript или C#. Границы блока задаются ключевыми словами. Точка с запятой ставится после КонецЕсли и после каждого оператора внутри блока.

🔥 100.000+ Schüler sind bereits bei uns

Genug Theorie gelesen?
Zeit zu coden!

Kodik — eine App, in der du durch Praxis programmieren lernst. KI-Mentor, interaktive Lektionen, echte Projekte.

🤖 KI 24/7
🎓 Zertifikate
💰 Kostenlos
🚀 Jetzt starten
Heute beigetreten

Ветка «Иначе» — обработка альтернативного сценария

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

// Определяем тип цены для клиента
Если Контрагент.ОптовыйПокупатель Тогда
    ТипЦены = Справочники.ТипыЦен.НайтиПоНаименованию("Оптовая");
Иначе
    ТипЦены = Справочники.ТипыЦен.НайтиПоНаименованию("Розничная");
КонецЕсли;

Здесь программа проверяет реквизит контрагента и в зависимости от его значения присваивает переменной один из двух типов цены. Блок Иначе выполняется только тогда, когда условие после Если вернуло Ложь.

Множественные условия: ИначеЕсли

Реальная бизнес-логика редко сводится к двум вариантам. Когда необходимо проверить три и более сценария, используется конструкция ИначеЕсли. Платформа проверяет условия последовательно сверху вниз и выполняет первый блок, условие которого оказалось истинным. Все остальные ветки пропускаются.

// Расчёт скидки в зависимости от суммы заказа
Если СуммаЗаказа >= 500000 Тогда
    ПроцентСкидки = 15;
ИначеЕсли СуммаЗаказа >= 100000 Тогда
    ПроцентСкидки = 10;
ИначеЕсли СуммаЗаказа >= 50000 Тогда
    ПроцентСкидки = 5;
Иначе
    ПроцентСкидки = 0;
КонецЕсли;

Порядок веток в ИначеЕсли критически важен. Если поставить проверку на 50 000 первой, то заказ на 500 000 тоже попадёт в эту ветку, потому что 500 000 >= 50 000. Всегда располагайте условия от самого строгого к самому мягкому.

Логические операторы: И, ИЛИ, НЕ

Условия можно комбинировать с помощью трёх логических операторов. Это позволяет строить сложные проверки, учитывающие несколько факторов одновременно.

Оператор И (конъюнкция) возвращает Истина, когда оба условия истинны. Оператор ИЛИ (дизъюнкция) возвращает Истина, когда хотя бы одно условие истинно. Оператор НЕ (отрицание) инвертирует значение — возвращает Истина, когда условие ложно.

// Отгрузка разрешена, если товар в наличии И клиент не заблокирован
Если ОстатокНаСкладе > 0 И НЕ Контрагент.Заблокирован Тогда
    РазрешитьОтгрузку();
КонецЕсли;

// Особые условия для VIP-клиентов или сотрудников
Если Контрагент.VIP ИЛИ Контрагент.Сотрудник Тогда
    ПрименитьСпециальнуюСкидку();
КонецЕсли;

В 1С нет «ленивого» вычисления логических выражений (short-circuit evaluation). Платформа всегда вычисляет оба операнда, даже если результат уже очевиден по первому. Это значит, что если второй операнд может вызвать ошибку, нужно выносить его в отдельную проверку через вложенный Если.

Операторы сравнения

Для построения условий в 1С доступен стандартный набор операторов сравнения. Они работают с числами, строками, датами и ссылочными типами: = (равно), <> (не равно), > (больше), < (меньше), >= (больше или равно), <= (меньше или равно).

// Примеры использования операторов сравнения
Если Статус = "Оплачен" Тогда
    // обработка оплаченного заказа
КонецЕсли;

Если Остаток <> 0 Тогда
    // остаток не нулевой
КонецЕсли;

Если ДатаОтгрузки < ТекущаяДата() Тогда
    // дата отгрузки просрочена
КонецЕсли;

Если Количество >= МинимальнаяПартия Тогда
    // количество достаточно для отгрузки
КонецЕсли;

Вложенные условия

Внутри любого блока Если можно размещать другие условные конструкции. Это называется вложенностью. Она позволяет реализовать пошаговую логику, где каждый следующий уровень проверки зависит от результата предыдущего.

// Многоуровневая проверка при проведении документа
Если Объект.Контрагент.Пустая() Тогда
    Сообщить("Не указан контрагент!");
    Отказ = Истина;
Иначе
    Если Объект.Контрагент.Заблокирован Тогда
        Сообщить("Контрагент заблокирован. Обратитесь к руководителю.");
        Отказ = Истина;
    Иначе
        Если Объект.СуммаДокумента > Объект.Контрагент.КредитныйЛимит Тогда
            Сообщить("Превышен кредитный лимит контрагента!");
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

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

Тернарный оператор: конструкция ?(…, …, …)

В 1С есть компактная альтернатива конструкции Если-Иначе для простых случаев, когда нужно выбрать одно из двух значений. Это тернарный оператор, который записывается с помощью вопросительного знака.

// Полная форма:
Если Контрагент.ОптовыйПокупатель Тогда
    Приветствие = "Уважаемый партнёр";
Иначе
    Приветствие = "Уважаемый клиент";
КонецЕсли;

// Компактная форма через тернарный оператор:
Приветствие = ?(Контрагент.ОптовыйПокупатель, "Уважаемый партнёр", "Уважаемый клиент");

Синтаксис: ?(Условие, ЗначениеЕслиИстина, ЗначениеЕслиЛожь). Тернарный оператор удобен для присваивания значений переменным, формирования строк и задания параметров. Не используйте его для сложной логики — это ухудшает читаемость.

Реальные бизнес-сценарии

Рассмотрим несколько типичных задач, с которыми сталкивается 1С-разработчик в повседневной работе.

Сценарий 1: Контроль остатков при отгрузке

При проведении документа «Реализация товаров» нужно убедиться, что на складе достаточно товара. Если остатка не хватает — заблокировать проведение и показать внятное сообщение.

Для Каждого СтрокаТЧ Из Объект.Товары Цикл

    Остаток = ПолучитьОстатокНаСкладе(СтрокаТЧ.Номенклатура, Объект.Склад);

    Если СтрокаТЧ.Количество > Остаток Тогда
        Сообщить("Недостаточно товара: "
            + СтрокаТЧ.Номенклатура
            + ". На складе: " + Остаток
            + ", требуется: " + СтрокаТЧ.Количество);
        Отказ = Истина;
    КонецЕсли;

КонецЦикла;

Сценарий 2: Автоматический расчёт ставки НДС

В зависимости от номенклатурной группы товара автоматически подставляется нужная ставка НДС. Это избавляет менеджера от ручного выбора и снижает вероятность ошибки.

Если Номенклатура.НоменклатурнаяГруппа = Группы.ДетскиеТовары
    ИЛИ Номенклатура.НоменклатурнаяГруппа = Группы.Продовольствие Тогда
    СтавкаНДС = Перечисления.СтавкиНДС.НДС10;
ИначеЕсли Номенклатура.НоменклатурнаяГруппа = Группы.Экспорт Тогда
    СтавкаНДС = Перечисления.СтавкиНДС.НДС0;
ИначеЕсли Номенклатура.НоменклатурнаяГруппа = Группы.МедицинскиеИзделия Тогда
    СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
Иначе
    СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
КонецЕсли;

Сценарий 3: Разграничение прав при согласовании

Документы свыше определённой суммы требуют согласования руководителем. Простым менеджерам доступна только отправка на согласование, а руководители могут утверждать напрямую.

ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь;
ЭтоРуководитель = ТекущийПользователь.Роль = Перечисления.Роли.Руководитель;

Если Объект.СуммаДокумента > 1000000 Тогда
    Если ЭтоРуководитель Тогда
        Объект.Статус = Перечисления.СтатусыДокументов.Утверждён;
        Сообщить("Документ утверждён.");
    Иначе
        Объект.Статус = Перечисления.СтатусыДокументов.НаСогласовании;
        Сообщить("Документ отправлен на согласование руководителю.");
    КонецЕсли;
Иначе
    Объект.Статус = Перечисления.СтатусыДокументов.Утверждён;
КонецЕсли;

Сценарий 4: Контроль сроков оплаты

Система автоматически проверяет просроченные платежи и формирует предупреждения разной степени критичности.

ДнейПросрочки = (ТекущаяДата() - Объект.ДатаОплаты) / 86400;

Если ДнейПросрочки <= 0 Тогда
    Статус = "В срок";
ИначеЕсли ДнейПросрочки <= 7 Тогда
    Статус = "Небольшая просрочка";
    ОтправитьНапоминание(Объект.Контрагент);
ИначеЕсли ДнейПросрочки <= 30 Тогда
    Статус = "Критическая просрочка";
    ОтправитьПретензию(Объект.Контрагент);
    ЗаблокироватьОтгрузки(Объект.Контрагент);
Иначе
    Статус = "Передано юристам";
    СоздатьЗадачуЮристу(Объект.Контрагент, ДнейПросрочки);
КонецЕсли;

Типичные ошибки и как их избежать

Ошибка 1: Сравнение с пустой ссылкой

Новички часто пишут Если Контрагент = "" Тогда, пытаясь проверить заполненность ссылочного реквизита. Это неправильно — строка и ссылка имеют разные типы. Для проверки пустоты ссылки используйте метод Пустая() или функцию ЗначениеЗаполнено().

// Неправильно:
Если Объект.Контрагент = "" Тогда

// Правильно:
Если Объект.Контрагент.Пустая() Тогда

// Тоже правильно (универсальный вариант):
Если НЕ ЗначениеЗаполнено(Объект.Контрагент) Тогда

Ошибка 2: Забытое «Тогда»

В отличие от большинства языков программирования, в 1С после условия обязательно идёт ключевое слово Тогда. Без него платформа выдаст синтаксическую ошибку. Это одна из самых частых ошибок при переходе с других языков.

Ошибка 3: Неправильный порядок в ИначеЕсли

Как уже упоминалось, порядок условий критически важен. Платформа выполняет первую ветку, условие которой истинно. Если расположить условия от мягкого к строгому, более специфичные ветки никогда не сработают.

Ошибка 4: Избыточная вложенность

Глубокая вложенность затрудняет чтение и отладку кода. Используйте паттерн «ранний выход»: проверяйте невалидные условия в начале процедуры и сразу выходите через Возврат.

// Глубокая вложенность (плохо):
Если УсловиеА Тогда
    Если УсловиеБ Тогда
        Если УсловиеВ Тогда
            // основной код
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

// Ранний выход (хорошо):
Если НЕ УсловиеА Тогда
    Возврат;
КонецЕсли;

Если НЕ УсловиеБ Тогда
    Возврат;
КонецЕсли;

Если НЕ УсловиеВ Тогда
    Возврат;
КонецЕсли;

// основной код — без вложенности

Условия в языке запросов 1С

Помимо встроенного языка, условные конструкции активно используются в языке запросов 1С. Здесь применяется оператор ВЫБОР, аналогичный CASE в SQL.

ВЫБОР
    КОГДА Продажи.Сумма >= 500000
        ТОГДА "Крупный заказ"
    КОГДА Продажи.Сумма >= 100000
        ТОГДА "Средний заказ"
    ИНАЧЕ "Мелкий заказ"
КОНЕЦ КАК КатегорияЗаказа

Оператор ВЫБОР можно использовать в секциях ВЫБРАТЬ, ГДЕ, УПОРЯДОЧИТЬ ПО и даже в условиях соединения таблиц. Это мощный инструмент для формирования вычисляемых полей и фильтрации данных на уровне СУБД.

Заключение

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

Если вы начинаете свой путь в разработке или хотите углубить знания — приложение Кодик поможет вам освоить программирование с нуля. Структурированные курсы по Python, JavaScript, HTML, CSS, 1С и другим технологиям, практические задания и понятные объяснения — всё в одном месте. Скачивайте приложение Кодик в App Store и Google Play, а если возникнут вопросы — присоединяйтесь к нашему Telegram-каналу с поддержкой, где больше 2000 разработчиков уже обсуждают код, делятся опытом и помогают друг другу. Вместе учиться проще!

🎯Hör auf zu zögern

Artikel gefallen?
Zeit zum Üben!

Bei Kodik liest du nicht nur — du schreibst sofort Code. Theorie + Praxis = echte Skills.

Sofortige Praxis
🧠KI erklärt Code
🏆Zertifikat

Keine Registrierung • Keine Karte