Как правильно настроить проверку нескольких условий в 1С, чтобы срабатывали сложные комбинации?

Программист IT и автоматизация бизнеса
← На главную

В практике программирования на платформе 1С разработчики часто сталкиваются с ситуацией, когда логическая цепочка условий Если...ИначеЕсли...КонецЕсли работает не так, как ожидалось. Типичный пример: число должно соответствовать нескольким критериям одновременно, но программа «останавливается» на первом же подошедшем условии, игнорируя остальные. Рассмотрим подробнее, почему это происходит и как правильно выстраивать логику ветвления.

Анализ проблемы: почему не срабатывает комбинированное условие?

Разберем ситуацию на примере задачи с делимостью чисел. Допустим, у нас есть число 36. Мы хотим, чтобы программа определила: делится ли оно на 2, на 3 или на оба этих числа сразу. Исходный (ошибочный) код может выглядеть так:


Для Каждого Число Из СлучайныеЧисла Цикл
    Если Число % 2 = 0 Тогда
        Сообщить("Число " + Строка(Число) + " чётное");
    ИначеЕсли Число % 3 = 0 Тогда
        Сообщить("Число " + Строка(Число) + " делится на 3");
    ИначеЕсли (Число % 2 = 0) И (Число % 3 = 0) Тогда
        Сообщить("Число " + Строка(Число) + " делится и на 2, и на 3");
    Иначе
        Сообщить("Число " + Строка(Число) + " не подходит");
    КонецЕсли;
КонецЦикла;

В этом примере для числа 36 программа выведет только «Число 36 чётное». Почему? Потому что конструкция ИначеЕсли является взаимоисключающей. Как только система находит первое истинное условие (в данном случае 36 % 2 = 0), она выполняет соответствующий блок кода и полностью выходит из всей конструкции Если, игнорируя все последующие проверки ИначеЕсли. Комбинированное условие, стоящее в конце, превращается в так называемый «мертвый код», который никогда не будет исполнен для чисел, делящихся на 2.

Решение №1: Принцип «От частного к общему»

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

Проанализируем наши условия:

  1. Условие «Делится на 2 И на 3» — самое узкое, оно охватывает меньше всего чисел (только кратные 6).
  2. Условие «Делится на 2» — более широкое.
  3. Условие «Делится на 3» — также широкое.

Правильный порядок кода будет выглядеть следующим образом:


Для Каждого Число Из СлучайныеЧисла Цикл
    // Сначала проверяем самую строгую комбинацию
    Если (Число % 2 = 0) И (Число % 3 = 0) Тогда
        Сообщить("Число " + Строка(Число) + " делится и на 2, и на 3");
    ИначеЕсли Число % 2 = 0 Тогда
        Сообщить("Число " + Строка(Число) + " чётное");
    ИначеЕсли Число % 3 = 0 Тогда
        Сообщить("Число " + Строка(Число) + " делится на 3");
    Иначе
        Сообщить("Число " + Строка(Число) + " не подходит");
    КонецЕсли;
КонецЦикла;

Теперь для числа 36 сработает первая ветка, и мы получим корректный результат.

Решение №2: Математическая оптимизация через общее кратное

Рассмотрим ситуацию с точки зрения математики. Если число делится одновременно на 2 и на 3, то оно обязательно делится на их наименьшее общее кратное — 6. Мы можем упростить код, заменив логическое И на одну операцию деления. Это не только сделает код чище, но и немного ускорит его выполнение в высоконагруженных циклах.


Если Число % 6 = 0 Тогда
    Сообщить("Число делится на 2 и на 3");
КонецЕсли;

Решение №3: Метод накопления результата (отказ от ElseIf)

Если задача требует, чтобы мы сообщали обо всех свойствах числа (например, «Число 66: делится на 2, делится на 3»), то конструкция ИначеЕсли нам вовсе не подходит. В таких случаях лучше использовать независимые условия Если и накапливать результат в строковую переменную.

Разберем этот подход по шагам:


Результат = "";

// Проверяем делимость на 2
Если Число % 2 = 0 Тогда
    Результат = "делится на 2";
КонецЕсли;

// Проверяем делимость на 3 независимо
Если Число % 3 = 0 Тогда
    Если ПустаяСтрока(Результат) Тогда
        Результат = "делится на 3";
    Иначе
        Результат = Результат + " и на 3";
    КонецЕсли;
КонецЕсли;

// Выводим итог
Если ПустаяСтрока(Результат) Тогда
    Сообщить("Число " + Число + " не подходит под условия");
Иначе
    Сообщить("Число " + Число + " " + Результат);
КонецЕсли;

Этот метод гораздо более гибкий. Если завтра в задачу добавится проверка на делимость на 5, нам не придется перестраивать всю пирамиду ИначеЕсли и высчитывать новые комбинации (2 и 5, 3 и 5, 2 и 3 и 5). Мы просто добавим еще один независимый блок Если.

Важные особенности логики в 1С

Проанализируем еще один важный технический аспект — оптимизацию вычисления логических выражений. В языке 1С при использовании оператора И (AND), если первая часть условия оказывается ложной, система не вычисляет вторую часть. Это называется «коротким циклом» вычислений.

Например, в выражении Если (А = 1) И (ПроверитьЗначение(Б)) Тогда:

Для нашей задачи с числами это означает, что порядок условий внутри скобок (сначала 2, потом 3) не влияет на конечный результат, но знание этого механизма помогает избегать ошибок в более сложных программных модулях.

Резюме для разработчика

Чтобы избежать логических ловушек при работе с комбинированными условиями, придерживайтесь следующих рекомендаций:

  1. При использовании ИначеЕсли всегда ставьте самые сложные и специфические проверки в начало списка.
  2. Используйте таблицы истинности, чтобы проверить все возможные комбинации (Да/Нет для каждого условия).
  3. Если условия не являются взаимоисключающими, используйте несколько независимых блоков Если вместо одной большой цепочки.
  4. Для проверки делимости на несколько чисел эффективнее использовать их наименьшее общее кратное.

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

← На главную