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