Как отобразить и распечатать скан документа PDF в 1С на обычных формах

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

В процессе автоматизации документооборота разработчики нередко сталкиваются с необходимостью обработать отсканированный документ в формате PDF: показать его пользователю прямо в интерфейсе программы, встроить в отчет или сформировать задание на печать. На обычных формах платформы «1С:Предприятие 8.3» эта задача имеет ряд архитектурных нюансов, так как встроенный табличный документ не предназначен для прямого открытия файлов PDF.

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

Ограничения табличного документа и встроенных механизмов платформы

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

Если мы хотим разместить графический объект через коллекцию Рисунки табличного документа, платформа ожидает стандартные растровые форматы: PNG, JPG, BMP, TIFF или GIF. Сам по себе формат PDF является векторно-растровым контейнером со сложной структурой данных, которую табличный документ интерпретировать не умеет. Кроме того, современные механизмы работы с PDF (например, специализированный объект ДокументPDF), добавленные в платформу в более поздних версиях, ориентированы на управляемые формы и недоступны в обычном приложении.

Способ 1. Вывод страниц PDF в табличный документ через конвертацию

Если бизнес-логика строго требует, чтобы скан документа стал частью макета печатной формы (например, подкладывался под подписи или выводился в составе общего отчета), пойдем путем промежуточного преобразования PDF в поддерживаемый растровый формат.

Рассмотрим порядок действий по шагам:

  1. Выполняем конвертацию исходного PDF-файла в изображение (PNG или JPG) с помощью консольной утилиты (например, pdftoppm или Ghostscript). Преобразование запускается синхронно с помощью функции ЗапуститьПриложение().
  2. Полученный файл картинки загружаем в память 1С в объект Картинка.
  3. Создаем рисунок в табличном документе и привязываем его к нужной области ячеек.

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


ПутьКИзображению = "C:\Temp\page_1.png";
НоваяКартинка = Новый Картинка(ПутьКИзображению);

ТабДокумент = Новый ТабличныйДокумент;
ОбластьМакета = ТабДокумент.ПолучитьОбласть("R1C1:R30C10");
ТабДокумент.Вывести(ОбластьМакета);

Рисунок = ТабДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = НоваяКартинка;
Рисунок.Расположить(ТабДокумент.Область("R1C1:R30C10"));
Рисунок.РазмерКартинки = РазмерКартинки.АвтоРазмер;

ТабДокумент.Показать("Печать скана");

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

Способ 2. Отображение PDF внутри формы через «Поле HTML-документа»

В случаях, когда скан документа оператору требуется только просмотреть перед отправкой на принтер, использование табличного документа является избыточным. Размещение на форме сторонних элементов ActiveX часто приводит к аварийным завершениям работы 1С из-за конфликта разрядности процессов (32 и 64 бит) или утечек памяти.

Проанализируем более стабильный вариант: размещение на форме элемента управления ПолеHTMLДокумента. Внутрь поля загружается HTML-разметка с тегом <iframe> или <embed>, указывающая на локальный файл скана. Для обеспечения гарантированного отображения можно использовать библиотеку PDF.js, передавая двоичные данные файла в виде строки base64.

Рассмотрим пример формирования HTML-разметки для отображения локального файла:


ПутьКPDF = "C:\Scans\Document.pdf";

ТекстHTML = "<html><body style='margin:0; padding:0;'>"
    + "<embed src='file:///" + СтрЗаменить(ПутьКPDF, "\", "/") 
    + "' type='application/pdf' width='100%' height='100%' />"
    + "</body></html>";

ЭлементыФормы.ПолеHTML.УстановитьТекст(ТекстHTML);

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

Способ 3. Прямая печать PDF без предварительного просмотра

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

Вариант А: Использование утилиты SumatraPDF

В отличие от классического Adobe Acrobat Reader, процесс которого часто зависает в памяти после печати, легковесная утилита SumatraPDF корректно завершает работу после отправки документа в очередь печати.

Разберем параметры командной строки:

  1. -print-to-default — печать на принтер, назначенный в операционной системе по умолчанию;
  2. -print-to "ИмяПринтера" — отправка на строго определенный принтер;
  3. -silent — подавление диалоговых окон настроек.

Посмотрим на пример вызова:


ПутьКPDF = "C:\Scans\Document.pdf";
Команда = "SumatraPDF.exe -print-to-default -silent """ + ПутьКPDF + """";
ЗапуститьПриложение(Команда, "", Истина);

Вариант Б: Печать через системный интерфейс Windows

Если установка дополнительного программного обеспечения нежелательна, воспользуемся системным COM-объектом Shell.Application, который передаст команду печати обработчику, зарегистрированному в Windows для PDF-файлов:


ПутьКPDF = "C:\Scans\Document.pdf";

AppShell = Новый COMОбъект("Shell.Application");
AppShell.ShellExecute(ПутьКPDF, "", "", "print", 0);

Параметр 0 скрывает окно запускаемого процесса, обеспечивая фоновую передачу задания на принтер по умолчанию.

Итоги

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

  1. Для формирования комплексного отчета с встроенным сканом — выполняем предварительную конвертацию PDF в растр (PNG/JPG) и вставляем объект в Рисунки макета.
  2. Для интерактивного просмотра внутри 1С — выводим документ через ПолеHTMLДокумента.
  3. Для «тихой» отправки на принтер — используем утилиту фоновой печати или метод ShellExecute без привлечения макетов.
← На главную