При автоматизации выгрузки отчетов из 1С в Microsoft Excel программисты часто сталкиваются с неприятным эффектом: идеально настроенная заливка ячеек и цвета шрифтов в табличном документе 1С превращаются в «винегрет» из случайных цветов в итоговом файле. Например, нежно-зеленый фон заголовков может стать ярко-фиолетовым или серым. Разберем, почему это происходит и как обеспечить точную передачу цветовой гаммы.
Проанализируем техническую сторону вопроса. Проблема чаще всего кроется в использовании старого формата Excel 97-2003 (.xls). В этом формате Microsoft Excel использует фиксированную палитру, состоящую всего из 56 цветов. Когда 1С сохраняет табличный документ в этот формат, она пытается сопоставить цвета из своей внутренней палитры (которая гораздо шире) с этими 56 индексами.
Ситуация осложняется при использовании COM-объекта для сборки нескольких листов в одну книгу. Рассмотрим типичный сценарий: мы сохраняем временный файл из 1С, открываем его через Excel.Application и копируем лист в основную книгу. В этот момент индексы цветов могут «перемешаться», так как у каждой книги Excel может быть своя уникальная таблица соответствия индексов и реальных цветов (свойство Colors).
Если специфика задачи требует использования именно формата .xls, нам необходимо принудительно перенести палитру цветов из временного файла (созданного 1С) в результирующую книгу. Посмотрим, как модифицировать исходный код для достижения этой цели.
Ключевым моментом здесь является обращение к свойству Colors объекта книги. Рассмотрим пошагово логику исправления:
// ... (начало кода из примера автора)
Для Каждого ТабДок из МассивТабличныхДокументов Цикл
ИмяФайла = ПолучитьИмяВременногоФайла("xls");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS);
tempBook = xlsApp.Workbooks.Open(ИмяФайла);
// ВАЖНО: Копируем палитру из временной книги в основную
// Это гарантирует, что индексы цветов совпадут
book.Colors = tempBook.Colors;
tempBook.Sheets(1).Name = ТабДок.Имя;
tempBook.Sheets(1).Copy(delSheet);
tempBook.Close(0);
УдалитьФайлы(ИмяФайла);
КонецЦикла;
Важное примечание: При копировании палитры book.Colors = tempBook.Colors цвета во всей основной книге будут приведены к тем, что были в последнем скопированном листе. Если разные табличные документы используют радикально разные наборы цветов, это может привести к искажениям на предыдущих листах. Однако для стандартных отчетов 1С этот метод обычно работает безупречно.
Наиболее современный и надежный способ — отказаться от устаревшего формата .xls в пользу .xlsx. Формат .xlsx основан на XML и поддерживает миллионы цветов (TrueColor). В нем понятие «индексированной палитры из 56 цветов» отсутствует, поэтому цвета передаются «как есть».
Рассмотрим, что нужно изменить в коде:
Записать() используйте ТипФайлаТабличногоДокумента.XLSX.SaveAs используйте соответствующий код формата (например, 51 для XLSX вместо -4143 для XLS).
// Пример сохранения в формате XLSX
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
// ...
book.SaveAs(ПолноеИмяФайла, 51); // 51 - константа для XLSX
Проанализируем ситуацию, когда нам нужно объединить несколько отчетов. Начиная с версии 8.3.6, платформа 1С позволяет сохранять табличные документы в .xlsx более эффективно. Если ваша задача — просто выдать пользователю один файл с несколькими листами, можно попробовать обойтись без медленного COM-объекта.
Хотя прямой метод «записать массив табдоков в один файл разными листами» встроенными средствами 1С реализуется не одной командой, мы можем объединить их в один большой ТабличныйДокумент, используя разрывы страниц. Однако, если критично именно наличие разных закладок (листов) в Excel, использование COM или внешних библиотек остается оправданным.
Иногда цвета слетают из-за того, что в 1С назначены «цвета стиля» (например, ЦветФонаВыделения), которые не имеют прямого эквивалента в Windows. Чтобы минимизировать риски при выгрузке, рекомендуем придерживаться следующих правил:
ЦветExcel = R + (G * 256) + (B * 256 * 256).Мы рассмотрели основную причину искажения цветов — ограничение палитры старого формата Excel. Для исправления ситуации мы можем либо синхронизировать свойство Colors между книгами при использовании COM-соединения, либо перейти на современный формат .xlsx. Второй вариант является предпочтительным, так как он снимает большинство ограничений на форматирование и работает стабильнее в современных версиях Microsoft Office.