В процессе разработки часто возникает необходимость передать данные из 1С во внешние системы в виде графики. Это может быть отправка счета в мессенджер, генерация QR-кода для чека или создание превью печатной формы. Поскольку стандартный объект ТабличныйДокумент не поддерживает метод Записать() напрямую в формат картинки (за исключением PDF, HTML и форматов Excel), нам приходится искать обходные пути. Рассмотрим несколько эффективных способов решения этой задачи.
Проанализируем наиболее универсальный подход, который выбрал автор темы. Он заключается в двухэтапном процессе: сначала мы сохраняем табличный документ в промежуточный формат 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 + """ """ + ПутьККартинке + """";
ЗапуститьПриложение(СтрокаЗапуска, , Истина);
Выясним преимущества этого метода: он позволяет гибко управлять качеством изображения и поддерживает многостраничные документы. Однако важно помнить, что на сервере должны быть установлены соответствующие права на запуск внешних приложений.
Если мы не хотим использовать прямой запуск исполняемого файла exe, мы можем обратиться к COM-интерфейсу библиотеки. Это позволяет более тонко обрабатывать ошибки внутри кода 1С.
Посмотрим на пример реализации через COM-объект:
Попытка
ImageMagickObject = Новый COMОбъект("ImageMagickObject.MagickImage.1");
ImageMagickObject.Convert("-density", "300", ПутьКPDF, ПутьККартинке);
Исключение
Сообщить("Ошибка инициализации ImageMagick: " + ОписаниеОшибки());
КонецПопытки;
Этот способ требует регистрации COM-компоненты в операционной системе, что не всегда удобно при развертывании на нескольких серверах.
Разберем ситуацию, когда нам не хочется возиться со скриптами конвертации. В этом случае на помощь приходят «софтпринтеры» (например, Bullzip PDF Printer или PDFCreator). Эти программы устанавливаются в систему как обычный принтер, но вместо печати на бумагу они создают файл. Многие из них поддерживают сохранение сразу в JPG или PNG.
Алгоритм действий будет следующим:
ИмяПринтера.Напечатать().Важный момент: данный метод лучше всего подходит для клиентских приложений. На стороне сервера печать через виртуальные принтеры может потребовать сложной настройки прав доступа и сессий пользователя.
Рассмотрим альтернативу: сохранение документа в HTML. Это бывает полезно, когда верстка в табличном документе сложная, и PDF искажает границы ячеек. После сохранения в HTML можно использовать легкие утилиты типа wkhtmltoimage.
ТабДок.Записать("C:\Temp\page.html", ТипФайлаТабличногоДокумента.HTML);
// Запуск конвертации HTML -> PNG
ЗапуститьПриложение("wkhtmltoimage.exe C:\Temp\page.html C:\Temp\result.png", , Истина);
Этот метод часто дает более «чистый» результат, так как не привязан к параметрам страницы принтера (поля, разрывы страниц).
Если ваша задача, как и у автора вопроса, заключается исключительно в генерации 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-кода типовыми средствами конфигурации.
Подведем итог нашему анализу:
Помните о безопасности: при использовании ЗапуститьПриложение() всегда проверяйте пути к файлам и не передавайте в строку запуска данные, полученные напрямую от пользователя, чтобы избежать инъекций команд операционной системы.