Как программно сохранить печатную форму или табличный документ в PDF в 1С 8.3?

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

В процессе разработки в среде 1С:Предприятие 8.3 часто возникает задача автоматизации выгрузки документов. Одной из наиболее востребованных функций является сохранение печатной формы (табличного документа) в формате PDF для последующей отправки по электронной почте или архивирования. В рамках данной статьи мы подробно разберем, как реализовать этот функционал программно, какие методы платформы использовать и на какие нюансы обратить внимание при работе на сервере и клиенте.

Использование метода Записать() для объекта ТабличныйДокумент

Основным инструментом для решения нашей задачи является встроенный метод Записать() объекта ТабличныйДокумент. Этот метод универсален и позволяет сохранять данные в различных форматах, включая PDF, Excel и HTML. Рассмотрим подробнее синтаксис и базовый пример использования.

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


// Предположим, ТабДок — это уже сформированный ТабличныйДокумент
ПутьКФайлу = "C:\Temp\MyDocument.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);

Разберем по шагам, что происходит в этом фрагменте:

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

Особенности сохранения на стороне сервера

Часто формирование печатных форм происходит в серверных модулях. Здесь мы можем столкнуться с проблемой прав доступа. Выясним причину: когда код исполняется на сервере, 1С обращается к файловой системе от имени пользователя, под которым запущен агент службы 1С:Предприятия (обычно это USR1CV8). Если у этой учетной записи нет прав на запись в указанную папку, возникнет ошибка доступа.

Посмотрим на пример правильной организации серверного сохранения с использованием временных файлов, что является "лучшей практикой" разработки:


&НаСервере
Функция СохранитьПечатнуюФормуВоВременныйФайл(ИмяДокумента)
    
    // Создаем табличный документ (или получаем его из функции печати)
    ТабДок = СформироватьПечатнуюФорму(ИмяДокумента);
    
    // Получаем путь во временном каталоге сервера
    ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
    
    // Записываем файл
    Попытка
        ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
        Возврат ИмяФайла;
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка сохранения PDF", УровеньЖурналаРегистрации.Ошибка,,, КраткоеПредставлениеОшибки(ОписаниеОшибки()));
        ВызватьИсключение "Не удалось сохранить файл на сервере.";
    КонецПопытки;
    
КонецФункции

В этом примере мы используем функцию ПолучитьИмяВременногоФайла(), которая гарантирует, что файл будет создан в доступной для службы 1С директории с уникальным именем. Это исключает конфликты имен при одновременной работе нескольких пользователей.

Настройка параметров страницы перед сохранением

Просто вызвать метод записи иногда недостаточно. Чтобы PDF-документ выглядел профессионально и корректно отображался при печати, необходимо проанализировать настройки страницы табличного документа. Если таблица слишком широкая, она может "разрезаться" на несколько страниц в PDF.

Рассмотрим, как программно подогнать масштаб под ширину страницы:


ТабДок.АвтоМасштаб = Истина; // Автоматически масштабировать документ
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; // Если форма широкая
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;

Использование свойства АвтоМасштаб позволяет платформе самостоятельно вычислить коэффициент сжатия, чтобы все колонки уместились на одном листе по ширине. Это особенно важно для отчетов и сложных спецификаций.

Массовое сохранение документов

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

Пример цикла обработки:


Для Каждого СсылкаНаДокумент Из МассивСсылок Цикл
    
    ТабДок = СформироватьПечатнуюФорму(СсылкаНаДокумент);
    
    // Очищаем имя файла от недопустимых символов (/, \, :, *, ?, ", <, >, |)
    БезопасныйНомер = СтрЗаменить(СсылкаНаДокумент.Номер, "/", "_");
    ИмяФайла = "Счет_№_" + БезопасныйНомер + ".pdf";
    ПолныйПуть = КаталогВыгрузки + "\" + ИмяФайла;
    
    ТабДок.Записать(ПолныйПуть, ТипФайлаТабличногоДокумента.PDF);
    
КонецЦикла;

Важно помнить, что если вы работаете в веб-клиенте, прямое сохранение на локальный диск пользователя через Записать() невозможно из соображений безопасности браузера. В таком случае необходимо сначала сохранить файл на сервере, а затем передать его на клиент с помощью метода ПолучитьФайл().

Типичные ошибки и способы их решения

Проанализируем основные проблемы, с которыми сталкиваются разработчики:

  1. Отсутствие шрифтов в Linux: Если сервер 1С работает под управлением ОС Linux, для корректной генерации PDF необходимо, чтобы в системе были установлены шрифты (например, Microsoft Core Fonts: Arial, Times New Roman). Без них текст в PDF может превратиться в "квадратики".
  2. Пустой документ: Если ТабличныйДокумент пуст (не содержит областей или строк), метод Записать() может выдать ошибку. Всегда проверяйте заполненность документа перед сохранением.
  3. Блокировка файла: Если файл с таким же именем уже открыт у пользователя в программе Adobe Reader, 1С не сможет перезаписать его и выдаст ошибку доступа. В коде рекомендуется использовать блок Попытка...Исключение.

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

← На главную