Почему возникает ошибка в Excel при открытии сохраненного табличного документа с фоновой картинкой и как ее исправить?

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

При выгрузке больших отчетов и печатных форм из 1С в формат Microsoft Excel пользователи нередко сталкиваются с неприятной ситуацией. Если в табличном документе задано свойство ФоноваяКартинка, при сохранении в современный формат XLSX (Excel 2007 и выше) файл повреждается. При попытке открыть такой документ Excel выдает сообщение об ошибке: «Замененный компонент: часть /xl/worksheets/sheet1.xml с ошибкой XML. Ошибка загрузки». При этом при сохранении в устаревший формат Excel 97–2003 (XLS) файл открывается без нареканий, однако в нем действует жесткое ограничение на 65 536 строк. Разберем по шагам, почему возникает эта ошибка и как ее правильно обойти в программном коде 1С.

Выясним причину ошибки формирования XLSX

Проанализируем техническую сторону вопроса. Формат XLSX представляет собой упакованный ZIP-архив, внутри которого находятся XML-файлы с разметкой, стилями и содержимым документа. Табличная часть листа описывается в файле /xl/worksheets/sheet1.xml. Когда в объекте ТабличныйДокумент заполнено свойство ФоноваяКартинка, встроенный конвертер платформы 1С некорректно формирует дескриптор листа — тег фонового изображения или ссылки на пространства имен связей. В результате структура XML нарушается, и строгий синтаксический анализатор Microsoft Excel бракует весь лист.

В случае с бинарным форматом XLS (BIFF8) конвертация работает по совершенно другим алгоритмам: фоновое изображение либо преобразуется без повреждения структуры, либо просто игнорируется. Кроме того, важно помнить об ограничении самого офисного пакета: стандартная подложка листа в Excel носит исключительно декоративный характер для экранного просмотра, она не выводится на печать и не сохраняется при штатном экспорте в PDF.

Очистка фонового изображения перед экспортом

Самый надежный и простой способ избежать ошибки генерации структуры OpenXML — программно удалить фоновое изображение перед записью табличного документа в файл XLSX. Однако здесь разработчики часто допускают ошибку типизации.

Посмотрим на типичные неудачные попытки сброса свойства: присвоение значений Неопределено или ВидКартинки.Пустая завершается ошибкой либо не сбрасывает картинку, так как свойство ФоноваяКартинка строго ожидает объект типа Картинка. Единственным корректным способом очистки является создание нового пустого объекта: Новый Картинка().

Рассмотрим подробнее реализацию собственной команды сохранения, при которой мы сохраняем исходное оформление на экране пользователя, но формируем корректный файл для диска:


// Сохраняем ссылку на исходное изображение
ИсходныйФон = ТабДокумент.ФоноваяКартинка;

Попытка
    // Очищаем фон корректным типом объекта
    ТабДокумент.ФоноваяКартинка = Новый Картинка();
    
    // Выполняем сохранение в формат XLSX
    ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Финал
    // Обязательно возвращаем картинку обратно для экранной формы
    ТабДокумент.ФоноваяКартинка = ИсходныйФон;
КонецПопытки;

Если табличный документ формируется программно «в фоне» и не отображается на форме, достаточно просто вызвать ТабДокумент.ФоноваяКартинка = Новый Картинка(); непосредственно перед вызовом метода Записать().

Альтернативные способы решения задачи

Разберем ситуации, когда изображение обязательно должно присутствовать в результирующем файле или когда формат Excel выбран лишь для передачи документа.

  1. Перенос графики в коллекцию рисунков. Если фоновое изображение является логотипом организации, водяным знаком или факсимиле подписи, откажитесь от свойства ФоноваяКартинка. Добавьте изображение в коллекцию ТабличныйДокумент.Рисунки с типом ТипРисункаТабличногоДокумента.Картинка. Объекты этой коллекции выгружаются в отдельную подсистему OpenXML (/xl/drawings/drawing1.xml), не нарушают схему самого листа sheet1.xml и, в отличие от подложки Excel, корректно отправляются на печать.
  2. Использование формата PDF. Если файл генерируется для отправки контрагенту, архивации или последующей печати, а редактирование данных не требуется, используйте ТипФайлаТабличногоДокумента.PDF. В этом формате нет ограничений на количество строк, и фоновые изображения переносятся стабильно без сбоев валидации.
  3. Постобработка через COM-соединение. Если на компьютере установлен Microsoft Office и подложка листа принципиально необходима именно в Excel, сохраните документ без фона стандартными средствами 1С, после чего подключитесь через COMОбъект("Excel.Application") и примените метод Worksheet.SetBackgroundPicture() к сохраненному файлу.
← На главную