В процессе разработки часто возникает задача предоставить пользователю отчет или печатную форму в виде обычного изображения. Это удобно для отправки в мессенджеры, публикации на сайтах или вставки в презентации. Однако встроенный метод 1С Записать() для объекта ТабличныйДокумент не поддерживает формат JPEG напрямую. В данной статье мы подробно разберем, как обойти это ограничение и реализовать качественную конвертацию различными способами. Для решения этой задачи также можно использовать готовое решение для экспорта печатных форм в растровые изображения.
Проанализируем наиболее эффективный и популярный способ, который заключается в двухступенчатом процессе: сначала мы сохраняем документ в формат PDF штатными средствами 1С, а затем преобразуем его в JPEG с помощью мощного инструмента ImageMagick. Это решение позволяет гибко управлять качеством и разрешением итоговой картинки.
Разберем алгоритм реализации на языке 1С:
ТабличныйДокумент во временный файл PDF.convert.exe.Посмотрим на пример рабочего кода:
// 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С.
Если по каким-то причинам установка ImageMagick невозможна, рассмотрим вариант с виртуальными принтерами, такими как PDFCreator или Bullzip PDF Printer. Эти программы создают в системе "мнимый" принтер, который вместо печати на бумаге сохраняет документ в файл практически любого графического формата.
Этот метод особенно удобен для старых версий платформы или когда требуется полная имитация печатного процесса. Проанализируем программное управление таким принтером через COM-объект:
Принтер объекта ТабличныйДокумент.Напечатать().Основной минус данного подхода — необходимость настройки прав доступа на сервере 1С:Предприятие, так как не все виртуальные принтеры корректно работают в сессии без графического интерфейса.
Для тех, кто ищет независимое от внешнего софта решение, стоит обратить внимание на проект Yoksel. Это внешняя компонента, которая изначально создавалась для расширения возможностей работы с электронными таблицами в 1С 7.7, но прекрасно работает и в версии 8.x.
Преимущество Yoksel в том, что она содержит собственный движок рендеринга. Процедура работы выглядит так:
// Создаем объект компоненты
Йоксель = Новый COMОбъект("Yoksel.Spreadsheet");
// Загружаем в него наш табличный документ через промежуточный файл или буфер
Йоксель.Открыть(ИмяВременногоФайлаMxl);
// Экспортируем в картинку
Картинка = Йоксель.ЭкспортВКартинку();
Картинка.Записать(ИмяФайлаJpg, "jpeg");
Нужно учитывать, что Yoksel — проект с долгой историей, и при работе со сложными современными элементами оформления табличных документов (например, прозрачностью или специфическими тенями) могут возникнуть нюансы отображения.
Выясним еще одну интересную возможность. Платформа 1С отлично сохраняет табличные документы в формат HTML с сохранением всей структуры ячеек и стилей. Существует бесплатная утилита wkhtmltoimage, использующая движок WebKit для отрисовки HTML сразу в изображение.
Сценарий использования:
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.HTML);.wkhtmltoimage.exe, передав ему путь к HTML и путь к будущему JPEG.Этот способ часто дает наиболее точное соответствие шрифтов и размеров, так как механизм рендеринга браузеров очень продвинут.
Проанализируем ситуацию, когда конвертация должна происходить в фоновом задании на сервере. В этом случае мы сталкиваемся с рядом ограничений:
USR1CV8), должна иметь права на запуск внешних исполняемых файлов и запись в каталоги временных файлов.ЗапуститьПриложение обязательно устанавливайте параметр ДождатьсяЗавершения в значение Истина, чтобы код 1С не продолжил выполнение до того, как файл будет физически создан на диске.Разберем пример обработки результата в управляемых формах, если вы используете асинхронные вызовы:
&НаКлиенте
Процедура ПослеКонвертации(ВыборВыполнен, АдресРезультатВыбора, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если ВыборВыполнен Тогда
// Здесь мы можем поместить файл в регистр или отправить по почте
Сообщить("Файл успешно преобразован и загружен!");
КонецЕсли;
КонецПроцедуры
Подводя итог, можно сказать, что выбор метода зависит от ваших технических условий. Если у вас есть возможность установить стороннее ПО на сервер — связка 1С + PDF + ImageMagick является самой надежной и качественной. Если же требуется решение "все в одном" без инсталляций, лучше посмотреть в сторону внешних компонент или использования .NET библиотек (через COM-интерфейс) для отрисовки графики в памяти сервера.
При любом способе всегда следите за очисткой временных файлов. Используйте УдалитьФайлы() после завершения всех операций, чтобы не переполнять дисковое пространство сервера мусорными данными.