Как программно задать цвет фона ячейки Excel из 1С

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

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

Рассмотрим подробно, как правильно кодировать цвета при работе через COM-соединение, какие ограничения существуют в старых форматах Excel и как обойти их штатными средствами 1С.

Расчет числового кода цвета для свойства Interior.Color

В объектной модели Excel свойство Interior.Color принимает 24-битное целое число. В отличие от привычной веб-кодировки RGB (Red, Green, Blue), байты в цельном числе Excel расположены в обратном порядке — BGR (Blue, Green, Red).

Схема формирования целого числа из составляющих цвета выглядит следующим образом:

ЧислоЦвета = Красный + (Зеленый * 256) + (Синий * 65536)

Разберем по шагам создание служебной функции в 1С для конвертации стандартных RGB-компонентов (значения от 0 до 255) в числовой код Excel:


Функция ПредставлениеЦветаЭксель(R, G, B)
    Возврат R + G * 256 + B * 65536;
КонецФункции

Посмотрим на пример использования этой функции при заполнении ячеек через COM-объект:


// Создаем COM-соединение с Excel
Эксель = Новый COMОбъект("Excel.Application");
Книга = Эксель.Workbooks.Add();
Лист = Книга.Worksheets(1);

// Задаем светло-серый цвет (R: 240, G: 240, B: 240)
СветлоСерый = ПредставлениеЦветаЭксель(240, 240, 240);
Лист.Cells(1, 1).Value = "Светло-серый фон";
Лист.Cells(1, 1).Interior.Color = СветлоСерый;

// Задаем бледно-розовый цвет (R: 255, G: 220, B: 220)
БледноРозовый = ПредставлениеЦветаЭксель(255, 220, 220);
Лист.Cells(2, 1).Value = "Бледно-розовый фон";
Лист.Cells(2, 1).Interior.Color = БледноРозовый;

Ограничения формата .XLS (Excel 97–2003) и работа с палитрой

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

При попытке передать произвольное BGR-число в свойство Interior.Color, Excel 2003 автоматически округлит его до ближайшего из 56 оттенков встроенной палитры. Из-за этого точные тона могут искажаться.

Если требуется принудительно задать нестандартный цвет в формате .xls, разберем порядок действий:

  1. Заменить один из 56 цветов палитры книги на свой пользовательский BGR-цвет через коллекцию ActiveWorkbook.Colors(Индекс) (где индекс от 1 до 56).
  2. Применить установленный индекс к ячейкам через свойство Interior.ColorIndex.

Пример изменения палитры для файла .xls:


ИндексЦвета = 3; // Заменяем 3-й цвет в палитре
Книга.Colors(ИндексЦвета) = ПредставлениеЦветаЭксель(255, 220, 220);
Лист.Cells(1, 1).Interior.ColorIndex = ИндексЦвета;

Альтернативное решение: выгрузка через ТабличныйДокумент 1С

Формирование документов через COM-соединение ячейка за ячейкой может работать медленно при больших объемах данных. Самый надежный и быстродействующий способ задать произвольные цвета — использовать объект ТабличныйДокумент в 1С с последующим сохранением в формат .xlsx.

Платформа 1С самостоятельно переводит цвета в корректный формат без вызова сторонних программ MS Office:


ТабДок = Новый ТабличныйДокумент;
Область = ТабДок.ПолучитьОбласть("R1C1");

// Устанавливаем произвольный RGB-цвет напрямую
Область.Область().ЦветФона = Новый Цвет(255, 220, 220);
Область.Область().Текст = "Заливка без COM";
ТабДок.Вывести(Область);

// Сохраняем в файл XLSX с точной передачей всей RGB-палитры
ТабДок.Записать("C:\Export\Result.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Этот подход работает быстрее, не требует наличия установленного Excel на рабочем месте и исключает проблемы с ограничением оттенков.

← На главную