Как раскрасить конкретную ячейку табличного поля в 1С (обычные формы)

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

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

Выбор правильного события: ПриПолученииДанных или ПриВыводеСтроки

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

  1. ПриВыводеСтроки (OnRowOutput): Это событие вызывается для каждой строки отдельно в момент её отрисовки на экране. Оно удобно для простых манипуляций, но если строк много, постоянный вызов процедуры может замедлить интерфейс.
  2. ПриПолученииДанных (OnGetData): Это более современный и оптимизированный метод. Событие вызывается один раз для всей порции строк, которые планируется отобразить на экране (например, при прокрутке). Мы рекомендуем использовать именно его, так как оно позволяет работать с коллекцией строк целиком.

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

Реализация условного оформления в событии ПриПолученииДанных

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


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

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

Работа с динамическими колонками (обращение по индексу)

Иногда мы не знаем заранее имя колонки (например, если это календарная сетка или "шахматка", где колонки создаются программно). В таких случаях к ячейке можно обратиться не по имени, а по индексу или используя переменную.

Проанализируем, как это выглядит в коде:


Для Каждого Колонка Из Элемент.Колонки Цикл
    // Если имя колонки начинается на "День"
    Если Найти(Колонка.Имя, "День") > 0 Тогда
        ИндексКолонки = Элемент.Колонки.Индекс(Колонка);
        ОформлениеСтроки.Ячейки[ИндексКолонки].ЦветФона = WebЦвета.СветлоЗеленый;
    КонецЕсли;
КонецЦикла;

Использование ОформлениеСтроки.Ячейки[Индекс] дает гибкость при работе со сложными отчетами и динамическими формами.

Важные аспекты производительности

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

Если для раскраски нужны данные из другой таблицы или регистра, выполним следующие шаги:

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

Дополнительные возможности оформления

Помимо свойства ЦветФона, объект ОформлениеЯчейки позволяет управлять и другими визуальными параметрами. Мы можем сделать данные более читаемыми, используя следующие свойства:

Проблема "затирания" и очистка оформления

Нужно учитывать важный нюанс: обычные формы кэшируют оформление строк. Если вы установили цвет ячейки для условия "А", а затем данные изменились и условие перестало выполняться, ячейка может остаться цветной.

Всегда используйте ветку Иначе, чтобы сбросить оформление в значения по умолчанию с помощью конструктора Новый Цвет() или Новый Шрифт(). Это гарантирует корректное отображение данных при динамическом изменении значений пользователем или при прокрутке списка.

Также помните, что яркий цвет фона может перекрывать системное выделение строки. Чтобы интерфейс оставался дружелюбным, старайтесь использовать пастельные тона из коллекции WebЦвета или выделять только цвет текста (ЦветТекста).

← На главную