В процессе разработки часто возникает задача выгрузки данных в строго утвержденные формы (например, налоговые декларации, банковские документы или международные контракты), которые предоставляются в формате PDF. Основная сложность заключается в том, что PDF-файл — это не просто картинка, а сложная структура, и платформа 1С "из коробки" не всегда позволяет напрямую редактировать его содержимое. В этой статье мы разберем несколько эффективных стратегий решения этой задачи: от стандартных средств платформы до использования внешних инструментов.
Это самый распространенный и "чистый" с точки зрения архитектуры способ. Вместо того чтобы пытаться "взломать" PDF, мы создаем его точную копию внутри конфигурации. Рассмотрим этот процесс подробнее.
Алгоритм реализации:
Макет типа "Табличный документ".ГраницаСверху, Шрифт, ОриентацияТекста.Заполнение в значение Параметр.После создания макета, мы можем программно заполнить его и сохранить в PDF. Проанализируем пример кода:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетPDF_Шаблон");
ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
// Заполняем параметры данными из 1С
ОбластьМакета.Параметры.НомерДокумента = "№ 123";
ОбластьМакета.Параметры.ДатаДокумента = ТекущаяДата();
ТабДок.Вывести(ОбластьМакета);
// Сохраняем итоговый результат в PDF
ТабДок.Записать("C:\Temp\Result.pdf", ТипФайлаТабличногоДокумента.PDF);
Если шаблон слишком сложен для ручной отрисовки (много мелких деталей, градиентов или специфических шрифтов), воспользуемся функционалом фонового изображения. Начиная с версии 8.3.15, ТабличныйДокумент позволяет устанавливать картинку на задний план.
Шаги выполнения:
ФоноваяКартинка.ВыводитьНаПечать для картинки, если это необходимо.Если ваша компания использует пакет MS Office, можно применить метод через COM-соединение. Word гораздо лучше справляется с позиционированием элементов, чем табличный документ 1С. Рассмотрим ситуацию, когда у нас есть .docx файл, который мы потом программно переводим в PDF.
Разберем по шагам:
Попытка
Word = Новый COMОбъект("Word.Application");
Исключение
Сообщить("MS Word не установлен");
Возврат;
КонецПопытки;
Документ = Word.Documents.Open("C:\Templates\Contract.docx");
Word.Visible = Ложь;
// Поиск и замена закладок
Если Документ.Bookmarks.Exists("Number") Тогда
Документ.Bookmarks.Item("Number").Range.Text = "001-А";
КонецЕсли;
// Сохранение в PDF (формат 17 соответствует wdExportFormatPDF)
ПутьСохранения = "C:\Temp\Contract.pdf";
Документ.ExportAsFixedFormat(ПутьСохранения, 17);
Документ.Close(0); // Закрыть без сохранения изменений в шаблоне
Word.Quit();
Выясним причину, по которой этот метод считается наиболее надежным для работы с уже готовыми формами AcroForms (PDF с заполняемыми полями). Утилита PDFtk — это консольный инструмент, который умеет "впрыскивать" данные в PDF-поля без изменения самого макета.
Как это работает:
ClientName, TotalSum).Пример формирования команды:
// Формируем строку запуска для командной строки
// pdftk шаблон.pdf fill_form данные.fdf output результат.pdf flatten
ПутьКPDFtk = "C:\Program Files (x86)\PDFtk\bin\pdftk.exe";
Шаблон = "C:\Forms\Claim.pdf";
ФайлДанных = "C:\Temp\Data.fdf";
Результат = "C:\Temp\Final_Claim.pdf";
Команда = СтрШаблон("%1 %2 fill_form %3 output %4 flatten",
ПутьКPDFtk, Шаблон, ФайлДанных, Результат);
ЗапуститьПриложение(Команда, , Истина); // Истина - ждать завершения
Параметр flatten крайне важен — он "склеивает" данные с подложкой, делая поля недоступными для дальнейшего редактирования, что превращает документ в обычный печатный PDF.
Выбор метода зависит от ваших условий:
Проанализируйте сложность вашего шаблона и наличие установленного ПО на рабочих станциях пользователей перед выбором конкретной реализации.