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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей
← На главную

В процессе автоматизации документооборота часто возникает задача объединения нескольких печатных форм (например, Счет-фактура, Торг-12, ТТН) в один общий PDF-файл. Это удобно для пользователей, которым нужно отправить пакет документов клиенту одним письмом или распечатать всё сразу. Основная сложность заключается в том, что разные документы могут иметь разную ориентацию страниц (портретную или ландшафтную), и при обычном объединении табличных документов форматирование может «поплыть».

В данной статье мы разберем несколько проверенных способов реализации этой задачи: от использования штатных механизмов современных версий платформы 8.3 до применения внешних консольных утилит для сильно кастомизированных систем на базе 8.2 (таких как УТ 10.3).

Способ 1: Использование объекта ПакетОтображаемыхДокументов (платформа 8.3.3+)

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

Рассмотрим алгоритм реализации:

  1. Создаем объект пакета.
  2. Формируем нужные табличные документы.
  3. Добавляем их в состав пакета.
  4. Записываем результат в файл.

Проанализируем пример кода:


// Создаем новый пакет документов
Пакет = Новый ПакетОтображаемыхДокументов;
Пакет.КоличествоЭкземпляров = 1;
Пакет.РазборПоКопиям = Истина;

// Массив табличных документов, которые нужно объединить
МассивДокументов = Новый Массив;
МассивДокументов.Добавить(ПечатьСчетаФактуры());
МассивДокументов.Добавить(ПечатьНакладной());

Для Каждого ТабДок Из МассивДокументов Цикл
    ЭлементПакета = Пакет.Состав.Добавить();
    // Помещаем табличный документ во временное хранилище
    ЭлементПакета.Данные = ПоместитьВоВременноеХранилище(ТабДок);
КонецЦикла;

// Путь для сохранения итогового файла
ПутьКФайлу = "C:\Temp\ПакетДокументов.pdf";
Пакет.ЗаписатьФайлДляПечати(ПутьКФайлу);

Важный нюанс: метод ЗаписатьФайлДляПечати автоматически сохраняет итоговый документ в формате PDF. При этом каждая печатная форма внутри пакета сохранит свои настройки печати: масштаб, поля и, самое главное, ориентацию (книжную или альбомную). Это избавляет от проблемы «мелкой печати», когда альбомные листы пытаются уместиться на книжной странице.

Способ 2: Использование внешней утилиты PDFTK (для 1С 8.2 и старых систем)

В ситуациях, когда конфигурация работает на платформе 8.2 или переписана настолько сильно, что переход на 8.3 затруднен, приходится использовать сторонние инструменты. Одним из самых надежных бесплатных решений является консольная утилита PDFTK (PDF Toolkit).

Логика работы следующая: 1С по отдельности сохраняет каждый документ в свой временный PDF-файл, а затем вызывает pdftk.exe, которая «склеивает» эти файлы в один.

Рассмотрим реализацию через создание временного .bat файла (командного сценария):


// 1. Сохраняем документы во временные файлы
ПутьКПапке = "C:\Temp\PdfExchange\";
ТабДок1.Записать(ПутьКПапке + "doc1.pdf", ТипФайлаТабличногоДокумента.PDF);
ТабДок2.Записать(ПутьКПапке + "doc2.pdf", ТипФайлаТабличногоДокумента.PDF);

// 2. Формируем текст бат-файла
ТекстБата = Новый ТекстовыйДокумент;
ТекстБата.ДобавитьСтроку("@echo off");
ТекстБата.ДобавитьСтроку("cd /d " + ПутьКПапке);
// Команда склейки всех pdf в файл result.pdf
ТекстБата.ДобавитьСтроку("pdftk *.pdf cat output result.pdf");

// Записываем бат-файл в кодировке CP866 для корректной работы с русскими путями
ПутьКБату = ПутьКПапке + "combine.bat";
ТекстБата.Записать(ПутьКБату, "cp866");

// 3. Запускаем выполнение
ЗапуститьПриложение(ПутьКБату, ПутьКПапке, Истина); // Истина - ждать завершения

// 4. Очистка (необязательно, но желательно)
// Здесь можно прочитать result.pdf в ДвоичныеДанные и удалить временные файлы

Выясним причину, почему иногда ЗапуститьПриложение не срабатывает. Часто это связано с тем, что система не видит путь к исполняемому файлу утилиты. Программисты рекомендуют указывать полный путь к pdftk.exe или заранее добавить папку с программой в переменные окружения (PATH) операционной системы.

Способ 3: Работа с изображениями и вложенными PDF

Иногда задача усложняется: нужно объединить не только печатные формы из 1С, но и внешние файлы (например, сканы сертификатов в формате JPG). Прямо включить картинку в ПакетОтображаемыхДокументов нельзя.

Разберем обходной путь:

  1. Создаем пустой ТабличныйДокумент.
  2. Вставляем в него картинку через объект РисунокТабличногоДокумента.
  3. Устанавливаем настройки страницы (например, Автомасштаб = Истина).
  4. Добавляем этот табличный документ в пакет наравне с остальными.

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


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

Сравнение инструментов: QPDF, Ghostscript и PowerShell

Помимо pdftk, существуют и другие мощные инструменты. Проанализируем их возможности:

Рекомендации по оптимизации

При пакетной обработке большого количества документов важно помнить о ресурсах сервера. Рассмотрим несколько советов:

  1. Временные файлы: Всегда используйте ПолучитьИмяВременногоФайла() для генерации уникальных путей, чтобы несколько пользователей не пытались одновременно записать данные в 111.pdf.
  2. Паузы и ожидание: При вызове внешних приложений через ЗапуститьПриложение всегда используйте параметр ЖдатьЗавершения = Истина. В противном случае 1С продолжит выполнение кода до того, как файл будет физически сформирован, что приведет к ошибке «Файл не найден».
  3. Кодировка: При создании командных файлов для Windows используйте кодировку cp866 (OEM), иначе кириллица в путях к файлам превратится в «кракозябры», и скрипт не отработает.
  4. Очистка диска: Не забывайте удалять временные файлы после завершения операции. При интенсивной работе за день могут накопиться гигабайты ненужных PDF-копий.

Таким образом, для современных систем 1С 8.3 идеальным выбором является штатный ПакетОтображаемыхДокументов, а для поддержки наследуемых систем или интеграции внешних PDF-файлов лучше всего подходит связка 1С и консольной утилиты PDFTK.

← На главную