Как программно распечатать определенную страницу PDF-файла в 1С:Предприятие?

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

С выходом платформы 1С:Предприятие версии 8.3.21 у разработчиков появился новый встроенный объект — ДокументPDF. Этот объект был долгожданным инструментом, позволяющим взаимодействовать с PDF-файлами напрямую, без использования сложных внешних компонент или COM-объектов. Однако, при детальном изучении выясняется, что его функционал на текущий момент имеет ряд существенных ограничений, особенно в части управления процессом печати. В этой статье мы подробно разберем, как работать с этим объектом, как вывести документ на принтер и что делать, если нужно распечатать не весь файл, а только конкретную страницу.

Где найти и как активировать объект ДокументPDF

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

Проанализируем шаги для активации отображения объекта в справке:

  1. Откроем конфигуратор и перейдем в меню "Справка" — "Содержание".
  2. В окне справки нажмем на иконку шестеренки (настройки).
  3. Установим флажок "Отображать нерекомендуемые объекты".

После этих манипуляций объект ДокументPDF станет доступен для изучения. Важно помнить, что полноценная работа с ним возможна только на платформе версии 8.3.21 и выше.

Разбор метода Напечатать() и его параметров

Выясним, как работает штатный механизм печати. Объект ДокументPDF обладает методом Напечатать(), который предназначен для передачи файла на принтер. Рассмотрим пример кода, который инициализирует объект и вызывает команду печати:


// Инициализируем документ из файла на диске
Документ = Новый ДокументPDF;
Документ.Прочитать("C:\Docs\Report.pdf");

// Создаем описание диалога использования принтера
Диалог = Новый ДиалогИспользованияПринтера;
Диалог.ПечатьВФайл = Ложь;

// Вызываем метод печати
Документ.Напечатать(Диалог);

Проанализируем параметры метода Напечатать(). Он принимает только один обязательный аргумент — ДиалогИспользованияПринтера. Этот объект управляет системными настройками: выбором принтера, количеством копий и ориентацией страницы. Критически важный момент: в самом объекте ДокументPDF отсутствует коллекция "Страницы". Мы не можем программно обратиться к третьей или пятой странице файла, так как для платформы 1С в данном контексте PDF-файл является "черным ящиком" — единым неразделимым контейнером.

Проблема выбора конкретной страницы

Если перед нами стоит задача распечатать, например, только 3-ю страницу многостраничного счета или акта, мы столкнемся с отсутствием штатного программного интерфейса для этой операции. Рассмотрим причины этого ограничения:

Таким образом, если мы вызываем Напечатать(), у нас есть только два пути: либо пользователь вручную выберет номер страницы в открывшемся системном диалоге печати, либо на печать уйдет весь документ целиком.

Альтернативное решение №1: Использование сторонних утилит

Разберем, как решить задачу, если печать конкретной страницы должна происходить автоматически (без участия пользователя). В этом случае мы можем прибегнуть к вызову внешних консольных программ, таких как SumatraPDF или PDFtk. Посмотрим на пример реализации через ЗапуститьПриложение():


// Путь к программе и файлу
ПутьКПрограмме = "C:\Program Files\SumatraPDF\SumatraPDF.exe";
ПутьКФайлу = "C:\Temp\Order.pdf";
НомерСтраницы = 3;

// Формируем строку команды для печати конкретной страницы на принтер по умолчанию
Команда = СтрШаблон("""%1"" -print-to-default -print-settings ""%2"" ""%3""", 
    ПутьКПрограмме, 
    НомерСтраницы, 
    ПутьКФайлу);

// Запускаем выполнение
ЗапуститьПриложение(Команда, , Истина);

Этот способ позволяет гибко управлять процессом, не ограничиваясь возможностями встроенного объекта 1С. Мы передаем номер страницы в качестве аргумента командной строки, и внешняя утилита выполняет грязную работу за нас.

Альтернативное решение №2: Работа через Табличный Документ и Картинки

Рассмотрим еще один интересный обходной путь. Начиная с версии 8.3.10, платформа 1С умеет считывать PDF-файлы как объекты типа Картинка. Выясним, как это можно использовать для печати:


// Попытка прочитать PDF как картинку
ПакетКартинок = Новый Картинка("C:\Docs\Multipage.pdf");

// Если файл многостраничный, 1С может позволить извлечь страницы
// (Внимание: работает нестабильно для сложных PDF)
ТабДок = Новый ТабличныйДокумент;
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = ПакетКартинок;

// Настройка области печати и вывод
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);

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

Подведение итогов

Мы проанализировали работу нового объекта ДокументPDF и пришли к следующим выводам:

  1. Объект ДокументPDF — это отличный инструмент для базовых операций (чтение, подпись, метаданные), но он не является полноценным редактором PDF.
  2. Программно ограничить печать одной страницей через встроенный метод Напечатать() невозможно — это может сделать только пользователь в диалоге.
  3. Для автоматизации "тихой" печати выбранных страниц следует использовать внешние инструменты командной строки.

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

← На главную