Как уменьшить размер файлов Excel при сохранении печатных форм с изображениями номенклатуры в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При формировании печатных форм заказов, прайс-листов или каталогов с выводом миниатюр товаров многие сталкиваются с серьезной проблемой: если в документе более 100–200 строк, результирующий файл в формате XLS или XLSX разрастается до огромных размеров (15–50 Мб и более). В результате такой файл невозможно отправить по электронной почте, а сам табличный редактор при открытии зависает или сообщает о повреждении структуры документа. Разберем, почему это происходит и какими техническими способами можно решить данную проблему.

Выясним причину: почему размер файла многократно увеличивается

Многие разработчики заранее оптимизируют графические файлы перед загрузкой в информационную базу, сжимая их до 20–30 КБ. Однако при выгрузке табличного документа в формат электронных таблиц размер файла все равно оказывается гигантским. Проанализируем внутренние механизмы платформы 1С, приводящие к такому поведению:

  1. Пересчет и смена формата на PNG: Если в свойствах объекта макета РисунокТабличногоДокумента параметр РазмерКартинки установлен в значение Пропорционально или Авторазмер, платформа 1С выполняет программный рендеринг изображения под точные границы ячейки. В процессе экспорта сжатый исходный JPEG декодируется и повторно сохраняется как несжатый или слабосжатый растр PNG. В итоге миниатюра весом 20 КБ превращается в 200–300 КБ внутри результирующего файла.
  2. Дублирование объектов в структуре XLSX: Формат XLSX представляет собой ZIP-контейнер. При штатном сохранении из 1С одинаковые изображения или заглушки не связываются ссылками на единый ресурс, а физически дублируются в каталоге xl/media/ внутри архива для каждой отдельной строки.
  3. Ограничения движка Excel: Размещение сотен плавающих графических объектов поверх ячеек перегружает механизм пересчета координат Excel, что при объемах свыше 200–300 строк приводит к ошибкам нехватки памяти при чтении файла.

Способ 1. Изменение режима масштабирования в макете

Рассмотрим тонкость настройки свойств рисунка в макете табличного документа. Поведение механизма экспорта напрямую зависит от свойства РазмерКартинки:

  1. Откроем макет печатной формы и выделим область для вывода графики.
  2. В палитре свойств для объекта рисунка изменим значение свойства РазмерКартинки с Пропорционально на Растянуть. В этом режиме платформа не запускает процедуру пересчета и растеризации, а помещает исходный поток данных изображения без принудительной переконвертации в тяжелый PNG.
  3. Чтобы пропорции товара не исказились при растягивании, рассчитаем точные геометрические размеры программно перед выводом области в результирующий документ.

Посмотрим на пример программной установки размеров рисунка с сохранением пропорций перед выводом секции:


ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Рисунок = ОбластьСтрока.Рисунки.ИзображениеТовара;

// Задаем режим, исключающий пережатие платформой
Рисунок.РазмерКартинки = ИзменениеРазмераКартинки.Растянуть;

// Загружаем данные
Рисунок.Картинка = Выборка.ФайлКартинки.Получить();

// Рассчитываем ширину и высоту рисунка исходя из пропорций оригинала
Коэффициент = Рисунок.Картинка.Ширина / Рисунок.Картинка.Высота;
БазоваяВысота = 25; // высота в миллиметрах
Рисунок.Высота = БазоваяВысота;
Рисунок.Ширина = БазоваяВысота * Коэффициент;

ТабДок.Вывести(ОбластьСтрока);

Способ 2. Подготовка миниатюр через объект ОбработкаКартинок

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

  1. Получаем двоичные данные исходного файла из информационной базы.
  2. Используем объект ОбработкаКартинок для масштабирования геометрии (например, до 100х100 пикселей) и снижения разрешения.
  3. Помещаем подготовленную миниатюру в табличный документ.

Посмотрим на пример функции подготовки миниатюры:


Функция СформироватьМиниатюру(ИсходнаяКартинка, ЦелевойРазмер) Экспорт
    
    Обработка = Новый ОбработкаКартинок;
    Обработка.Загрузить(ИсходнаяКартинка);
    Обработка.Масштабировать(ЦелевойРазмер, ЦелевойРазмер);
    
    // Возвращаем оптимизированную миниатюру
    Возврат Обработка.ПолучитьКартинку();
    
КонецФункции

Способ 3. Постобработка сформированного архива XLSX

Если штатный экспорт 1С по-прежнему раздувает файл, применим подход постобработки готового документа. Поскольку файл формата XLSX является стандартным ZIP-архивом, разберем по шагам, как обработать его встроенными объектами платформы ЧтениеZipФайла и ЗаписьZipФайла без использования внешних библиотек:

  1. Сохраняем сформированный табличный документ стандартным методом: ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX).
  2. Создаем объект ЧтениеZipФайла и распаковываем сформированный XLSX во временный каталог на диске.
  3. Проходим по содержимому распакованной папки xl/media/, где лежат все сохраненные платформой графические файлы.
  4. Сжимаем растровые файлы или преобразуем тяжелые PNG-файлы обратно в оптимизированный JPEG с помощью объекта ОбработкаКартинок.
  5. С помощью объекта ЗаписьZipФайла упаковываем файлы из временного каталога обратно в исходный файл XLSX с максимальной степенью сжатия.

Посмотрим на пример кода, распаковывающего и упаковывающего XLSX-документ:


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

// Распаковываем документ как архив
АрхивЧтение = Новый ЧтениеZipФайла(ИмяФайлаXLSX);
АрхивЧтение.ИзвлечьВсе(КаталогРаспаковки, РежимВосстановленияПутейФайловZIP.Восстанавливать);
АрхивЧтение.Закрыть();

// ... выполняем пережатие файлов в подкаталоге КаталогРаспаковки + "/xl/media" ...

// Запаковываем обратно
АрхивЗапись = Новый ЗаписьZipФайла(ИмяФайлаXLSX, , , МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Максимальный);
АрхивЗапись.Добавить(КаталогРаспаковки + "/*", РежимСохраненияПутейZIP.ОтносительноРасположенияФайла);
АрхивЗапись.Записать();

Способ 4. Альтернативные форматы взаимодействия с клиентом

Если объем позиций превышает 500–1000 строк, даже оптимизированный файл с графикой будет создавать существенную нагрузку на почтовые сервисы и компьютер клиента. В таких ситуациях рассмотрим альтернативные варианты архитектуры обмена:

  1. Разделение данных и графики: Клиенту отправляется легкий файл XLSX без картинок, содержащий только артикулы, наименования, цены и колонку для заказа. В дополнительной колонке размещаются активные веб-ссылки на изображения на внешнем сервере.
  2. Каталог в PDF с интерактивными полями ввода: Документ генерируется в формате PDF, где напротив каждой позиции создается поле интерактивной формы (AcroForm) для ввода количества. Клиент вводит объем заказа прямо в программе просмотра PDF и отправляет файл обратно.
← На главную