Как покрасить одну строку в таблице 1С?

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

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

Исходный код, который попытался применить автор сообщения:


СписокЗначений = ЭтаФорма.Элементы.Состав; 
СписокЗначений.ЦветФона = WebЦвета.Красный;

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

Основные подходы к окрашиванию строк

Для окрашивания строк в таблицах 1С существует два основных механизма, выбор которых зависит от типа формы, которую вы используете: условное оформление для управляемых форм и обработка событий для обычных форм. Рассмотрим их подробнее.

Окрашивание строк на управляемых формах: Условное оформление

На управляемых формах 1С рекомендуемым и наиболее гибким методом для окрашивания строк является использование условного оформления. Этот механизм позволяет задавать правила оформления (цвет фона, цвет текста, шрифт, видимость и т.д.) в зависимости от значений данных в строке или других условий. Мы можем настроить условное оформление как интерактивно через конфигуратор, так и программно.

Почему условное оформление?

  1. Разделение логики: Описание внешнего вида отделяется от основного кода бизнес-логики.
  2. Гибкость: Позволяет задавать сложные условия для оформления.
  3. Производительность: Платформа оптимизирована для работы с условным оформлением.
  4. Поддержка: Легко модифицировать правила без изменения кода.

1. Интерактивная настройка условного оформления (через конфигуратор)

Это самый простой способ, если условие оформления статично или зависит от данных, которые уже присутствуют в источнике таблицы:

  1. Откройте форму в конфигураторе.
  2. Выберите элемент управления "Таблица" (или "Динамический список") на форме.
  3. В окне "Свойства" найдите свойство УсловноеОформление и нажмите кнопку [...] для его настройки.
  4. В открывшемся окне "Условное оформление" добавьте новый элемент.
  5. Укажите оформление: на вкладке "Оформление" установите нужный ЦветФона, ЦветТекста, Шрифт и другие параметры.
  6. Задайте условие: на вкладке "Условие" выберите поле, по значению которого будет определяться необходимость окрашивания строки (например, Состояние = "Красный" или ЭтоВыделеннаяСтрока = Истина).
  7. Укажите оформляемые поля: на вкладке "Оформляемые поля" укажите, к каким полям применяется оформление. Если вы хотите окрасить всю строку целиком, убедитесь, что в этом списке нет полей (тогда оформление применится ко всей строке), либо перечислите все поля, которые должны быть окрашены.

Совет: Добавление невидимой колонки для выделения

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

Например, в запросе динамического списка мы можем добавить поле:


ВЫБРАТЬ
    Документ.Ссылка,
    Документ.Номер,
    ...
    ЛОЖЬ КАК ЭтоВыделеннаяСтрока // Изначально все строки не выделены
ИЗ
    Документ

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

2. Программное создание условного оформления

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

Рассмотрим шаги для программной настройки:

  1. Создаем элемент условного оформления: Мы инициализируем новый объект ЭлементУсловногоОформления.
  2. Задаем свойства оформления: Мы устанавливаем такие параметры, как ЦветФона, ЦветТекста, Шрифт и другие. Для цветов используем объект Новый Цвет() или предопределенные WebЦвета.
  3. Добавляем условие: Мы создаем объект ЭлементОтбораКомпоновкиДанных, чтобы указать, по какому правилу будет применяться оформление. Это условие ссылается на поле данных и его значение.
  4. Указываем оформляемые поля: Мы определяем, какие поля таблицы должны быть затронуты этим оформлением. Если список пуст, оформление применяется ко всей строке.
  5. Применяем к элементу формы: Указываем элемент формы (например, табличное поле), к которому относится это оформление.

Давайте посмотрим на пример кода, который выделяет строку красным цветом, если значение в колонке "Состояние" равно "Критическое".


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

    // ... ваш остальной код инициализации формы ...

    НастроитьУсловноеОформление();

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

&НаСервере
Процедура НастроитьУсловноеОформление()

    // Очищаем существующее условное оформление, чтобы избежать дублирования
    ЭтаФорма.УсловноеОформление.Очистить();

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

    // 2. Задаем свойства оформления (например, красный цвет фона)
    НовыйЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Красный);
    НовыйЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Белый); // Для контраста

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

    // 4. Указываем оформляемые поля
    // Если список пуст, оформление применяется ко всей строке
    // Если нужно конкретное поле:
    // ПолеОформления = НовыйЭлементОформления.Поля.Добавить();
    // ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ИмяПоля"); 

    // 5. Применяем к элементу формы (если у нас таблица с именем "МояТаблица")
    // Если не указать, применяется ко всей форме
    НовыйЭлементОформления.Область.Элементы.Добавить(ЭтаФорма.Элементы.МояТаблица);

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

В этом примере мы создали условное оформление, которое будет окрашивать строку таблицы "МояТаблица" в красный цвет с белым текстом, если значение в колонке "Состояние" этой строки равно "Критическое". Этот подход очень мощный и гибкий.

3. Использование события ПриПолученииДанныхНаСервере (для динамических списков, 8.3.10+)

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

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


