При формировании нестандартных отчетов или визуализации данных в табличном документе 1С разработчики сталкиваются с задачей подсветки строк. Иногда требуется выделить каждую строку уникальным или случайным цветом, либо настроить гармоничное чередование оттенков. Рассмотрим различные подходы к решению этой задачи, возможные сложности с читаемостью текста и оптимальные программные приемы.
Для создания произвольного цвета в платформе 1С используется конструктор Новый Цвет(R, G, B), где каждый компонент принимает значение от 0 до 255. Чтобы получить случайные значения, применим объект ГенераторСлучайныхЧисел.
Разберем по шагам, как сгенерировать случайный цвет и применить его к строке табличного документа:
ГСЧ = Новый ГенераторСлучайныхЧисел();
// Чтобы цвета не были слишком темными и едкими, ограничим диапазон пастельными тонами (от 200 до 255)
Красный = ГСЧ.СлучайноеЧисло(200, 255);
Зеленый = ГСЧ.СлучайноеЧисло(200, 255);
Синий = ГСЧ.СлучайноеЧисло(200, 255);
СлучайныйЦвет = Новый Цвет(Красный, Зеленый, Синий);
ОбластьСтроки = ТабличныйДокумент.Область(НомерСтроки, 1, НомерСтроки, ТабличныйДокумент.ШиринаТаблицы);
ОбластьСтроки.ЦветФона = СлучайныйЦвет;
Если генерировать цвета в полном диапазоне от 0 до 255, неизбежно возникнет ситуация, когда на темном фоне отобразится стандартный черный текст (эффект «черное на черном»). Чтобы отчет оставался читаемым, проанализируем яркость фона и динамически установим цвет текста.
Для расчета яркости применим стандартную формулу относительной яркости:
ГСЧ = Новый ГенераторСлучайныхЧисел();
R = ГСЧ.СлучайноеЧисло(0, 255);
G = ГСЧ.СлучайноеЧисло(0, 255);
B = ГСЧ.СлучайноеЧисло(0, 255);
ЦветФона = Новый Цвет(R, G, B);
// Вычисляем относительную яркость (от 0 до 255)
Яркость = 0.299 * R + 0.587 * G + 0.114 * B;
// Если фон темный — делаем текст белым, иначе — черным
Если Яркость < 128 Тогда
ЦветТекста = Новый Цвет(255, 255, 255);
Иначе
ЦветТекста = Новый Цвет(0, 0, 0);
КонецЕсли;
ОбластьЯчейки = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки);
ОбластьЯчейки.ЦветФона = ЦветФона;
ОбластьЯчейки.ЦветТекста = ЦветТекста;
Случайная генерация на лету часто приводит к визуальной перегрузке интерфейса и пестроте. Более профессиональным подходом является использование заранее подготовленного массива гармоничных цветов. Выбор цвета для строки осуществляется по остатку от деления номера строки на размер массива.
Посмотрим на пример реализации с циклической палитрой:
МассивПалитры = Новый Массив();
МассивПалитры.Добавить(Новый Цвет(240, 248, 255)); // AliceBlue
МассивПалитры.Добавить(Новый Цвет(245, 245, 220)); // Beige
МассивПалитры.Добавить(Новый Цвет(230, 230, 250)); // Lavender
МассивПалитры.Добавить(Новый Цвет(240, 255, 240)); // Honeydew
МассивПалитры.Добавить(Новый Цвет(255, 240, 245)); // LavenderBlush
КоличествоЦветов = МассивПалитры.Количество();
Для ИндексСтроки = 1 По ВсегоСтрок Цикл
ЦветСтроки = МассивПалитры[(ИндексСтроки - 1) % КоличествоЦветов];
Область = ТабличныйДокумент.Область(ИндексСтроки, 1, ИндексСтроки, ТабличныйДокумент.ШиринаТаблицы);
Область.ЦветФона = ЦветСтроки;
КонецЦикла;
Если задача заключается в обычном визуальном разделении строк («зебра»), в отчетах на базе Системы компоновки данных (СКД) лучше не использовать программные переборы ячеек, а настроить условное оформление без изменения кода:
НомерПоПорядку() % 2 = 0.Такой способ гарантирует корректную работу отчета при экспорте в Excel, не перегружает память платформы лишними стилями ячеек и обеспечивает стабильное отображение на всех типах клиентов.