Как правильно изменить цвет ячеек и оформление строки в табличном поле 1С?

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

При разработке обработок и форм в обычных формах 1С:Предприятие разработчики часто сталкиваются с ошибкой «Поле объекта не обнаружено (ОформлениеСтроки)». Это происходит при попытке напрямую обратиться к оформительским свойствам строк элемента формы ТабличноеПоле из произвольного места модуля программы, например, сразу после добавления строки в цикле.

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

Причины возникновения проблемы и ограничения платформы

Для понимания логики работы 1С рассмотрим два ключевых архитектурных принципа отображения данных в обычных формах:

  1. Разделение данных и их представления: Элемент управления ТабличноеПоле лишь отображает данные, находящиеся в его источнике (например, в объекте ТаблицаЗначений). Источник хранит только значения, а сама таблица формы отвечать за визуальные стили ячеек на постоянной основе не может. У элемента формы ТабличноеПоле нет свойства ОформлениеСтроки.
  2. Жизненный цикл объекта оформления: Объект ОформлениеСтроки создается платформой динамически только в момент прорисовки конкретных строк, попадающих в видимую область экрана пользователя. Он существует исключительно внутри аргументов специальных системных событий — ПриВыводеСтроки и ПриПолученииДанных.

Попытка вызвать ЭлементыФормы.ТабДом.ОформлениеСтроки вызовет исключение, так как у коллекции элементов управления такого поля нет.

Решение 1. Использование события ПриВыводеСтроки

Для изменения оформления отдельных строк или ячеек при прорисовке используется событие табличного поля ПриВыводеСтроки. В этот обработчик платформа автоматически передает параметры ОформлениеСтроки и ДанныеСтроки.

Рассмотрим пример установки цвета фона строки в зависимости от условий в данных:


Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Проверяем условие из данных текущей строки
    Если ДанныеСтроки.ЕстьРеализация Тогда
        ОформлениеСтроки.ЦветФона = WebЦвета.Красный;
        Возврат;
    КонецЕсли;
    
    Если ДанныеСтроки.ЕстьСчет Тогда
        ОформлениеСтроки.ЦветФона = WebЦвета.Желтый;
        Возврат;
    КонецЕсли;
    
КонецПроцедуры

Если необходимо раскрасить конкретную ячейку по номеру или имени колонки, обращаемся к коллекции Ячейки объекта ОформлениеСтроки:


Процедура ТабДомПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Установка цвета конкретной ячейки по индексу или имени
    ОформлениеСтроки.Ячейки[21].ЦветФона = WebЦвета.Красный;
    ОформлениеСтроки.Ячейки["Сумма"].Текст = "Заполнено";
    
КонецПроцедуры

Решение 2. Оптимизация через событие ПриПолученииДанных

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

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


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

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

Правила оптимизации производительности

Выясним распространенные ошибки при оформлении табличных полей, которые снижают скорость работы формы:

  1. Вынос общих настроек колонок из событий строки: Нельзя изменять ширину колонок, текст шапки или ЦветФонаШапки внутри циклов событий ПриВыводеСтроки. Эти действия должны выполняться один раз — при инициализации формы или сразу после вызова метода СоздатьКолонки().
  2. Предварительный расчет визуальных условий: Чтобы не выполнять сложные вычисления при каждом движении курсора, добавьте в источник данных служебную колонку (например, ИндексЦвета). Рассчитайте её значение при заполнении таблицы, а в событии ПриВыводеСтроки выполняйте только простое присвоение цвета по значению из этой колонки.

Альтернатива: Поле табличного документа

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

В объекте ТабличныйДокумент доступ к любой ячейке осуществляется напрямую через методы получения областей без применения специальных событий вывода:


// Пример прямого оформления ячеек в Табличном Документе
ОбластьЯчейка = ТабДок.Область(НомерСтроки, НомерКолонки);
ОбластьЯчейка.ЦветФона = WebЦвета.Красный;
ОбластьЯчейка.Текст = "Значение";
← На главную