Как программно раскрасить ячейки и строки в Табличном поле на обычных формах?

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

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

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

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

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

Рассмотрим два основных события:

  1. ПриВыводеСтроки — вызывается для каждой отдельной строки. Это удобно для простых вычислений, но крайне медленно, если строк тысячи, а внутри кода есть обращения к базе данных.
  2. ПриПолученииДанных — вызывается один раз для всей порции видимых строк (обычно 20–40 штук). Это «золотой стандарт» для раскраски, так как позволяет использовать пакетные запросы и минимизировать задержки интерфейса.

Шаг 1. Подготовка структуры данных

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

Допустим, у нас есть ТабличнаяЧасть или ТаблицаЗначений. Добавим в нее колонку СостояниеОбработки (тип: Число). В этой колонке мы будем хранить код состояния: 0 — не обработано, 1 — успешно, 2 — ошибка. При нажатии на кнопку анализа мы заполняем эту колонку:


Для каждого СтрокаДанных Из ТвоеТабличноеПоле Цикл
    // Проводим анализ данных
    Если ВсеХорошо Тогда
        СтрокаДанных.СостояниеОбработки = 1;
    Иначе
        СтрокаДанных.СостояниеОбработки = 2;
    КонецЕсли;
КонецЦикла;

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

Шаг 2. Реализация обработчика ПриПолученииДанных

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

Рассмотрим пример кода:


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

Шаг 3. Управление шрифтами и подсказками

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

Важный нюанс по оптимизации: создание нового объекта Шрифт — операция ресурсоемкая. Если мы будем создавать шрифт Новый Шрифт(..., , Истина) (жирный) для каждой ячейки внутри обработчика, интерфейс начнет тормозить. Правильно — создать нужные шрифты заранее в переменных модуля при открытии формы.


// В начале модуля формы
Перем ШрифтЖирный;

Процедура ПриОткрытии()
    ШрифтЖирный = Новый Шрифт(ЭлементыФормы.ТабличноеПоле.Шрифт, , , Истина);
КонецПроцедуры

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

Шаг 4. Обновление отображения после анализа

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

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


Процедура КнопкаВыполнитьНажатие(Кнопка)
    // ... Логика анализа данных ...
    
    // Принудительно заставляем таблицу перерисовать видимые строки
    ЭлементыФормы.ТабличноеПоле.ОбновитьСтроки();
КонецПроцедуры

Почему не стоит использовать условное оформление в свойствах?

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

Резюме для реализации

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

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

Используя этот подход, вы сможете создавать профессиональные и быстрые интерфейсы в 1С даже на «старых» обычных формах.

← На главную