Как исправить появление черных ячеек при выгрузке отчета в формат XLSX из 1С:Предприятие?

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

При выгрузке отчетов во внешние файлы разработчики часто сталкиваются с непредвиденным поведением платформы 1С:Предприятие. Одной из таких неприятных проблем является закрашивание ячеек табличного документа сплошным черным цветом при сохранении в современный формат XLSX (Office Open XML). Примечательно, что при выводе того же документа на экран через метод Показать() или при сохранении в старый формат XLS (Excel 97–2003) все отображается корректно и цвета выглядят естественно.

В данной статье мы подробно разберем причины возникновения этой технической неполадки, проанализируем особенности работы встроенного конвертера платформы и рассмотрим четыре практических способа обхода и устранения этой проблемы.

Почему ячейки закрашиваются черным цветом?

Давайте выясним техническую причину этой ошибки. Проблема кроется во встроенном конвертере табличных документов платформы 1С:Предприятие версий 8.3.8 – 8.3.10. Когда мы используем ПостроительОтчета или Систему компоновки данных (СКД) для генерации отчетов, ячейкам по умолчанию часто присваивается системный цвет "Авто". В самой платформе этот цвет визуально отображается как прозрачный или белый.

Файл формата XLSX представляет собой сжатый ZIP-архив, содержащий комплекс XML-структур. При вызове метода Записать() с типом файла ТипФайлаТабличногоДокумента.XLSX встроенный конвертер платформы 1С транслирует свойства ячеек в файл стилей styles.xml. Из-за внутренней ошибки конвертера в указанных версиях платформы системный цвет "Авто" некорректно преобразуется в сплошной черный цвет с кодом RGB 000000 или системным индексом заливки 64 вместо записи признака отсутствия заливки (none).

Когда Microsoft Excel открывает полученный файл, он считывает прописанные стили и честно заливает ячейки черным цветом, из-за чего текст становится абсолютно нечитаемым. При записи в формат XLS используются другие библиотеки, поэтому старый формат не страдает этим дефектом.

Схожие проблемы конвертации в платформе 1С

Стоит отметить, что в линейках платформы 8.3.8, 8.3.9 и 8.3.10 присутствовали и другие похожие дефекты экспорта:

Способ 1. Программный обход ячеек перед сохранением (Обходной путь)

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

Рассмотрим по шагам, как это реализовать в коде:


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

// Выполняем обход всей матрицы табличного документа
Для Строка = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
    Для Колонка = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
        ОбластьЯчейки = ТабличныйДокумент.Область(Строка, Колонка);
        
        // Проверяем, задан ли цвет фона или используется цвет по умолчанию
        Если ОбластьЯчейки.ЦветФона = Новый Цвет 
           Или ОбластьЯчейки.ЦветФона = ЦветаСтиля.ЦветФонаКнопки Тогда
            
            // Принудительно устанавливаем стандартный белый цвет
            ОбластьЯчейки.ЦветФона = WebЦвета.Белый;
        КонецЕсли;
    КонецЦикла;
КонецЦикла;

ИмяФайла = "W:\1s_bases\V8\Прайс.xlsx";
ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

Важное примечание: Данный метод отлично решает проблему, но на очень больших отчетах (содержащих десятки тысяч строк) двойной цикл по всем ячейкам может заметно снизить производительность и увеличить общее время формирования файла. Используйте этот способ осмотрительно.

Способ 2. Отключение макетов оформления в Построителе отчетов

Поскольку проблема возникает из-за трансляции сложных системных стилей оформления в XML-структуру, мы можем минимизировать применение стилей на этапе вывода отчета. Для этого в свойствах объекта ПостроительОтчета следует явно отключить использование предопределенного оформления.

Давайте посмотрим, как отключить макеты оформления программно:


// Отключаем стандартное оформление отчета
Построитель.МакетОформления = "БезОформления";
Построитель.Вывести(ТабличныйДокумент);

При таком подходе генерируется максимально простой табличный документ без сложных цветовых переходов и условного форматирования. Встроенный конвертер без проблем преобразует такой документ в формат XLSX без появления черных областей.

Способ 3. Обновление платформы (Рекомендуемое системное решение)

Описанный дефект является официально зарегистрированной ошибкой платформы 1С:Предприятие 8.3. Фирма "1С" исправила этот баг в последующих релизах. Если вы обновите платформу до версии 8.3.11 или любой более современной актуальной версии, встроенный конвертер будет корректно обрабатывать цвета "Авто" и формировать валидные файлы XLSX без необходимости модификации исходного кода конфигураций.

Способ 4. Двухэтапное пересохранение через COM-объект Excel

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

Разберем пример реализации этого алгоритма:


// Шаг 1. Сохраняем в промежуточный формат XLS
ВременныйФайлXLS = ПолучитьИмяВременногоФайла("xls");
ТабличныйДокумент.Записать(ВременныйФайлXLS, ТипФайлаТабличногоДокумента.XLS);

// Шаг 2. Пересохраняем в XLSX через COM-объект
Попытка
    ExcelПриложение = Новый COMОбъект("Excel.Application");
    ExcelПриложение.Visible = Ложь;
    ExcelПриложение.DisplayAlerts = Ложь;
    
    Книга = ExcelПриложение.Workbooks.Open(ВременныйФайлXLS);
    
    // Код формата 51 соответствует современному XLSX (xlOpenXMLWorkbook)
    Книга.SaveAs("W:\1s_bases\V8\Прайс.xlsx", 51);
    Книга.Close();
    ExcelПриложение.Quit();
Исключение
    // Обязательно обрабатываем исключения и закрываем процесс Excel
    Если ЗначениеЗаполнено(ExcelПриложение) Тогда
        ExcelПриложение.Quit();
    КонецЕсли;
    ВызватьИсключение "Ошибка при сохранении файла через COM: " + ОписаниеОшибки();
КонецПопытки;

Использование этого метода гарантирует 100% корректность структуры файла и цветовой гаммы, однако требует наличия установленного Excel на стороне выполнения кода и работает медленнее прямого сохранения средствами 1С.

← На главную