При разработке сложных отчетов в 1С часто возникает задача вывода данных в несколько печатных форм, которые затем необходимо программно объединить в одну книгу Excel с разными листами (закладками). Программисты часто сталкиваются с неприятной особенностью: при использовании COM-объекта Excel.Application цвета в результирующем файле могут «плыть» или полностью меняться, хотя в исходных табличных документах всё выглядело корректно. В этой статье мы подробно разберем причины этой проблемы и рассмотрим наиболее эффективный способ ее решения с помощью встроенных средств платформы 1С.
Прежде чем перейти к решению, проанализируем ситуацию. Основная причина кроется в специфике старого формата .xls (Excel 97-2003). В этом формате используется фиксированная цветовая палитра, состоящая всего из 56 цветов. Когда вы программно копируете лист из одной книги в другую через COM-соединение, Excel пытается сопоставить цвета ячеек исходного листа с индексами в палитре целевой книги.
Если в исходном документе 1С использовались произвольные цвета (RGB), Excel при сохранении во временный файл .xls подбирает наиболее похожие индексы. При объединении нескольких таких файлов в одну книгу индексы могут конфликтовать, и Excel заменяет «незнакомый» цвет на стандартный из своей текущей палитры. В итоге вместо нежно-серого фона мы можем получить ярко-желтый или черный.
Начиная с версии платформы 8.3.6, в 1С появился замечательный объект — ПакетОтображаемыхДокументов. Это штатный механизм, который позволяет собирать несколько табличных документов в один пакет и сохранять их как многостраничный файл (Excel или PDF). Использование этого объекта избавляет нас от необходимости использовать COM-соединение, которое требует установленного Microsoft Office на сервере, работает медленно и часто вызывает ошибки с форматированием.
Рассмотрим по шагам, как реализовать объединение листов с помощью этого механизма.
Для начала создадим новый объект ПакетОтображаемыхДокументов. Этот объект будет служить контейнером для всех наших печатных форм.
// Создаем новый пакет
Книга = Новый ПакетОтображаемыхДокументов;
Теперь нам нужно добавить наши отчеты в состав пакета. Важным преимуществом является то, что мы можем сразу задать имя для каждого листа Excel. Для добавления документа используется свойство Состав, куда мы добавляем элементы типа ЭлементСоставаПакетаОтображаемыхДокументов.
Разберем пример кода для добавления трех разных отчетов:
// Добавляем первый лист
Элт1 = Книга.Состав.Добавить();
// Предположим, ТабДок1 - это ваш готовый ТабличныйДокумент
Элт1.Данные = ПоместитьВоВременноеХранилище(ТабДок1);
Элт1.Наименование = "Общая выручка";
// Добавляем второй лист
Элт2 = Книга.Состав.Добавить();
Элт2.Данные = ПоместитьВоВременноеХранилище(ТабДок2);
Элт2.Наименование = "Выручка по отделам";
// Добавляем третий лист
Элт3 = Книга.Состав.Добавить();
Элт3.Данные = ПоместитьВоВременноеХранилище(ТабДок3);
Элт3.Наименование = "Детализация";
Обратите внимание, что в свойство Данные необходимо передавать не сам ТабличныйДокумент, а адрес его данных во временном хранилище. Это стандартное требование для работы с составом пакета.
После того как все листы добавлены и переименованы, остается только сохранить пакет в файл нужного формата. Мы настоятельно рекомендуем использовать формат .xlsx (Excel 2007+), так как он поддерживает современную цветовую модель RGB и не имеет ограничений в 56 цветов, свойственных старому формату.
ПутьКФайлу = "C:\Отчеты\ИтоговыйОтчет.xlsx";
Книга.Записать(ПутьКФайлу, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
Важный нюанс: Если вы все же вынуждены использовать формат .xls, имейте в виду, что при сохранении через ПакетОтображаемыхДокументов 1С гораздо лучше справляется с сохранением цветовой схемы, чем при манипуляциях через COM-объект, так как платформа сама управляет преобразованием палитры.
Если по каким-то архитектурным причинам вы не можете отказаться от Excel.Application, проблему с цветами можно минимизировать двумя способами:
Книга.Colors = ВременнаяКнига.Colors;. Это заставит целевой файл принять настройки цветов исходного документа.SaveAs передавайте параметр 51 (это константа формата OpenXML / XLSX) вместо 18 (XLS). Современный формат хранит цвета в явном виде, и проблема с «битой» палитрой исчезнет сама собой.Однако помните, что метод с ПакетОтображаемыхДокументов является более «чистым», быстрым и надежным. Он не зависит от внешних приложений и лицензий Microsoft Office, что критически важно для работы на серверах под управлением Linux или в облачных инфраструктурах.
Подводя итог, выделим ключевые преимущества использования ПакетОтображаемыхДокументов перед ручным объединением через Excel:
Наименование позволяет легко задать понятные заголовки для закладок в Excel.excel.exe.PDF, получив один многостраничный файл.Таким образом, мы выяснили, что для решения проблемы со сбитыми цветами достаточно отказаться от устаревшей технологии COM-соединения в пользу штатных возможностей платформы 1С 8.3.