Как программно задать случайный цвет фона для строк в 1С?

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

При формировании нестандартных отчетов или визуализации данных в табличном документе 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, ИндексСтроки, ТабличныйДокумент.ШиринаТаблицы);
    Область.ЦветФона = ЦветСтроки;
КонецЦикла;

Чередование строк в отчетах на СКД

Если задача заключается в обычном визуальном разделении строк («зебра»), в отчетах на базе Системы компоновки данных (СКД) лучше не использовать программные переборы ячеек, а настроить условное оформление без изменения кода:

  1. Откроем схему компоновки данных на вкладке Настройки.
  2. Перейдем на вкладку Условное оформление и добавим новый элемент.
  3. В оформлении укажем желаемый Цвет фона (например, светло-серый).
  4. В условии зададим выражение: НомерПоПорядку() % 2 = 0.
  5. В оформляемых полях укажем нужные поля или всю группировку.

Такой способ гарантирует корректную работу отчета при экспорте в Excel, не перегружает память платформы лишними стилями ячеек и обеспечивает стабильное отображение на всех типах клиентов.

← На главную