&НаСервере
Процедура СписокПриПолученииДанныхНаСервере(Элемент, Данные, Отказ)

    Для Каждого СтрокаТЗ Из Данные Цикл
        // Пример: если значение поля "Количество" меньше 10, красим строку в желтый
        Если СтрокаТЗ.Количество < 10 Тогда
            
            // Создаем новый элемент условного оформления для текущей строки
            ЭлементОформленияСтроки = СтрокаТЗ.УсловноеОформление.Добавить();
            
            // Устанавливаем цвет фона
            ЭлементОформленияСтроки.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Желтый);
            
            // Можно также установить цвет текста, шрифт и т.д.
            // ЭлементОформленияСтроки.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Черный);

            // Если нужно применить только к определенным полям строки,
            // можно добавить элементы в коллекцию Поля:
            // ПолеОформления = ЭлементОформленияСтроки.Поля.Добавить();
            // ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Количество");
            
        КонецЕсли;

        // Если нужно выделить одну конкретную строку по какому-то признаку
        // Например, если в поле "КлючеваяСтрока" установлено Истина
        Если СтрокаТЗ.КлючеваяСтрока Тогда
            ЭлементОформленияКлючевой = СтрокаТЗ.УсловноеОформление.Добавить();
            ЭлементОформленияКлючевой.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.СветлоЗеленый);
        КонецЕсли;

    КонецЦикла;

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

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

Окрашивание строк на обычных формах: События ПриПолученииДанных / ПриВыводеСтроки

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

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

Событие ПриПолученииДанных:

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


Процедура МояТаблицаПриПолученииДанных(Элемент, ОформлениеСтроки, ДанныеСтроки)

    // Пример: Если значение в колонке "Сумма" больше 1000, красим строку в синий
    Если ДанныеСтроки.Сумма > 1000 Тогда
        ОформлениеСтроки.ЦветФона = Новый Цвет(200, 220, 255); // Светло-синий
        ОформлениеСтроки.ЦветТекста = Новый Цвет(0, 0, 150);   // Темно-синий текст
    ИначеЕсли ДанныеСтроки.Сумма < 0 Тогда
        ОформлениеСтроки.ЦветФона = WebЦвета.Красный; // Если сумма отрицательная, красим в красный
        ОформлениеСтроки.ЦветТекста = WebЦвета.Белый;
    КонецЕсли;

    // Чтобы окрасить только одну конкретную строку, нам нужно какое-то условие.
    // Например, если мы хотим окрасить первую строку
    Если Элемент.ТекущаяСтрока = ДанныеСтроки.ПолучитьИдентификатор() Тогда // Или другое условие для идентификации первой строки
        ОформлениеСтроки.ЦветФона = WebЦвета.Зеленый;
    КонецЕсли;

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

Событие ПриВыводеСтроки:

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


Процедура МояТаблицаПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

    // Аналогично ПриПолученииДанных
    Если ДанныеСтроки.Статус = "Завершено" Тогда
        ОформлениеСтроки.ЦветФона = WebЦвета.СветлоСерый;
    КонецЕсли;

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

Как окрасить только одну строку?

Если наша задача – окрасить только одну, конкретную строку, нам необходимо обеспечить уникальное условие для этой строки. Мы уже упоминали подход с невидимой колонкой-признаком для управляемых форм. Для обычных форм это также актуально. Мы можем добавить в источник данных табличного поля булево поле (например, Выделена) и установить его в Истина только для той строки, которую нужно выделить. Затем в обработчике ПриПолученииДанных мы проверяем это поле:


Процедура МояТаблицаПриПолученииДанных(Элемент, ОформлениеСтроки, ДанныеСтроки)

    Если ДанныеСтроки.Выделена Тогда
        ОформлениеСтроки.ЦветФона = WebЦвета.Красный;
        ОформлениеСтроки.ЦветТекста = WebЦвета.Белый;
    КонецЕсли;

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

Для того чтобы установить Выделена = Истина для конкретной строки, нам потребуется программно найти эту строку в источнике данных (например, в табличной части объекта или в таблице значений, которая является источником) и изменить ее значение.

Заключение

Мы выяснили, что прямой установкой свойства ЦветФона для всего элемента управления мы не можем добиться окрашивания отдельных строк таблицы. Вместо этого, для решения задачи окрашивания одной или нескольких строк в таблицах 1С мы должны использовать специализированные механизмы:

  1. На управляемых формах – это условное оформление, которое может быть настроено интерактивно или программно. В качестве условия удобно использовать специальное невидимое поле-признак. Для динамических списков версии 8.3.10 и выше также доступно событие ПриПолученииДанныхНаСервере.
  2. На обычных формах – это обработка событий ПриПолученииДанных или ПриВыводеСтроки табличного поля, где мы управляем объектом ОформлениеСтроки.

Выбирайте подход, соответствующий типу вашей формы и сложности требуемого условия. Использование условного оформления на управляемых формах является наиболее современным, гибким и производительным решением.

← На главную