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

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

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

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

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

Почему не работает прямая раскраска элемента?

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


Пока выборка.Следующий() Цикл
    НовСтрока = Файлы.Добавить();
    // ... заполнение данных строки ...
    НовСтрока.Файл = выборка.Ссылка;

    Если выборка.Ссылка.ПометкаУдаления Тогда
        Элементы.ФайлыАвтор.ЦветФона = Новый Цвет(210, 126, 169); // Неверный подход
    КонецЕсли;
КонецЦикла;

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

Правильный и наиболее производительный способ — это программная настройка условного оформления. Разберем его по шагам.

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

Ключевая идея этого метода — подготовить данные для механизма условного оформления. Раз мы не можем проверить условие Ссылка.ПометкаУдаления напрямую, мы добавим в нашу таблицу значений служебную колонку, которая будет содержать результат этой проверки (Истина или Ложь). А уже по этой колонке настроим условное оформление.

  1. Добавляем служебную колонку в Таблицу Значений

    Для начала нужно убедиться, что в нашей таблице значений (назовем ее Файлы) есть колонка, которая будет служить флагом для раскраски. Добавим колонку с типом Булево, например, с именем ЕстьПометкаУдаления. Это можно сделать либо при объявлении реквизита формы, либо программно, перед заполнением таблицы.

  2. Заполняем данные с учетом нового флага

    Теперь изменим процедуру заполнения таблицы. При обходе результата запроса или другого источника данных мы будем проверять пометку на удаление у связанного объекта и записывать результат в нашу новую колонку.

    Посмотрим на пример процедуры заполнения:

    
    &НаСервере
    Процедура ЗаполнитьТаблицуФайлов()
    
        // Убедимся, что колонка существует. Это полезно, если реквизит не был настроен заранее.
        Если Файлы.Колонки.Найти("ЕстьПометкаУдаления") = Неопределено Тогда
            Файлы.Колонки.Добавить("ЕстьПометкаУдаления", Новый ОписаниеТипов("Булево"));
        КонецЕсли;
    
        // Очищаем таблицу перед заполнением
        Файлы.Очистить();
        
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |    ПрисоединенныеФайлы.Ссылка,
            |    ПрисоединенныеФайлы.Ссылка.ПометкаУдаления КАК ЕстьПометкаУдаления,
            |    ПрисоединенныеФайлы.Автор,
            |    ПрисоединенныеФайлы.ПолноеНаименование
            |ИЗ
            |    Справочник.ПрисоединенныеФайлы КАК ПрисоединенныеФайлы
            |ГДЕ
            |    ПрисоединенныеФайлы.ВладелецФайла = &Владелец";
    
        Запрос.УстановитьПараметр("Владелец", ЭтотОбъект.Ссылка);
    
        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            НовСтрока = Файлы.Добавить();
            НовСтрока.Файл = Выборка.Ссылка;
            НовСтрока.Автор = Выборка.Автор;
            НовСтрока.НаименованиеФайла = Выборка.ПолноеНаименование;
            
            // Заполняем нашу служебную колонку
            НовСтрока.ЕстьПометкаУдаления = Выборка.ЕстьПометкаУдаления;
        КонецЦикла;
    
    КонецПроцедуры
    

    Важный момент: тот факт, что колонка ЕстьПометкаУдаления не видна пользователю на форме, никак не мешает использовать её для условного оформления.

  3. Создаем условное оформление программно

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

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
        // Создаем новый элемент условного оформления
        ЭлементУО = УсловноеОформление.Элементы.Добавить();
    
        // 1. Настраиваем ОТБОР (условие срабатывания)
        // Условие: колонка "ЕстьПометкаУдаления" в таблице "Файлы" равна Истина
        ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Файлы.ЕстьПометкаУдаления"); // Обращаемся к нашей служебной колонке
        ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбора.ПравоеЗначение = Истина;
        ЭлементОтбора.Использование = Истина;
    
        // 2. Настраиваем ОФОРМЛЕНИЕ (что нужно сделать)
        // Устанавливаем цвет фона
        ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 204, 204)); // Светло-красный
    
        // 3. Указываем ОФОРМЛЯЕМЫЕ ПОЛЯ (к чему применить)
        // Чтобы раскрасить всю строку, а не одну ячейку,
        // нужно добавить в оформляемые поля саму таблицу.
        ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
        ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Файлы"); // Указываем имя таблицы
    
    КонецПроцедуры
    

    Проанализируем этот код подробнее:

    • ЭлементУО = УсловноеОформление.Элементы.Добавить(): мы создаем новый объект настройки оформления.
    • ЭлементУО.Отбор: здесь мы описываем условие, при котором будет срабатывать оформление. Мы указываем, что левое значение (наше поле Файлы.ЕстьПометкаУдаления) должно быть равно (ВидСравнения.Равно) правому значению (Истина).
    • ЭлементУО.Оформление: здесь мы задаем, как именно должен измениться внешний вид. В нашем случае — устанавливаем параметр ЦветФона.
    • ЭлементУО.Поля: здесь мы указываем, к каким элементам формы применить оформление. Это критически важный момент. Если бы мы указали поле конкретной колонки, например Новый ПолеКомпоновкиДанных("Файлы.НаименованиеФайла"), то раскрасилась бы только одна ячейка в строке. Указав имя всей таблицы ("Файлы"), мы даем платформе команду применить оформление ко всей строке целиком.

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

← На главную