Как преобразовать табличный документ 1С в изображение (JPG, PNG, BMP)?

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

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

Метод 1: Конвертация через PDF с использованием ImageMagick

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

Рассмотрим пример кода, реализующий этот алгоритм:


// 1. Формируем табличный документ
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет");
Область = Макет.ПолучитьОбласть("ОбластьДляПечати");
ТабДок.Вывести(Область);

// 2. Сохраняем во временный PDF-файл
ПутьКPDF = "C:\Temp\result.pdf";
ПутьККартинке = "C:\Temp\result.png";
ТабДок.Записать(ПутьКPDF, ТипФайлаТабличногоДокумента.PDF);

// 3. Конвертируем PDF в PNG с помощью ImageMagick
// Используем параметр -density для управления качеством (DPI)
СтрокаЗапуска = """C:\Program Files\ImageMagick\convert.exe"" -density 300 """ + ПутьКPDF + """ """ + ПутьККартинке + """";
ЗапуститьПриложение(СтрокаЗапуска, , Истина);

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

Метод 2: Использование COM-объекта ImageMagick

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

Посмотрим на пример реализации через COM-объект:


Попытка
    ImageMagickObject = Новый COMОбъект("ImageMagickObject.MagickImage.1");
    ImageMagickObject.Convert("-density", "300", ПутьКPDF, ПутьККартинке);
Исключение
    Сообщить("Ошибка инициализации ImageMagick: " + ОписаниеОшибки());
КонецПопытки;

Этот способ требует регистрации COM-компоненты в операционной системе, что не всегда удобно при развертывании на нескольких серверах.

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

Разберем ситуацию, когда нам не хочется возиться со скриптами конвертации. В этом случае на помощь приходят «софтпринтеры» (например, Bullzip PDF Printer или PDFCreator). Эти программы устанавливаются в систему как обычный принтер, но вместо печати на бумагу они создают файл. Многие из них поддерживают сохранение сразу в JPG или PNG.

Алгоритм действий будет следующим:

  1. Устанавливаем виртуальный принтер и настраиваем его на автоматическое сохранение в нужную папку без диалоговых окон.
  2. В коде 1С устанавливаем этот принтер для нашего табличного документа через свойство ИмяПринтера.
  3. Вызываем метод Напечатать().

Важный момент: данный метод лучше всего подходит для клиентских приложений. На стороне сервера печать через виртуальные принтеры может потребовать сложной настройки прав доступа и сессий пользователя.

Метод 4: Прямая генерация изображения из HTML

Рассмотрим альтернативу: сохранение документа в HTML. Это бывает полезно, когда верстка в табличном документе сложная, и PDF искажает границы ячеек. После сохранения в HTML можно использовать легкие утилиты типа wkhtmltoimage.


ТабДок.Записать("C:\Temp\page.html", ТипФайлаТабличногоДокумента.HTML);
// Запуск конвертации HTML -> PNG
ЗапуститьПриложение("wkhtmltoimage.exe C:\Temp\page.html C:\Temp\result.png", , Истина);

Этот метод часто дает более «чистый» результат, так как не привязан к параметрам страницы принтера (поля, разрывы страниц).

Метод 5: Специализированный случай с QR-кодами

Если ваша задача, как и у автора вопроса, заключается исключительно в генерации QR-кодов для Telegram-бота, проанализируем современные возможности платформы. Начиная с версии 8.3.19, в 1С появились встроенные механизмы для работы с QR-кодами. Вам больше не нужно формировать табличный документ, чтобы получить картинку с кодом.

Используем объект Картинка и методы БСП (Библиотеки стандартных подсистем):


// Пример получения QR-кода как объекта Картинка
ДанныеQR = "https://mysite.ru/info";
ПараметрыQR = УправлениеПечатью.ПараметрыГенерацииШтрихкода();
ПараметрыQR.ТипКода = 16; // Тип для QR
КартинкаQR = УправлениеПечатью.СформироватьШтрихкод(ДанныеQR, ПараметрыQR);

// Сохраняем сразу в файл нужного формата
КартинкаQR.Записать("C:\Temp\qr_code.png");

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

Рекомендации по выбору метода

Подведем итог нашему анализу:

  1. Если нужно конвертировать сложные отчеты с сохранением форматирования — используйте связку PDF + ImageMagick.
  2. Если задача выполняется на стороне клиента и нужно быстро «сфотографировать» экран — подойдет виртуальный принтер.
  3. Для высокой скорости и минимальных зависимостей при работе с PDF рассмотрите утилиту MuPDF (mutool), она работает быстрее тяжелого ImageMagick.
  4. Для QR-кодов и простых штрихкодов всегда используйте штатные средства платформы или БСП, избегая промежуточных табличных документов.

Помните о безопасности: при использовании ЗапуститьПриложение() всегда проверяйте пути к файлам и не передавайте в строку запуска данные, полученные напрямую от пользователя, чтобы избежать инъекций команд операционной системы.

← На главную