В процессе автоматизации документооборота часто возникает задача объединения нескольких печатных форм (например, Счет-фактура, Торг-12, ТТН) в один общий PDF-файл. Это удобно для пользователей, которым нужно отправить пакет документов клиенту одним письмом или распечатать всё сразу. Основная сложность заключается в том, что разные документы могут иметь разную ориентацию страниц (портретную или ландшафтную), и при обычном объединении табличных документов форматирование может «поплыть».
В данной статье мы разберем несколько проверенных способов реализации этой задачи: от использования штатных механизмов современных версий платформы 8.3 до применения внешних консольных утилит для сильно кастомизированных систем на базе 8.2 (таких как УТ 10.3).
Если ваша конфигурация запущена на платформе 1С:Предприятие 8.3, наиболее правильным и технологичным решением будет использование встроенного объекта ПакетОтображаемыхДокументов. Этот объект специально предназначен для формирования пакетов печати и корректно обрабатывает документы с разной ориентацией страниц, сохраняя их в один PDF.
Рассмотрим алгоритм реализации:
Проанализируем пример кода:
// Создаем новый пакет документов
Пакет = Новый ПакетОтображаемыхДокументов;
Пакет.КоличествоЭкземпляров = 1;
Пакет.РазборПоКопиям = Истина;
// Массив табличных документов, которые нужно объединить
МассивДокументов = Новый Массив;
МассивДокументов.Добавить(ПечатьСчетаФактуры());
МассивДокументов.Добавить(ПечатьНакладной());
Для Каждого ТабДок Из МассивДокументов Цикл
ЭлементПакета = Пакет.Состав.Добавить();
// Помещаем табличный документ во временное хранилище
ЭлементПакета.Данные = ПоместитьВоВременноеХранилище(ТабДок);
КонецЦикла;
// Путь для сохранения итогового файла
ПутьКФайлу = "C:\Temp\ПакетДокументов.pdf";
Пакет.ЗаписатьФайлДляПечати(ПутьКФайлу);
Важный нюанс: метод ЗаписатьФайлДляПечати автоматически сохраняет итоговый документ в формате PDF. При этом каждая печатная форма внутри пакета сохранит свои настройки печати: масштаб, поля и, самое главное, ориентацию (книжную или альбомную). Это избавляет от проблемы «мелкой печати», когда альбомные листы пытаются уместиться на книжной странице.
В ситуациях, когда конфигурация работает на платформе 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) операционной системы.
Иногда задача усложняется: нужно объединить не только печатные формы из 1С, но и внешние файлы (например, сканы сертификатов в формате JPG). Прямо включить картинку в ПакетОтображаемыхДокументов нельзя.
Разберем обходной путь:
ТабличныйДокумент.РисунокТабличногоДокумента.Автомасштаб = Истина).Посмотрим на пример вставки картинки:
ТабДокКартинка = Новый ТабличныйДокумент;
Рисунок = ТабДокКартинка.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Новый Картинка(ПутьКФайлуСкана);
Рисунок.Верх = 0;
Рисунок.Лево = 0;
// Растягиваем рисунок на лист
ТабДокКартинка.ОбластьПечати = ТабДокКартинка.Область(1, 1, 1, 1);
// Далее добавляем ТабДокКартинка в ПакетОтображаемыхДокументов
Помимо pdftk, существуют и другие мощные инструменты. Проанализируем их возможности:
iTextSharp. Это позволяет избежать использования .bat файлов и работать более гибко.При пакетной обработке большого количества документов важно помнить о ресурсах сервера. Рассмотрим несколько советов:
ПолучитьИмяВременногоФайла() для генерации уникальных путей, чтобы несколько пользователей не пытались одновременно записать данные в 111.pdf.ЗапуститьПриложение всегда используйте параметр ЖдатьЗавершения = Истина. В противном случае 1С продолжит выполнение кода до того, как файл будет физически сформирован, что приведет к ошибке «Файл не найден».cp866 (OEM), иначе кириллица в путях к файлам превратится в «кракозябры», и скрипт не отработает.Таким образом, для современных систем 1С 8.3 идеальным выбором является штатный ПакетОтображаемыхДокументов, а для поддержки наследуемых систем или интеграции внешних PDF-файлов лучше всего подходит связка 1С и консольной утилиты PDFTK.