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

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

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

Постановка задачи

Представим ситуацию: у нас есть обработка-анализатор, на форме которой расположена ТаблицаЗначений (или табличная часть). В таблице присутствуют две колонки: Цена и ЦенаСтарая (для работы с более сложными структурами посмотрите методы доработки динамических списков). Нам необходимо, чтобы система автоматически окрашивала ячейки в красный цвет, если значения в этих колонках различаются. Это позволит пользователю мгновенно определить строки с изменениями, не вчитываясь в цифры.

Интерактивная настройка условного оформления

Для начала рассмотрим самый простой и быстрый способ решения задачи — настройку через свойства формы в конфигураторе. Этот метод идеально подходит, если структура таблицы статична и известна заранее.

Разберем процесс по шагам:

  1. Откроем форму, на которой расположена наша таблица.
  2. В окне свойств формы найдем строку УсловноеОформление и нажмем на кнопку открытия (три точки).
  3. В появившемся окне добавим новый элемент оформления.
  4. Настройка оформления: В колонке «Оформление» выберем нужные нам визуальные изменения. Например, установим ЦветФона или ЦветТекста. Рекомендуется выбирать системные цвета, такие как ЦветОтрицательногоИтога, чтобы интерфейс выглядел гармонично в любой цветовой схеме.
  5. Настройка условия: Это самый важный этап. Нам нужно добавить новое условие.
    • В левой части условия выбираем поле Объект.ИмяТвоейТЧ.Цена.
    • Вид сравнения устанавливаем в положение Не равно.
    • В правой части по умолчанию предлагается ввести конкретное значение (число или строку). Однако нам нужно сравнить поле с полем. Для этого нажмем на кнопку выбора типа значения в правой части и выберем Поле компоновки данных. После этого выберем колонку Объект.ИмяТвоейТЧ.ЦенаСтарая.
  6. Оформляемые поля: Здесь мы указываем, какие именно ячейки будут окрашены. Если оставить список пустым, выделится вся строка. Если мы хотим выделить только ячейки с ценами, добавим в список поля Цена и ЦенаСтарая.

Программная настройка условного оформления

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

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


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

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

    // 2. Устанавливаем само оформление (Цвет фона)
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", ЦветаСтиля.ЦветОтрицательногоИтога);

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

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

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

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

Важные нюансы при сравнении значений

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

Учет пустых значений: Если одна из колонок не заполнена (равна 0), условие Не равно все равно сработает. Если вы хотите выделять различия только тогда, когда обе цены заполнены, в Отбор необходимо добавить дополнительные элементы с видом сравнения Заполнено для обеих колонок.

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

Приоритет правил: Если для одной таблицы создано несколько правил (например, одно красит разницу в ценах в красный, а другое красит пустые строки в серый), платформа применяет их последовательно. Правило, которое находится ниже в списке УсловноеОформление, имеет более высокий приоритет. Оно может перекрыть настройки предыдущего правила, если условия обоих выполняются одновременно.

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

Ранее программисты часто использовали событие ПриВыводеСтроки (в обычных формах), что существенно замедляло работу интерфейса при больших объемах данных. В управляемом приложении механизм УсловноеОформление работает на уровне платформы. Это означает, что расчет цветов и шрифтов происходит на сервере в момент подготовки данных для отображения, что минимизирует нагрузку на клиентское приложение и обеспечивает плавную прокрутку даже очень больших таблиц. Для работы с большими таблицами и сложными расчетами есть установка цен с визуальным анализом отклонений.

Использование системных цветов стиля (например, ЦветОсобогоТекста) вместо жестко заданных RGB-значений позволит вашему решению корректно выглядеть даже при смене пользователем темы оформления 1С на темную или высококонтрастную.

← На главную