Как оптимизировать и упростить сложные логические условия "Если" в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Рассмотрим исходную ситуацию. У нас есть две булевы переменные (Булево1 и Булево2) и две числовые колонки таблицы значений (Приём1 и Приём2). Автор столкнулся со следующим кодом, который коллеги попросили оптимизировать:


Если Булево1 и Булево2 И приём1 = 0 и приём2 = 0 Тогда
    КолонкаТЗ = 3;
ИначеЕсли булево1 и приём1 = 0 Тогда 
    КолонкаТЗ = 5;
ИначеЕсли булево2 и приём2 = 0 Тогда
    КолонкаТЗ = 5;
КонецЕсли;

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

Способ 1. Объединение условий через логическое "ИЛИ"

Самый очевидный способ упрощения — это объединение веток, которые приводят к одному и тому же результату. Если в двух разных блоках ИначеЕсли выполняется одно и то же действие, их логические выражения можно соединить оператором ИЛИ. Рассмотрим, как это выглядит на практике:


Если Булево1 И Булево2 И Приём1 = 0 И Приём2 = 0 Тогда
    КолонкаТЗ = 3;
ИначеЕсли (Булево1 И Приём1 = 0) ИЛИ (Булево2 И Приём2 = 0) Тогда
    КолонкаТЗ = 5;
КонецЕсли;

Почему это лучше? Мы сократили количество строк кода и четко обозначили, что значение 5 присваивается при выполнении любого из двух условий. Обратите внимание на скобки в блоке ИначеЕсли — они помогают визуально отделить логические группы, что упрощает чтение кода другими разработчиками.

Способ 2. Использование вспомогательных переменных

Часто код становится "нечитаемым" из-за того, что в одной строке смешиваются разные типы проверок. Хорошим тоном в профессиональной разработке считается вынос повторяющихся или сложных условий в отдельные переменные с понятными именами. Проанализируем, как это преобразит наш алгоритм:


Условие1 = Булево1 И (Приём1 = 0);
Условие2 = Булево2 И (Приём2 = 0);

Если Условие1 И Условие2 Тогда
    КолонкаТЗ = 3;
ИначеЕсли Условие1 ИЛИ Условие2 Тогда
    КолонкаТЗ = 5;
КонецЕсли;

Разберем преимущества этого подхода. Во-первых, код стал практически "самодокументированным". Во-вторых, если логика проверки Приём1 = 0 изменится (например, нужно будет проверять на NULL или на отрицательные числа), вам придется исправить код только в одном месте — при инициализации переменной Условие1.

Способ 3. Арифметический метод (вычисление "веса" условий)

Если нам нужно присваивать разные значения в зависимости от количества выполненных условий, можно применить интересный математический прием. В 1С булево значение легко преобразуется в число (Истина = 1, Ложь = 0). Выясним, как это применить в нашей задаче:


ВесУсловия1 = ?(Булево1 И Приём1 = 0, 1, 0);
ВесУсловия2 = ?(Булево2 И Приём2 = 0, 1, 0);
ОбщийВес = ВесУсловия1 + ВесУсловия2;

Если ОбщийВес = 2 Тогда
    КолонкаТЗ = 3; // Выполнены оба условия
ИначеЕсли ОбщийВес = 1 Тогда
    КолонкаТЗ = 5; // Выполнено ровно одно условие
КонецЕсли;

Этот метод особенно эффективен, когда условий становится больше двух. Он позволяет избежать вложенных конструкций Если...ИначеЕсли...КонецЕсли и делает логику линейной.

Способ 4. Краткая форма с использованием тернарного оператора

Если ваша задача — просто присвоить значение переменной и вы не хотите загромождать модуль длинными конструкциями, можно воспользоваться функцией ?(). Посмотрим на пример:


Условие1 = Булево1 И (Приём1 = 0);
Условие2 = Булево2 И (Приём2 = 0);

КолонкаТЗ = ?(Условие1 И Условие2, 3, ?(Условие1 ИЛИ Условие2, 5, КолонкаТЗ));

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

Важные технические нюансы при работе с условиями в 1С

При оптимизации кода важно помнить не только о красоте, но и о надежности. Рассмотрим несколько критических моментов:

  1. Работа с типами (Число vs Булево). В некоторых сообщениях на форумах предлагают использовать конструкцию Не Приём1, подразумевая, что 0 — это Ложь. Однако в 1С Приём1 — это число. Хотя неявное приведение типов может сработать, явное сравнение Приём1 = 0 гораздо безопаснее. Если Приём1 окажется равен NULL, попытка применить к нему НЕ вызовет ошибку исполнения, в то время как NULL = 0 просто вернет Ложь.
  2. Ленивые вычисления. Помните, что в 1С выражения в операторе И вычисляются последовательно. Если первое выражение ложно, остальные вычисляться не будут. Располагайте самые простые или самые вероятные проверки первыми в очереди.
  3. Значения по умолчанию. Иногда проще сначала задать переменной значение по умолчанию, а затем изменить его только при выполнении условий. Это избавляет от лишних веток Иначе.

Подводя итог, можно сказать, что лучшим решением для большинства задач является Способ 2 (вспомогательные переменные). Он идеально балансирует между краткостью кода и его понятностью для коллег. Чистый код — это не тот, который написан в одну строку, а тот, который не требует комментариев для понимания логики работы.

← На главную