С выходом платформы 1С:Предприятие версии 8.3.21 у разработчиков появился новый встроенный объект — ДокументPDF. Этот объект был долгожданным инструментом, позволяющим взаимодействовать с PDF-файлами напрямую, без использования сложных внешних компонент или COM-объектов. Однако, при детальном изучении выясняется, что его функционал на текущий момент имеет ряд существенных ограничений, особенно в части управления процессом печати. В этой статье мы подробно разберем, как работать с этим объектом, как вывести документ на принтер и что делать, если нужно распечатать не весь файл, а только конкретную страницу.
Прежде чем мы приступим к написанию кода, важно понимать, почему многие разработчики не видят этот объект в синтакс-помощнике (СП). Рассмотрим ситуацию: вы открываете справку, ищете ДокументPDF, но поиск не дает результатов. Это происходит потому, что на начальных этапах внедрения платформы 1С помечает некоторые новые объекты как "нерекомендуемые" или специфические для определенных платформ (например, мобильной).
Проанализируем шаги для активации отображения объекта в справке:
После этих манипуляций объект ДокументPDF станет доступен для изучения. Важно помнить, что полноценная работа с ним возможна только на платформе версии 8.3.21 и выше.
Выясним, как работает штатный механизм печати. Объект ДокументPDF обладает методом Напечатать(), который предназначен для передачи файла на принтер. Рассмотрим пример кода, который инициализирует объект и вызывает команду печати:
// Инициализируем документ из файла на диске
Документ = Новый ДокументPDF;
Документ.Прочитать("C:\Docs\Report.pdf");
// Создаем описание диалога использования принтера
Диалог = Новый ДиалогИспользованияПринтера;
Диалог.ПечатьВФайл = Ложь;
// Вызываем метод печати
Документ.Напечатать(Диалог);
Проанализируем параметры метода Напечатать(). Он принимает только один обязательный аргумент — ДиалогИспользованияПринтера. Этот объект управляет системными настройками: выбором принтера, количеством копий и ориентацией страницы. Критически важный момент: в самом объекте ДокументPDF отсутствует коллекция "Страницы". Мы не можем программно обратиться к третьей или пятой странице файла, так как для платформы 1С в данном контексте PDF-файл является "черным ящиком" — единым неразделимым контейнером.
Если перед нами стоит задача распечатать, например, только 3-ю страницу многостраничного счета или акта, мы столкнемся с отсутствием штатного программного интерфейса для этой операции. Рассмотрим причины этого ограничения:
ДокументPDF предназначен преимущественно для чтения, добавления вложений, установки паролей и работы с электронными подписями (по аналогии с макросами Libre Office для вставки факсимиле).ДокументPDF и скопировать в него одну страницу из другого документа.Напечатать() не предусмотрена синтаксисом.Таким образом, если мы вызываем Напечатать(), у нас есть только два пути: либо пользователь вручную выберет номер страницы в открывшемся системном диалоге печати, либо на печать уйдет весь документ целиком.
Разберем, как решить задачу, если печать конкретной страницы должна происходить автоматически (без участия пользователя). В этом случае мы можем прибегнуть к вызову внешних консольных программ, таких как SumatraPDF или PDFtk. Посмотрим на пример реализации через ЗапуститьПриложение():
// Путь к программе и файлу
ПутьКПрограмме = "C:\Program Files\SumatraPDF\SumatraPDF.exe";
ПутьКФайлу = "C:\Temp\Order.pdf";
НомерСтраницы = 3;
// Формируем строку команды для печати конкретной страницы на принтер по умолчанию
Команда = СтрШаблон("""%1"" -print-to-default -print-settings ""%2"" ""%3""",
ПутьКПрограмме,
НомерСтраницы,
ПутьКФайлу);
// Запускаем выполнение
ЗапуститьПриложение(Команда, , Истина);
Этот способ позволяет гибко управлять процессом, не ограничиваясь возможностями встроенного объекта 1С. Мы передаем номер страницы в качестве аргумента командной строки, и внешняя утилита выполняет грязную работу за нас.
Рассмотрим еще один интересный обходной путь. Начиная с версии 8.3.10, платформа 1С умеет считывать PDF-файлы как объекты типа Картинка. Выясним, как это можно использовать для печати:
// Попытка прочитать PDF как картинку
ПакетКартинок = Новый Картинка("C:\Docs\Multipage.pdf");
// Если файл многостраничный, 1С может позволить извлечь страницы
// (Внимание: работает нестабильно для сложных PDF)
ТабДок = Новый ТабличныйДокумент;
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = ПакетКартинок;
// Настройка области печати и вывод
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Важно учитывать, что метод работы через Картинка часто считывает только первую страницу PDF-файла. Для полноценной работы с многостраничными документами этот метод подходит плохо, но его можно рассматривать как вариант для одностраничных бланков, которые нужно вывести в составе ТабличныйДокумент.
Мы проанализировали работу нового объекта ДокументPDF и пришли к следующим выводам:
ДокументPDF — это отличный инструмент для базовых операций (чтение, подпись, метаданные), но он не является полноценным редактором PDF.Напечатать() невозможно — это может сделать только пользователь в диалоге.Платформа 1С продолжает развиваться, и, возможно, в будущих релизах коллекция Страницы будет добавлена в объект ДокументPDF. А пока мы рекомендуем использовать комбинацию штатных средств для хранения и подготовки файлов и внешних утилит для сложного управления печатью.