Часто разработчики сталкиваются с неприятной ситуацией: в печатной форме 1С, выведенной на экран, все выглядит идеально, включая логотипы, подписи или изображения товаров. При сохранении в PDF картинка на месте. Но стоит сохранить эту же форму в Excel (форматы `.xls` или `.xlsx`), как изображение бесследно исчезает. На его месте остается лишь пустое место, иногда даже без растяжения ячеек.
Давайте вместе разберемся, почему так происходит и какие существуют способы решения этой проблемы — от простых настроек в конфигураторе до более надежных программных методов.
Прежде чем исправлять, нужно понять, на каком этапе происходит сбой. Проблема может крыться в формате самой картинки, настройках макета или особенностях механизма экспорта в 1С. Проведем несколько проверок.
PNG с прозрачностью могут не отображаться или превращаться в черный квадрат.
Что делаем: Попробуйте использовать для вывода картинки в "классических" форматах, таких как JPEG, BMP или GIF. Если изображение хранится в справочнике (например, в номенклатуре), преобразуйте его в один из этих форматов перед выводом.
Что делаем: Всегда отдавайте предпочтение современному формату .xlsx (Лист Excel2007 и выше).
.xlsx — это, по сути, ZIP-архив. Этот факт можно использовать для глубокой диагностики.
Что делаем:
.xlsx..xlsx на .zip.xl, а в ней — папку media.Если в папке media вы видите ваше изображение (например, image1.jpeg), значит, 1С его экспортировала, но Excel по какой-то причине не может его отобразить. Если же папка media пуста, значит, платформа 1С даже не пыталась выгрузить картинку.
Если диагностика показала, что 1С не экспортирует картинку, скорее всего, дело в свойствах объекта-рисунка в макете печатной формы. Чтобы не допускать таких ошибок при разработке, полезно изучить классический корректный пример внешней печатной формы с правильно настроенными картинками и подписями.
Что делаем: В свойствах ячейки или рисунка установите значение Растянуть. Это заставит платформу принудительно вписать изображение в границы ячейки и корректно обработать его при экспорте.
Что делаем: Убедитесь, что в свойствах рисунка установлена галка Выводить на печать.
Что делаем: Проверьте, что в свойствах табличного документа установлено значение Разрешить. Это можно сделать и программно:
ТабличныйДокумент.Вывод = ИспользованиеВывода.Разрешить;
Если штатные средства не помогают, остается самый надежный метод — формирование файла с помощью COM-объекта. А для тех, кто ищет современные альтернативы этому методу, может быть интересно использование Python при выгрузке в Excel, что также позволяет тонко настраивать содержимое результирующего файла.
Суть метода COM: сначала мы сохраняем печатную форму в Excel без картинки, а затем открываем этот файл и программно вставляем изображение в нужную ячейку.
Пошаговый процесс:
ИмяФайлаExcel = ПолучитьИмяВременногоФайла("xlsx");
ТабличныйДокумент.Записать(ИмяФайлаExcel, ТипФайлаТабличногоДокумента.XLSX);
ДвоичныеДанныеКартинки = ПолучитьДвоичныеДанныеКартинки();
ИмяФайлаКартинки = ПолучитьИмяВременногоФайла("jpg");
ДвоичныеДанныеКартинки.Записать(ИмяФайлаКартинки);
Попытка
Excel = Новый COMОбъект("Excel.Application");
Исключение
Сообщить("Microsoft Excel не установлен!");
Возврат;
КонецПопытки;
Книга = Excel.Workbooks.Open(ИмяФайлаExcel);
Лист = Книга.Worksheets(1);
Используем метод Shapes.AddPicture для точного позиционирования.
ЯчейкаДляВставки = Лист.Range("A1");
Лево = ЯчейкаДляВставки.Left;
Верх = ЯчейкаДляВставки.Top;
Ширина = ЯчейкаДляВставки.Width;
Высота = ЯчейкаДляВставки.Height;
// 0 (LinkToFile) - Ложь, 1 (SaveWithDocument) - Истина
Лист.Shapes.AddPicture(ИмяФайлаКартинки, 0, 1, Лево, Верх, Ширина, Высота);
Excel.DisplayAlerts = 0;
Книга.Save();
Книга.Close();
Excel.Quit();
УдалитьФайлы(ИмяФайлаКартинки);
Таким образом, начинайте с простых проверок формата и свойств в макете. В большинстве случаев этого достаточно. В крайнем случае используйте COM-объект — это гарантирует результат при обходе любых ограничений платформы 1С.