Как сохранить табличный документ 1С в формате JPEG?

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

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

Метод 1. Конвертация через PDF и ImageMagick

Проанализируем наиболее эффективный и популярный способ, который заключается в двухступенчатом процессе: сначала мы сохраняем документ в формат PDF штатными средствами 1С, а затем преобразуем его в JPEG с помощью мощного инструмента ImageMagick. Это решение позволяет гибко управлять качеством и разрешением итоговой картинки.

Разберем алгоритм реализации на языке 1С:

  1. Сохраняем ТабличныйДокумент во временный файл PDF.
  2. Формируем строку запуска для консольной утилиты convert.exe.
  3. Выполняем команду и дожидаемся завершения процесса.
  4. Загружаем полученный файл JPEG обратно в систему (например, во временное хранилище).

Посмотрим на пример рабочего кода:


// 1. Сохраняем табличный документ в PDF
ИмяВременногоФайлаPdf = КаталогВременныхФайлов() + "ResultDoc.pdf";
ТабДок.Записать(ИмяВременногоФайлаPdf, ТипФайлаТабличногоДокумента.PDF);

// 2. Определяем путь к итоговому JPEG
ИмяВременногоФайлаJpg = КаталогВременныхФайлов() + "ResultDoc.jpg";

// 3. Формируем команду для ImageMagick
// Параметр -density 300 отвечает за высокое разрешение (DPI)
// Параметр -quality 50 устанавливает степень сжатия
ПутьКПрограмме = """C:\Program Files\ImageMagick\convert.exe""";
СтрокаЗапуска = ПутьКПрограмме + " -density 300 -trim " + ИмяВременногоФайлаPdf + " -quality 80 " + ИмяВременногоФайлаJpg;

// 4. Запускаем приложение и ждем завершения
ЗапуститьПриложение(СтрокаЗапуска, , Истина);

// Небольшая пауза может потребоваться для освобождения файла операционной системой
// В реальных задачах лучше использовать проверку существования файла в цикле

Важно обратить внимание на параметр -density 300. Если его не указать, текст на изображении может получиться размытым, так как стандартное разрешение PDF часто недостаточно для качественного рендеринга мелкого шрифта в растр. Если требуется конвертировать сформированный PDF без установки сторонних утилит, можно использовать решение для преобразования PDF в изображения средствами 1С.

Метод 2. Использование виртуального принтера

Если по каким-то причинам установка ImageMagick невозможна, рассмотрим вариант с виртуальными принтерами, такими как PDFCreator или Bullzip PDF Printer. Эти программы создают в системе "мнимый" принтер, который вместо печати на бумаге сохраняет документ в файл практически любого графического формата.

Этот метод особенно удобен для старых версий платформы или когда требуется полная имитация печатного процесса. Проанализируем программное управление таким принтером через COM-объект:

  1. Устанавливаем виртуальный принтер в системе.
  2. В коде 1С находим принтер по имени через Принтер объекта ТабличныйДокумент.
  3. Настраиваем параметры автоматического сохранения через реестр или конфигурационные файлы принтера (чтобы не выводилось диалоговое окно).
  4. Вызываем метод Напечатать().

Основной минус данного подхода — необходимость настройки прав доступа на сервере 1С:Предприятие, так как не все виртуальные принтеры корректно работают в сессии без графического интерфейса.

Метод 3. Внешняя компонента Yoksel

Для тех, кто ищет независимое от внешнего софта решение, стоит обратить внимание на проект Yoksel. Это внешняя компонента, которая изначально создавалась для расширения возможностей работы с электронными таблицами в 1С 7.7, но прекрасно работает и в версии 8.x.

Преимущество Yoksel в том, что она содержит собственный движок рендеринга. Процедура работы выглядит так:


// Создаем объект компоненты
Йоксель = Новый COMОбъект("Yoksel.Spreadsheet");

// Загружаем в него наш табличный документ через промежуточный файл или буфер
Йоксель.Открыть(ИмяВременногоФайлаMxl);

// Экспортируем в картинку
Картинка = Йоксель.ЭкспортВКартинку();
Картинка.Записать(ИмяФайлаJpg, "jpeg");

Нужно учитывать, что Yoksel — проект с долгой историей, и при работе со сложными современными элементами оформления табличных документов (например, прозрачностью или специфическими тенями) могут возникнуть нюансы отображения.

Метод 4. Конвертация через HTML (wkhtmltoimage)

Выясним еще одну интересную возможность. Платформа 1С отлично сохраняет табличные документы в формат HTML с сохранением всей структуры ячеек и стилей. Существует бесплатная утилита wkhtmltoimage, использующая движок WebKit для отрисовки HTML сразу в изображение.

Сценарий использования:

  1. Выполняем ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.HTML);.
  2. Запускаем wkhtmltoimage.exe, передав ему путь к HTML и путь к будущему JPEG.

Этот способ часто дает наиболее точное соответствие шрифтов и размеров, так как механизм рендеринга браузеров очень продвинут.

Нюансы работы на стороне сервера

Проанализируем ситуацию, когда конвертация должна происходить в фоновом задании на сервере. В этом случае мы сталкиваемся с рядом ограничений:

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


&НаКлиенте
Процедура ПослеКонвертации(ВыборВыполнен, АдресРезультатВыбора, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
    Если ВыборВыполнен Тогда
        // Здесь мы можем поместить файл в регистр или отправить по почте
        Сообщить("Файл успешно преобразован и загружен!");
    КонецЕсли;
КонецПроцедуры

Выводы и рекомендации

Подводя итог, можно сказать, что выбор метода зависит от ваших технических условий. Если у вас есть возможность установить стороннее ПО на сервер — связка 1С + PDF + ImageMagick является самой надежной и качественной. Если же требуется решение "все в одном" без инсталляций, лучше посмотреть в сторону внешних компонент или использования .NET библиотек (через COM-интерфейс) для отрисовки графики в памяти сервера.

При любом способе всегда следите за очисткой временных файлов. Используйте УдалитьФайлы() после завершения всех операций, чтобы не переполнять дисковое пространство сервера мусорными данными.

← На главную