При работе с табличными документами в 1С часто возникает задача визуально выделить определенные данные. Например, подсветить ячейки в колонке "Статус" в зависимости от их значения. Стандартное условное оформление, примененное к табличному документу, часто форматирует всю строку, что не всегда соответствует бизнес-требованиям. Разберемся, как программно настроить условное оформление так, чтобы оно применялось только к ячейкам конкретной колонки.
Проанализируем ситуацию: у нас есть сформированный ТабличныйДокумент, и мы хотим, чтобы все ячейки в колонке "Статус" со значением "Выполнен" окрашивались в зеленый цвет. При этом остальные колонки в этих строках должны оставаться без изменений.
УсловноеОформлениеНаиболее правильный и гибкий способ — это работа с коллекцией УсловноеОформление самого табличного документа. Этот механизм, во многом опирающийся на объектную модель печатной формы и систему компоновки данных (СКД), позволяет декларативно описать правила форматирования, а платформа сама применит их при отображении документа. Рассмотрим этот процесс по шагам.
Шаг 1. Получаем доступ к коллекции и добавляем новый элемент оформления.
У каждого табличного документа есть свойство УсловноеОформление, которое хранит коллекцию правил. Нам нужно добавить в эту коллекцию новый элемент — наше будущее правило.
// Предполагаем, что ТабДок - это наш уже сформированный табличный документ
ЭлементУО = ТабДок.УсловноеОформление.Элементы.Добавить();
Шаг 2. Настраиваем само оформление (свойство Оформление).
Теперь нужно указать, что именно мы хотим изменить. В нашем случае — это цвет фона. Свойство Оформление элемента условного оформления отвечает за визуальные параметры. Мы устанавливаем значение для параметра "ЦветФона".
// Устанавливаем в качестве оформления светло-зеленый цвет фона
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЗеленый);
Здесь можно использовать стандартные цвета или определить свой через объект Цвет.
Шаг 3. Задаем условие (свойство Отбор).
Это ключевой момент, где мы определяем, при каком условии будет срабатывать наше оформление. Свойство Отбор представляет собой коллекцию элементов отбора, аналогичную отборам в СКД или динамических списках. Нам нужно добавить условие "Статус = 'Выполнен'".
Для этого мы создаем новый элемент отбора и настраиваем его:
ЛевоеЗначение: Поле, значение которого мы будем проверять. Важно, что здесь мы указываем не заголовок колонки (иногда требуется программное изменение заголовка группировки, но в данном контексте важно имя поля), а имя поля данных. В табличном документе имена полей соответствуют именам областей или параметрам, которыми они были заполнены. Указывается как Новый ПолеКомпоновкиДанных("ИмяПоля").ВидСравнения: Тип сравнения (Равно, НеРавно, В списке и т.д.).ПравоеЗначение: Значение, с которым будет сравниваться поле.Посмотрим на пример кода:
// Добавляем новый элемент в коллекцию отбора
НовыйЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
// Условие будет срабатывать, если поле "Статус" равно "Выполнен"
НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус");
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НовыйЭлементОтбора.ПравоеЗначение = "Выполнен";
НовыйЭлементОтбора.Использование = Истина;
Шаг 4. Указываем оформляемые поля (свойство Поля).
Это именно тот шаг, который решает нашу исходную задачу — применить оформление не ко всей строке, а только к нужной колонке. В свойстве Поля мы должны перечислить поля (колонки), к которым будет применяться оформление, заданное на шаге 2.
Если это свойство оставить пустым, оформление применится ко всей строке, где выполнилось условие. Нам же нужно указать только поле "Статус".
// Добавляем поле "Статус" в список оформляемых полей
ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("Статус");
ОформляемоеПоле.Использование = Истина;
Таким образом, мы явно говорим системе: "Когда найдешь строку, где `Статус` = 'Выполнен', примени зеленый фон, но только к колонке `Статус`".
Чтобы закрепить понимание, рассмотрим полный, самодостаточный пример в виде функции. Подобная логика часто востребована, когда реализуется пользовательская СКД для расширения возможностей стандартных отчетов. Функция создает табличный документ, заполняет его данными и применяет условное оформление.
&НаКлиенте
Процедура ПримерОформления(Команда)
Пример();
КонецПроцедуры
&НаСервере
Функция Пример()
// 1. Создаем и настраиваем табличный документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.ИмяПараметровВывода = "ПАРАМЕТРЫ_ВЫВОДА_КОМПОНОВКИ_ДАННЫХ";
// Определяем области макета
ОбластьШапка = ТабДок.ПолучитьОбласть("R1C1:R1C2");
ОбластьШапка.Параметры.Заполнить(Новый Структура("Наименование, Статус", "Наименование", "Статус"));
ТабДок.Вывести(ОбластьШапка);
ОбластьСтрока = ТабДок.ПолучитьОбласть("R2C1:R2C2");
// 2. Заполняем данными
ОбластьСтрока.Параметры.Заполнить(Новый Структура("Наименование, Статус", "Задача 1", "В работе"));
ТабДок.Вывести(ОбластьСтрока);
ОбластьСтрока.Parамeтры.Заполнить(Новый Структура("Наименование, Статус", "Задача 2", "Выполнен"));
ТабДок.Вывести(ОбластьСтрока);
ОбластьСтрока.Параметры.Заполнить(Новый Структура("Наименование, Статус", "Задача 3", "Отменен"));
ТабДок.Вывести(ОбластьСтрока);
ОбластьСтрока.Параметры.Заполнить(Новый Структура("Наименование, Статус", "Задача 4", "Выполнен"));
ТабДок.Вывести(ОбластьСтрока);
// 3. Настраиваем условное оформление
// Добавляем новый элемент оформления
ЭлементУО = ТабДок.УсловноеОформление.Элементы.Добавить();
// Задаем цвет фона
ЭлементУО.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Аквамарин);
// Устанавливаем отбор: поле "Статус" равно "Выполнен"
ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Статус");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = "Выполнен";
// Указываем, что оформлять нужно ТОЛЬКО поле "Статус"
ЭлементУО.Поля.Элементы.Добавить().Поле = Новый ПолеКомпоновкиДанных("Статус");
// Этот код можно использовать для вывода документа в форму
// Результат = Новый ХранилищеЗначения(ТабДок);
// Возврат Результат;
// Для демонстрации просто покажем документ
ТабДок.Показать();
КонецФункции
Этот код полностью демонстрирует весь цикл: от создания документа до применения сложного правила форматирования. Вы можете скопировать его в свою обработку, чтобы протестировать и адаптировать под свои нужды.
ОформлениеЯчеекСуществует и другой, более "ручной" способ — использование свойства ячейки ОформлениеЯчеек. Этот метод предполагает, что вы будете программно перебирать уже выведенные ячейки табличного документа, проверять их значения и вручную назначать цвет фона. В некоторых задачах визуализация требует более сложных манипуляций, таких как склейка нескольких картинок в одну ячейку на СКД.
Примерный алгоритм:
ТабДок.Область(НомерСтроки, НомерКолонки)).ЦветФона для этой области: ОбластьЯчейки.ЦветФона = WebЦвета.СветлоЗеленый;Важно понимать, что этот подход менее производителен на больших объемах данных и менее гибок. Он требует написания кода для итерации, тогда как механизм УсловноеОформление является декларативным — вы просто описываете правила, а платформа сама эффективно их применяет. Использовать прямое форматирование ячеек стоит только в простых случаях или когда логика оформления не может быть описана через стандартные отборы, даже если вам приходится использовать две разных схемы в одном отчете СКД.
Таким образом, для решения задачи выборочного форматирования колонок рекомендуется использовать свойство УсловноеОформление, уделяя особое внимание настройке коллекции Поля, которая и позволяет ограничить область применения форматирования.