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