Почему пропадает прозрачность картинки при программном выводе в макет и экспорте в Excel?

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

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

Причина возникновения проблемы

Проблема кроется в особенностях обработки графических объектов платформой 1С при программном присвоении картинки объекту РисунокТабличногоДокумента. Когда мы вставляем картинку в макет вручную («Интерфейсно»), платформа жестко фиксирует все параметры отображения. Однако при выполнении кода:


ОбластьМакета.Рисунки.Рисунок1.Картинка = Картинка;
ОбластьМакета.Рисунки.Рисунок1.РазмерКартинки = РазмерКартинки.АвтоРазмер;

Платформа может инициализировать свойства рисунка по умолчанию, которые не всегда совпадают с параметрами прозрачности исходного файла. Особенно критично это проявляется при конвертации табличного документа в формат .xls (Excel 97-2003), который имеет серьезные ограничения в работе с альфа-каналами.

Решение 1. Сброс цвета фона и узора в коде

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

Рассмотрим, как правильно инициализировать свойства рисунка:


// Очищаем цвет фона, устанавливая его в значение "Авто" или пустой цвет
ОбластьМакета.Рисунки.Рисунок1.ЦветФона = Новый Цвет; 

// Убеждаемся, что узор отсутствует
ОбластьМакета.Рисунки.Рисунок1.Узор = ТипУзораТабличногоДокумента.БезУзора;

// Дополнительно можно явно отключить линии рамки
ОбластьМакета.Рисунки.Рисунок1.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.НетЛинии, 0);

Важный момент: Установка ЦветФона = Новый Цвет часто является решающим фактором, так как это сбрасывает заливку в «пустое» состояние, позволяя прозрачности картинки работать корректно при рендеринге.

Решение 2. Использование формата PNG вместо GIF

Хотя формат GIF поддерживает прозрачность, он делает это по принципу «один индекс цвета — прозрачный». Платформа 1С при программной обработке GIF-файлов иногда некорректно транслирует этот индекс при выгрузке в Excel. Посмотрим на альтернативу в виде PNG.

Проанализируем преимущества PNG-24 или PNG-32 с полноценным альфа-каналом. Этот формат хранит информацию о прозрачности для каждого пикселя. Рекомендуем пересохранить исходную картинку (подпись или печать) в PNG с прозрачным слоем. Как показывает практика, такие изображения гораздо стабильнее ведут себя при программной подстановке в ТабличныйДокумент.

Решение 3. Загрузка картинки через двоичные данные

Иногда способ создания объекта Картинка напрямую из файла может приводить к потере метаданных о прозрачности. Попробуем использовать промежуточный буфер в виде двоичных данных. Это гарантирует, что файл будет прочитан «как есть», без попыток внутренней интерпретации платформой на этапе загрузки.


ПутьКФайлу = "C:\Signatures\Director.png";
ДвоичныеДанныеКартинки = Новый ДвоичныеДанные(ПутьКФайлу);
Картинка = Новый Картинка(ДвоичныеДанныеКартинки);

ОбластьМакета.Рисунки.Рисунок1.Картинка = Картинка;

Решение 4. Переход на формат XLSX (Excel 2007+)

Выясним причину, связанную с форматом сохранения. Если вы используете метод Записать() с типом файла ТипФайлаТабличногоДокумента.XLS, вы почти наверняка столкнетесь с потерей прозрачности. Это старый формат, и конвертер 1С для него работает специфически.

Попробуем изменить формат сохранения на XLSX:

ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

В формате XLSX поддержка прозрачности реализована на уровне XML-описания объектов, что позволяет 1С более точно передать свойства рисунка. Если вы отправляете документ по почте через стандартные механизмы, проверьте настройки системы: там должен быть выбран формат 2007 (xlsx), а не 97 (xls).

Решение 5. Постобработка файла через COM-объект Excel

Если ни один из вышеперечисленных способов не помог (например, из-за особенностей релиза платформы), можно прибегнуть к «тяжелой артиллерии» — программному управлению приложением Excel после того, как файл уже сохранен на диск. Этот метод позволяет принудительно установить прозрачный цвет для объекта в уже сформированной книге.

Разберем пример кода для постобработки:


// Инициализируем Excel
xl = Новый COMОбъект("Excel.Application");
Книга = xl.Application.Workbooks.Open(ИмяФайла);
Лист = Книга.WorkSheets(1);
Шейпы = Лист.Shapes;

// Перебираем рисунки на листе
Для НомерШейпа = 1 По Шейпы.Count Цикл
    Шейп = Шейпы.Item(НомерШейпа);
    
    // Устанавливаем признак прозрачного фона
    Шейп.PictureFormat.TransparentBackground = -1; // Значение True для COM
    
    // Указываем, какой цвет считать прозрачным (например, белый)
    // 16777215 — это числовое представление белого цвета (RGB 255, 255, 255)
    Шейп.PictureFormat.TransparencyColor = 16777215; 
    
    // Отключаем видимость заливки фигуры
    Шейп.Fill.Visible = 0;
КонецЦикла;

Книга.Save();
xl.Application.Quit();

Этот метод гарантированно «пробивает» прозрачность, так как мы напрямую командуем Excel игнорировать белый цвет фона в картинке. Однако помните, что для работы этого кода на сервере должен быть установлен Microsoft Excel, а у пользователя — соответствующие права.

Решение 6. Метод подмены картинки в эталонном объекте

Существует еще один профессиональный прием: вместо того чтобы загружать картинку с диска в пустой объект, можно заранее в макет поместить «картинку-пустышку» (прозрачный PNG минимального размера) вручную. При выводе области мы не создаем новый рисунок, а обращаемся к уже существующему в макете, который уже настроен платформой как прозрачный.

Проанализируем этот подход:

  1. В макете создаем рисунок, называем его РисунокПодпись.
  2. Вставляем в него любую прозрачную картинку через свойства.
  3. В коде не меняем свойства фона или линии, а просто подменяем само содержимое:

Область = Макет.ПолучитьОбласть("Подпись");
// Мы не пересоздаем объект, а просто меняем его графическое содержимое
Область.Рисунки.РисунокПодпись.Картинка = КартинкаИзХранилищаИлиФайла;
ТабДок.Вывести(Область);

Этот метод считается наиболее надежным, так как основные параметры отображения (включая те, что сложно контролировать программно) сохраняются от «эталона», настроенного в конфигураторе.

Итоги и рекомендации

Подводя итог, можно составить оптимальный алгоритм действий для сохранения прозрачности:

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

← На главную