При выгрузке больших отчетов и печатных форм из 1С в формат Microsoft Excel пользователи нередко сталкиваются с неприятной ситуацией. Если в табличном документе задано свойство ФоноваяКартинка, при сохранении в современный формат XLSX (Excel 2007 и выше) файл повреждается. При попытке открыть такой документ Excel выдает сообщение об ошибке: «Замененный компонент: часть /xl/worksheets/sheet1.xml с ошибкой XML. Ошибка загрузки». При этом при сохранении в устаревший формат Excel 97–2003 (XLS) файл открывается без нареканий, однако в нем действует жесткое ограничение на 65 536 строк. Разберем по шагам, почему возникает эта ошибка и как ее правильно обойти в программном коде 1С.
Проанализируем техническую сторону вопроса. Формат XLSX представляет собой упакованный ZIP-архив, внутри которого находятся XML-файлы с разметкой, стилями и содержимым документа. Табличная часть листа описывается в файле /xl/worksheets/sheet1.xml. Когда в объекте ТабличныйДокумент заполнено свойство ФоноваяКартинка, встроенный конвертер платформы 1С некорректно формирует дескриптор листа — тег фонового изображения или ссылки на пространства имен связей. В результате структура XML нарушается, и строгий синтаксический анализатор Microsoft Excel бракует весь лист.
В случае с бинарным форматом XLS (BIFF8) конвертация работает по совершенно другим алгоритмам: фоновое изображение либо преобразуется без повреждения структуры, либо просто игнорируется. Кроме того, важно помнить об ограничении самого офисного пакета: стандартная подложка листа в Excel носит исключительно декоративный характер для экранного просмотра, она не выводится на печать и не сохраняется при штатном экспорте в PDF.
Самый надежный и простой способ избежать ошибки генерации структуры OpenXML — программно удалить фоновое изображение перед записью табличного документа в файл XLSX. Однако здесь разработчики часто допускают ошибку типизации.
Посмотрим на типичные неудачные попытки сброса свойства: присвоение значений Неопределено или ВидКартинки.Пустая завершается ошибкой либо не сбрасывает картинку, так как свойство ФоноваяКартинка строго ожидает объект типа Картинка. Единственным корректным способом очистки является создание нового пустого объекта: Новый Картинка().
Рассмотрим подробнее реализацию собственной команды сохранения, при которой мы сохраняем исходное оформление на экране пользователя, но формируем корректный файл для диска:
// Сохраняем ссылку на исходное изображение
ИсходныйФон = ТабДокумент.ФоноваяКартинка;
Попытка
// Очищаем фон корректным типом объекта
ТабДокумент.ФоноваяКартинка = Новый Картинка();
// Выполняем сохранение в формат XLSX
ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Финал
// Обязательно возвращаем картинку обратно для экранной формы
ТабДокумент.ФоноваяКартинка = ИсходныйФон;
КонецПопытки;
Если табличный документ формируется программно «в фоне» и не отображается на форме, достаточно просто вызвать ТабДокумент.ФоноваяКартинка = Новый Картинка(); непосредственно перед вызовом метода Записать().
Разберем ситуации, когда изображение обязательно должно присутствовать в результирующем файле или когда формат Excel выбран лишь для передачи документа.
ФоноваяКартинка. Добавьте изображение в коллекцию ТабличныйДокумент.Рисунки с типом ТипРисункаТабличногоДокумента.Картинка. Объекты этой коллекции выгружаются в отдельную подсистему OpenXML (/xl/drawings/drawing1.xml), не нарушают схему самого листа sheet1.xml и, в отличие от подложки Excel, корректно отправляются на печать.ТипФайлаТабличногоДокумента.PDF. В этом формате нет ограничений на количество строк, и фоновые изображения переносятся стабильно без сбоев валидации.COMОбъект("Excel.Application") и примените метод Worksheet.SetBackgroundPicture() к сохраненному файлу.