К статье
Практический материал

Разработка и Конфигурация · 10 мин

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

Как программно сохранить табличный документ в PDF в 1С: метод Записать, ТипФайлаТабличногоДокумента.PDF, настройки печати и типичные ошибки.

Задача сохранить табличный документ в PDF возникает постоянно: отправка счетов и актов по почте, выгрузка отчётов для руководства, архив печатных форм. Во встроенном языке 1С это решается одним методом — Записать() с указанием типа файла PDF, без внешних компонент и виртуальных принтеров.

Метод работает и на клиенте, и на сервере, поддерживается в тонком, веб- и толстом клиенте. Однако у него есть нюансы: кодировка имён файлов, разрешения на файловую систему, поведение в фоновых заданиях и особенности веб-клиента. Ниже разобраны рабочие примеры кода, типовые сценарии и ошибки, из-за которых файл не создаётся или создаётся пустым.

Базовый синтаксис метода Записать

Объект типа «ТабличныйДокумент» имеет метод Записать(), который принимает имя файла и тип файла. Для PDF используется значение системного перечисления ТипФайлаТабличногоДокумента.PDF.

Минимальный рабочий пример выглядит так:

ТабДок = Новый ТабличныйДокумент;

// ... заполнение табличного документа ...

ТабДок.Записать("C:\Temp\Счет.pdf", ТипФайлаТабличногоДокумента.PDF);

Метод возвращает не результат выполнения, а вызывает исключение при ошибке, поэтому в прикладном коде вызов стоит оборачивать в Попытка ... Исключение ... КонецПопытки. Это особенно важно при записи на сетевые диски и в каталоги, где у пользователя может не быть прав.

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

bsl
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

Полный пример: от макета до готового PDF

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

Процедура СохранитьСчетВPDF(ДокументСсылка) Экспорт

ТабДок = Новый ТабличныйДокумент;

Макет = Документы.СчетНаОплату.ПолучитьМакет("Счет");

ОбластьШапка = Макет.ПолучитьОбласть("Шапка");

ОбластьШапка.Параметры.Номер = ДокументСсылка.Номер;

ТабДок.Вывести(ОбластьШапка);

// ... вывод остальных областей ...

ИмяФайла = КаталогВременныхФайлов() + "Счет_"

+ СтрЗаменить(ДокументСсылка.Номер, "/", "_") + ".pdf";

Попытка

ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

Исключение

ЗаписьЖурналаРегистрации("Сохранение PDF",

УровеньЖурналаРегистрации.Ошибка, , ,

ОписаниеОшибки());

ВызватьИсключение;

КонецПопытки;

КонецПроцедуры

Здесь используется КаталогВременныхФайлов() — это безопасный вариант, потому что каталог гарантированно существует и доступен на запись и на клиенте, и на сервере. Жёстко прописывать пути вроде C:\Temp не стоит: на сервере 1С этой папки может не быть или у служебной учётной записи не окажется прав на неё.

Имя файла формируйте без недопустимых символов. Номера документов часто содержат слэши, двоеточия и другие знаки, которые в имени файла запрещены — заменяйте их через СтрЗаменить() перед записью.

Параметры вывода и качество PDF

Качество итогового PDF определяется настройками самого табличного документа до вызова Записать(). Прежде всего проверьте свойства АвтоМасштаб, МасштабПечати, ОриентацияСтраницы и поля страницы — PDF формируется по тем же правилам, что и печать.

Если документ при печати умещается на одну страницу, а в PDF разъезжается на две, почти всегда причина в масштабе или в ширине колонок, выходящей за область печати. Установите ТабДок.АвтоМасштаб = Истина или задайте масштаб явно и проверьте результат.

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

Сохранение на клиенте, сервере и в фоновом задании

Место выполнения кода определяет, где физически появится файл. Если процедура выполняется НаСервере, PDF создаётся на сервере 1С, и пользователь его не увидит, пока файл не будет передан на клиент — например, через временное хранилище.

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

В фоновых заданиях метод Записать() с PDF работает, но есть ограничение: в фоне недоступен интерактивный контекст, поэтому все пути и права должны быть обеспечены заранее. Также на сервере под Linux убедитесь, что установлены шрифты — без них текст в PDF может отображаться некорректно.

Порядок действий
  1. 1
    Сформируйте табличный документ и задайте параметры печати (масштаб, ориентацию, поля)
  2. 2
    Проверьте существование каталога назначения, при необходимости создайте его
  3. 3
    Очистите имя файла от недопустимых символов
  4. 4
    Вызовите Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF) в блоке Попытка/Исключение
  5. 5
    Проверьте, что файл создан и открывается, при серверном вызове передайте его клиенту через временное хранилище

