При программном формировании отчетов и выгрузке данных из 1С в MS Excel часто возникает необходимость выделили отдельные строки или ячейки произвольными цветами (например, светло-серым для шапки или бледно-розовым для выделения ошибок). Перебор простых порядковых чисел в цикле обычно не дает нужных оттенков, так как Excel ожидает строго определенный формат числового представления цвета.
Рассмотрим подробно, как правильно кодировать цвета при работе через COM-соединение, какие ограничения существуют в старых форматах Excel и как обойти их штатными средствами 1С.
В объектной модели 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 2003 и более ранних версиях существует жесткое ограничение: книга может одновременно содержать палитру только из 56 фиксированных цветов.
При попытке передать произвольное BGR-число в свойство Interior.Color, Excel 2003 автоматически округлит его до ближайшего из 56 оттенков встроенной палитры. Из-за этого точные тона могут искажаться.
Если требуется принудительно задать нестандартный цвет в формате .xls, разберем порядок действий:
ActiveWorkbook.Colors(Индекс) (где индекс от 1 до 56).Interior.ColorIndex.Пример изменения палитры для файла .xls:
ИндексЦвета = 3; // Заменяем 3-й цвет в палитре
Книга.Colors(ИндексЦвета) = ПредставлениеЦветаЭксель(255, 220, 220);
Лист.Cells(1, 1).Interior.ColorIndex = ИндексЦвета;
Формирование документов через COM-соединение ячейка за ячейкой может работать медленно при больших объемах данных. Самый надежный и быстродействующий способ задать произвольные цвета — использовать объект ТабличныйДокумент в 1С с последующим сохранением в формат .xlsx.
Платформа 1С самостоятельно переводит цвета в корректный формат без вызова сторонних программ MS Office:
ТабДок = Новый ТабличныйДокумент;
Область = ТабДок.ПолучитьОбласть("R1C1");
// Устанавливаем произвольный RGB-цвет напрямую
Область.Область().ЦветФона = Новый Цвет(255, 220, 220);
Область.Область().Текст = "Заливка без COM";
ТабДок.Вывести(Область);
// Сохраняем в файл XLSX с точной передачей всей RGB-палитры
ТабДок.Записать("C:\Export\Result.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Этот подход работает быстрее, не требует наличия установленного Excel на рабочем месте и исключает проблемы с ограничением оттенков.