Как в условном оформлении 1С сравнить две колонки и проверить значение больше нуля?

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

При настройке интерфейса управляемых форм часто возникает задача визуально выделить строки табличной части по сложному правилу. Например, когда требуется подсветить цветом строки, у которых значения двух колонок не совпадают, но при этом вторая колонка строго больше нуля: (Колонка1 <> Колонка2) И (Колонка2 > 0).

Начинающие разработчики нередко сталкиваются с затруднением: как одновременно сравнить одну колонку с другой и проверить числовое условие, если в одной строке отбора есть только левое и правое значение? Разберем подробно механику работы условного оформления в конфигураторе и программном коде.

Принцип работы отбора в условном оформлении

Проанализируем структуру отбора условного оформления. Элемент условного оформления оперирует стандартной системой компоновки данных. Главная особенность, о которой важно помнить: корневой элемент Отбор уже по умолчанию связывает все входящие в него условия логическим оператором «И».

Следовательно, для реализации составного условия не требуется создавать вложенные конструкции, если только нам не нужно условие «ИЛИ». Достаточно последовательно добавить два независимых элемента отбора:

  1. Первый элемент отбора сравнивает Колонка1 и Колонка2 на неравенство.
  2. Второй элемент отбора сравнивает Колонка2 со статическим числом 0 на условие «Больше».

Способ 1. Интерактивная настройка в конфигураторе

Разберем по шагам, как настроить такое условие в свойствах управляемой формы без написания программного кода:

  1. Откроем нужную форму в конфигураторе и перейдем в свойства формы (палитра свойств).
  2. Найдем свойство УсловноеОформление и нажмем кнопку открытия диалога настройки.
  3. Добавим новый элемент оформления и на вкладке Оформление установим желаемые параметры (например, ЦветФона или ЦветТекста).
  4. Перейдем на вкладку Оформляемые поля и добавим поля таблицы, которые должны изменить свой цвет. Обратите внимание: чтобы окрасить строку целиком в табличной части, необходимо добавить в список оформляемых полей все видимые колонки строки.
  5. Перейдем на вкладку Отбор и добавим первое условие: в качестве левого значения выберем поле первой колонки (например, Объект.Товары.Колонка1), вид сравнения установим Не равно. В правом значении нажмем кнопку выбора типа и переключим режим на Поле компоновки данных, после чего выберем вторую колонку (Объект.Товары.Колонка2).
  6. Добавим второе условие в этот же корень отбора: левое значение — Объект.Товары.Колонка2, вид сравнения — Больше, правое значение — обычное число 0.

Поскольку оба условия находятся на одном уровне дерева отбора, платформа автоматически объединит их оператором «И».

Способ 2. Программная настройка условного оформления

Посмотрим на пример создания аналогичной настройки в коде модуля формы. Как правило, такой код размещается в обработчике события ПриСозданииНаСервере.

Рассмотрим реализацию:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // Создаем новый элемент условного оформления
    ЭлементУО = УсловноеОформление.Элементы.Добавить();

    // 1. Настройка оформления
    ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветОшибки);

    // 2. Условие 1: Колонка1 <> Колонка2
    ЭлементОтбора1 = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора1.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Колонка1");
    ЭлементОтбора1.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
    ЭлементОтбора1.ПравоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Колонка2");

    // 3. Условие 2: Колонка2 > 0
    ЭлементОтбора2 = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора2.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Колонка2");
    ЭлементОтбора2.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
    ЭлементОтбора2.ПравоеЗначение = 0;

    // 4. Указываем оформляемые поля строки
    ПолеКолонка1 = ЭлементУО.Поля.Элементы.Добавить();
    ПолеКолонка1.Поле = Новый ПолеКомпоновкиДанных("ТоварыКолонка1");

    ПолеКолонка2 = ЭлементУО.Поля.Элементы.Добавить();
    ПолеКолонка2.Поле = Новый ПолеКомпоновкиДанных("ТоварыКолонка2");

КонецПроцедуры

Обратим внимание на ключевую деталь: когда в качестве правого значения выступает другая колонка, мы обязательно создаем объект Новый ПолеКомпоновкиДанных(...). Если передать обычную строку, платформа воспримет ее как текстовое значение, а не ссылку на колонку.

Способ 3. Вычисление признака в строке (оптимально для больших таблиц)

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

  1. Добавим в табличную часть служебный реквизит типа Булево (например, ТребуетсяВыделение).
  2. При изменении значений в строках таблицы пересчитаем данный флаг по необходимой логике:

СтрокаТаблицы.ТребуетсяВыделение = (СтрокаТаблицы.Колонка1 <> СтрокаТаблицы.Колонка2) И (СтрокаТаблицы.Колонка2 > 0);
  1. Условное оформление настраиваем на простую проверку: Объект.Товары.ТребуетсяВыделение Равно Истина.

Такой подход делает правило оформления максимально легковесным для отрисовки платформой и упрощает дальнейшую отладку сложных составных условий.

← На главную