Как изменить цвет ячейки в таблице значений, если в ней хранится Список значений

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

В разработке на управляемых формах 1С часто возникает задача визуального выделения данных. Если с простыми типами (строка, число, булево) Условное оформление справляется «из коробки», то работа со сложными типами, такими как СписокЗначений, может завести в тупик. Платформа отображает список в ячейке как набор представлений, разделенных запятыми, но механизм оформления не всегда может корректно «заглянуть» внутрь этого объекта.

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

Почему стандартное условное оформление может не работать

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

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

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

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

Для реализации этого метода в процедуре ПриСозданииНаСервере можно использовать следующий алгоритм:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Предположим, у нас 31 колонка с именами "День1", "День2" и т.д.
    Для Сч = 1 по 31 Цикл
        
        ИмяПоляДанных = "Объект.ТаблицаГрафика.День" + Сч;
        ИмяЭлементаФормы = "ТаблицаГрафикаДень" + Сч;
        
        ЭлементУО = УсловноеОформление.Элементы.Добавить();
        
        // Настраиваем отбор: ищем текст "ПМ" в значении списка
        ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоляДанных);
        ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
        ЭлементОтбора.ПравоеЗначение = "ПМ";
        
        // Указываем, какое поле на форме нужно раскрасить
        ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
        ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяЭлементаФормы);
        
        // Задаем цвет фона
        ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоРозовый);
        
    КонецЦикла;
    
КонецПроцедуры

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


НоваяСтрокаСписка = СтрокаТаблицы["День" + НомерДня].Добавить();
НоваяСтрокаСписка.Значение = "Текст примечания";
НоваяСтрокаСписка.Представление = "ПМ"; // Тот самый маркер для оформления

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

Способ 2. Использование вспомогательных колонок-флагов (рекомендуемый)

Проанализируем самый стабильный способ решения задачи. Вместо того чтобы заставлять систему «парсить» сложный объект СписокЗначений во время отрисовки интерфейса, мы можем заранее подготовить для нее простой сигнал (флаг).

Разберем этот метод по шагам:

  1. Добавление реквизитов: Добавим в таблицу значений на форме скрытые колонки типа Булево для каждой колонки со списком. Например, если есть колонка День1, создаем День1_ЕстьПМ.
  2. Заполнение флагов: В момент формирования таблицы или при изменении данных в списке значений, мы анализируем содержимое списка. Если находим элемент с нужным нам признаком, устанавливаем Истина в соответствующую вспомогательную колонку.
  3. Настройка оформления: Условное оформление настраиваем на видимую колонку (со списком), но условие (отбор) прописываем по скрытой колонке-флагу.

Посмотрим на пример кода, реализующего логику заполнения:


&НаСервере
Процедура ОбновитьФлагиОформления(СтрокаТаблицы)
    Для Сч = 1 по 31 Цикл
        ИмяКолонкиСписок = "День" + Сч;
        ИмяКолонкиФлаг = "День" + Сч + "_ЕстьПМ";
        
        ЕстьПризнак = Ложь;
        Для Каждого ЭлементСписка Из СтрокаТаблицы[ИмяКолонкиСписок] Цикл
            Если ЭлементСписка.Представление = "ПМ" Тогда
                ЕстьПризнак = Истина;
                Прервать;
            КонецЕсли;
        КонецЦикла;
        
        СтрокаТаблицы[ИмяКолонкиФлаг] = ЕстьПризнак;
    КонецЦикла;
КонецПроцедуры

Теперь настройка Условного оформления через интерфейс (или программно) становится максимально простой: если День1_ЕстьПМ равно Истина, тогда применить цвет фона к полю День1. Платформа мгновенно отрабатывает такие условия, так как сравнение Булево — это самая легкая операция для движка отрисовки.

Принудительное обновление отображения

Выясним еще одну причину, по которой цвет может не меняться вовремя. Если вы изменяете содержимое СпискаЗначений напрямую (например, через контекстное меню или программно без перезаписи всей строки таблицы), платформа может не «понять», что данные изменились и нужно пересчитать оформление.

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

ЭтаФорма.ОбновитьОтображениеДанных();

Это заставит управляемую форму заново проанализировать все правила условного оформления и обновить цвета ячеек в соответствии с актуальными данными.

Подведем итоги

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

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

← На главную