Типичные ошибки и их устранение

Самая частая проблема — исключение «Ошибка доступа к файлу» или пустой результат. Причины обычно в правах на каталог, несуществующем пути или в том, что табличный документ на момент записи пуст.

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

Типичные ошибки
01
Запись в несуществующий каталог — метод падает с ошибкой, папку нужно создать заранее
02
Недопустимые символы в имени файла (слэши из номера документа) — исключение при записи
03
Вызов на сервере с ожиданием файла на клиенте — файл остаётся на сервере, нужна передача через хранилище
04
Запись пустого табличного документа — PDF создаётся, но без содержимого
05
Отсутствие шрифтов на сервере Linux — текст в PDF заменяется или искажается

Ещё одна ловушка — запись в файл, который уже открыт в другой программе (например, пользователь просматривает прошлую версию в PDF-ридере). В Windows это приводит к ошибке доступа. Решение — генерировать уникальные имена файлов или предупреждать пользователя о необходимости закрыть документ.

Альтернативы и смежные способы

Метод Записать() поддерживает и другие форматы: XLSX, MXL, HTML, ODS, TXT. Если цель — не архив, а обмен данными, иногда правильнее выгружать в Excel. Для пакетной отправки по почте PDF-файл удобно сразу прикладывать к письму через объект ИнтернетПочтовоеСообщение, не сохраняя его пользователю на диск.

Сравнение вариантов

Записать с типом PDF

Штатный способ, работает везде без внешних компонент; ограничение — настройки вывода задаются через свойства табличного документа

Печать через виртуальный PDF-принтер

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

Сохранение в MXL с последующей конвертацией

Оправдано, если нужен редактируемый архив форм; требует отдельного этапа конвертации в PDF

Если требуется объединить несколько табличных документов в один PDF, штатного метода «склейки» нет. Практические варианты: вывести все разделы в один табличный документ с разрывами страниц (ВывестиГоризонтальныйРазделительСтраниц()) и записать его одним файлом — это самый простой и надёжный путь.

Проверка результата

После записи убедитесь, что файл реально создан и не пуст. Программно это делается через объект Файл: проверьте Существует() и размер — PDF нулевого размера означает сбой записи.

Контрольные точки

Как проверить результат

Файл создан
Норма

Файл существует по указанному пути, размер больше нуля

Тревожный признак

Файл отсутствует или размер 0 байт

Содержимое PDF
Норма

Документ открывается, текст и таблицы совпадают с печатной формой

Тревожный признак

Пустые страницы, обрезанные колонки, искажённые шрифты

Количество страниц
Норма

Совпадает с предварительным просмотром печати

Тревожный признак

Лишние пустые страницы — проверить масштаб и разделители

Для регламентных операций полезно логировать факт записи в журнал регистрации: имя файла, время, пользователя. Это упрощает разбор ситуаций «файл не сформировался» при работе в фоновых заданиях.

Итог

Что важно запомнить

PDF создаётся методом Записать с типом ТипФайлаТабличногоДокумента.PDF. Контролируйте каталог, имя файла, настройки печати табличного документа и место выполнения кода — на сервере файл появится на сервере, а не у пользователя.

Частые вопросы

Можно ли сохранить в PDF без диалога выбора файла?

Да. Если путь к файлу задан программно и код выполняется там, где есть права на запись, диалог не требуется. Диалог нужен только когда пользователь сам выбирает место сохранения — тогда используют асинхронный диалог сохранения файла на клиенте.

Почему в PDF русский текст отображается квадратами?

Чаще всего на машине, где выполняется запись (особенно на сервере под Linux), не установлены нужные шрифты. Установите шрифты, используемые в макете, на сервер и перезапустите сервер 1С. Также проверьте, что в макете не применён шрифт, отсутствующий в системе.

Как сохранить в PDF сразу несколько документов одним файлом?

Штатного объединения PDF нет. Рабочий способ — вывести все печатные формы в один табличный документ, разделяя их горизонтальными разделителями страниц, и записать его одним вызовом Записать.

Работает ли метод в веб-клиенте?

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

Чем PDF отличается от сохранения в MXL?

MXL — внутренний формат табличного документа 1С, его можно открыть и отредактировать в конфигураторе или предприятии. PDF — конечный формат для просмотра и печати, его выбирают для отправки контрагентам и архива.

Как обработать ошибку записи, не прерывая обработку остальных документов?

Оберните вызов Записать в Попытка/Исключение внутри цикла по документам, запишите ошибку в журнал регистрации с указанием документа и продолжите цикл. Так один проблемный документ не остановит пакетное формирование.