Как реализовать произвольное условие в условном оформлении таблицы значений на управляемых формах?

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

При работе с управляемыми формами в 1С разработчики часто сталкиваются с необходимостью визуально выделить строки в таблице значений (ТЗ) или табличной части (ТЧ) на основе сложных вычислений. Например, нужно подсветить строку, если значение в одной колонке равно сумме двух других колонок. Стандартный механизм условного оформления (УО) позволяет сравнивать поля между собой или с конкретным значением, но не поддерживает арифметические операции вроде сложения, вычитания или сложные логические формулы непосредственно в настройках условия.

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

Почему нельзя написать формулу в условном оформлении?

Проанализируем техническую сторону вопроса. Механизм условного оформления в 1С оперирует объектами типа ПолеКомпоновкиДанных. Когда мы настраиваем оформление для коллекции в памяти (ТЗ или ТЧ), платформа использует упрощенный движок компоновки данных. В этом режиме доступны операции сравнения (равно, больше, в списке и т.д.), но отсутствует полноценный вычислительный процессор, который мог бы на лету для каждой строки выполнять произвольный код или арифметику вида Колонка1 + Колонка2.

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

Решение: Использование вспомогательного реквизита-флага

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

Шаг 1. Создание реквизита формы

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

Шаг 2. Настройка условного оформления

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

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

Шаг 3. Программный расчет условия

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

Разберем пример кода для расчета. Предположим, наше условие: Сумма = Цена * Количество. Если равенство нарушено — красим строку.

Для первоначального заполнения при загрузке данных используем серверные процедуры:


&НаСервере
Процедура РассчитатьУсловноеОформлениеНаСервере()
    
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        // Проверяем наше произвольное условие
        СтрокаТЧ.УсловиеВыполнено = (СтрокаТЧ.Сумма <> СтрокаТЧ.Цена * СтрокаТЧ.Количество);
    КонецЦикла;
    
КонецПроцедуры

Эту процедуру следует вызывать в обработчиках ПриСозданииНаСервере или ПриЧтенииНаСервере.

Оптимизация: Обновление при изменении данных

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

Вместо того чтобы пересчитывать всю таблицу при каждом изменении, мы будем обновлять только текущую строку. Рассмотрим пример для события ПриИзменении колонок "Количество" или "Сумма":


&НаКлиенте
Процедура ТоварыКоличествоПриИзменении(Элемент)
    
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    Если ТекущаяСтрока <> Неопределено Тогда
        // Обновляем флаг только для текущей строки
        ТекущаяСтрока.УсловиеВыполнено = (ТекущаяСтрока.Сумма <> ТекущаяСтрока.Цена * ТекущаяСтрока.Количество);
    КонецЕсли;
    
КонецПроцедуры

Использование события ПриИзменении предпочтительнее, чем ПриЗавершенииРедактирования, так как оно дает мгновенный визуальный отклик (UX), что делает работу пользователя с формой более комфортной.

Нюанс с Динамическими списками

Стоит отметить, что если ваша задача касается не ТаблицыЗначений, а Динамического списка, то подход будет иным. В динамических списках доступен полноценный механизм СКД. Вы можете добавить вычисляемое поле непосредственно в запрос списка или в настройках компоновки. Там арифметические операции (сложение полей, условия ВЫБОР КОГДА...) работают "из коробки" без создания дополнительных реквизитов в базе данных.

Выводы

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

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

← На главную