Почему при сохранении из 1С в Excel слетают цвета и как это исправить

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

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

Выясним причину: ограничение палитры формата XLS

Проанализируем техническую сторону вопроса. Проблема чаще всего кроется в использовании старого формата Excel 97-2003 (.xls). В этом формате Microsoft Excel использует фиксированную палитру, состоящую всего из 56 цветов. Когда 1С сохраняет табличный документ в этот формат, она пытается сопоставить цвета из своей внутренней палитры (которая гораздо шире) с этими 56 индексами.

Ситуация осложняется при использовании COM-объекта для сборки нескольких листов в одну книгу. Рассмотрим типичный сценарий: мы сохраняем временный файл из 1С, открываем его через Excel.Application и копируем лист в основную книгу. В этот момент индексы цветов могут «перемешаться», так как у каждой книги Excel может быть своя уникальная таблица соответствия индексов и реальных цветов (свойство Colors).

Решение №1: Синхронизация палитры через COM-объект

Если специфика задачи требует использования именно формата .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С этот метод обычно работает безупречно.

Решение №2: Переход на формат XLSX (TrueColor)

Наиболее современный и надежный способ — отказаться от устаревшего формата .xls в пользу .xlsx. Формат .xlsx основан на XML и поддерживает миллионы цветов (TrueColor). В нем понятие «индексированной палитры из 56 цветов» отсутствует, поэтому цвета передаются «как есть».

Рассмотрим, что нужно изменить в коде:

  1. При вызове метода Записать() используйте ТипФайлаТабличногоДокумента.XLSX.
  2. При создании объекта в Excel и сохранении книги убедитесь, что расширение файла соответствует формату.
  3. Для метода SaveAs используйте соответствующий код формата (например, 51 для XLSX вместо -4143 для XLS).

// Пример сохранения в формате XLSX
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
// ...
book.SaveAs(ПолноеИмяФайла, 51); // 51 - константа для XLSX

Решение №3: Использование штатных средств платформы 8.3

Проанализируем ситуацию, когда нам нужно объединить несколько отчетов. Начиная с версии 8.3.6, платформа 1С позволяет сохранять табличные документы в .xlsx более эффективно. Если ваша задача — просто выдать пользователю один файл с несколькими листами, можно попробовать обойтись без медленного COM-объекта.

Хотя прямой метод «записать массив табдоков в один файл разными листами» встроенными средствами 1С реализуется не одной командой, мы можем объединить их в один большой ТабличныйДокумент, используя разрывы страниц. Однако, если критично именно наличие разных закладок (листов) в Excel, использование COM или внешних библиотек остается оправданным.

Особенности работы с цветами стиля

Иногда цвета слетают из-за того, что в 1С назначены «цвета стиля» (например, ЦветФонаВыделения), которые не имеют прямого эквивалента в Windows. Чтобы минимизировать риски при выгрузке, рекомендуем придерживаться следующих правил:

Подведем итоги

Мы рассмотрели основную причину искажения цветов — ограничение палитры старого формата Excel. Для исправления ситуации мы можем либо синхронизировать свойство Colors между книгами при использовании COM-соединения, либо перейти на современный формат .xlsx. Второй вариант является предпочтительным, так как он снимает большинство ограничений на форматирование и работает стабильнее в современных версиях Microsoft Office.

← На главную