Разработка и Конфигурация · 10 мин
Как программно сохранить табличный документ в PDF в 1С
Как программно сохранить табличный документ в PDF в 1С: метод Записать, ТипФайлаТабличногоДокумента.PDF, настройки печати и типичные ошибки.
Задача сохранить табличный документ в PDF возникает постоянно: отправка счетов и актов по почте, выгрузка отчётов для руководства, архив печатных форм. Во встроенном языке 1С это решается одним методом — Записать() с указанием типа файла PDF, без внешних компонент и виртуальных принтеров.
Метод работает и на клиенте, и на сервере, поддерживается в тонком, веб- и толстом клиенте. Однако у него есть нюансы: кодировка имён файлов, разрешения на файловую систему, поведение в фоновых заданиях и особенности веб-клиента. Ниже разобраны рабочие примеры кода, типовые сценарии и ошибки, из-за которых файл не создаётся или создаётся пустым.
Базовый синтаксис метода Записать
Объект типа «ТабличныйДокумент» имеет метод Записать(), который принимает имя файла и тип файла. Для PDF используется значение системного перечисления ТипФайлаТабличногоДокумента.PDF.
Минимальный рабочий пример выглядит так:
ТабДок = Новый ТабличныйДокумент;
// ... заполнение табличного документа ...
ТабДок.Записать("C:\Temp\Счет.pdf", ТипФайлаТабличногоДокумента.PDF);
Метод возвращает не результат выполнения, а вызывает исключение при ошибке, поэтому в прикладном коде вызов стоит оборачивать в Попытка ... Исключение ... КонецПопытки. Это особенно важно при записи на сетевые диски и в каталоги, где у пользователя может не быть прав.
Обратите внимание: если каталог, указанный в пути, не существует, метод завершится ошибкой — платформа не создаёт промежуточные папки автоматически. Перед записью проверяйте существование каталога через объект Файл и при необходимости создавайте его методом СоздатьКаталог().
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);Полный пример: от макета до готового PDF
Типовой сценарий включает три этапа: получение макета, заполнение табличного документа и запись в файл. Ниже пример для печатной формы документа.
Процедура СохранитьСчетВPDF(ДокументСсылка) Экспорт
ТабДок = Новый ТабличныйДокумент;
Макет = Документы.СчетНаОплату.ПолучитьМакет("Счет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.Номер = ДокументСсылка.Номер;
ТабДок.Вывести(ОбластьШапка);
// ... вывод остальных областей ...
ИмяФайла = КаталогВременныхФайлов() + "Счет_"
+ СтрЗаменить(ДокументСсылка.Номер, "/", "_") + ".pdf";
Попытка
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
Исключение
ЗаписьЖурналаРегистрации("Сохранение PDF",
УровеньЖурналаРегистрации.Ошибка, , ,
ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Здесь используется КаталогВременныхФайлов() — это безопасный вариант, потому что каталог гарантированно существует и доступен на запись и на клиенте, и на сервере. Жёстко прописывать пути вроде C:\Temp не стоит: на сервере 1С этой папки может не быть или у служебной учётной записи не окажется прав на неё.
Имя файла формируйте без недопустимых символов. Номера документов часто содержат слэши, двоеточия и другие знаки, которые в имени файла запрещены — заменяйте их через СтрЗаменить() перед записью.
Параметры вывода и качество PDF
Качество итогового PDF определяется настройками самого табличного документа до вызова Записать(). Прежде всего проверьте свойства АвтоМасштаб, МасштабПечати, ОриентацияСтраницы и поля страницы — PDF формируется по тем же правилам, что и печать.
Если документ при печати умещается на одну страницу, а в PDF разъезжается на две, почти всегда причина в масштабе или в ширине колонок, выходящей за область печати. Установите ТабДок.АвтоМасштаб = Истина или задайте масштаб явно и проверьте результат.
Дополнительные параметры вывода в PDF (например, точность шрифтов) передаются третьим параметром метода в виде структуры параметров записи PDF — в актуальных версиях платформы доступны настройки вроде параметров внедрения шрифтов. Если используете нестандартные шрифты, убедитесь, что они установлены на том компьютере, где выполняется код: при записи на сервере шрифты берутся с сервера, а не с клиентской машины.
Сохранение на клиенте, сервере и в фоновом задании
Место выполнения кода определяет, где физически появится файл. Если процедура выполняется НаСервере, PDF создаётся на сервере 1С, и пользователь его не увидит, пока файл не будет передан на клиент — например, через временное хранилище.
Типовая схема передачи выглядит так: на сервере файл записывается во временный каталог, затем помещается в хранилище как двоичные данные, а на клиенте сохраняется через ПолучитьФайл() или диалог сохранения. В тонком клиенте прямой записи в произвольный каталог пользователя лучше избегать — используйте асинхронные методы работы с файлами и расширение работы с файлами.
В фоновых заданиях метод Записать() с PDF работает, но есть ограничение: в фоне недоступен интерактивный контекст, поэтому все пути и права должны быть обеспечены заранее. Также на сервере под Linux убедитесь, что установлены шрифты — без них текст в PDF может отображаться некорректно.
- 1Сформируйте табличный документ и задайте параметры печати (масштаб, ориентацию, поля)
- 2Проверьте существование каталога назначения, при необходимости создайте его
- 3Очистите имя файла от недопустимых символов
- 4Вызовите Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF) в блоке Попытка/Исключение
- 5Проверьте, что файл создан и открывается, при серверном вызове передайте его клиенту через временное хранилище
Типичные ошибки и их устранение
Самая частая проблема — исключение «Ошибка доступа к файлу» или пустой результат. Причины обычно в правах на каталог, несуществующем пути или в том, что табличный документ на момент записи пуст.
Вторая группа ошибок связана с веб-клиентом: там прямая запись на диск пользователя невозможна без расширения работы с файлами и взаимодействия с пользователем. Для веб-клиента формируйте PDF на сервере и отдавайте пользователю через навигационную ссылку на временное хранилище.
Ещё одна ловушка — запись в файл, который уже открыт в другой программе (например, пользователь просматривает прошлую версию в PDF-ридере). В Windows это приводит к ошибке доступа. Решение — генерировать уникальные имена файлов или предупреждать пользователя о необходимости закрыть документ.
Альтернативы и смежные способы
Метод Записать() поддерживает и другие форматы: XLSX, MXL, HTML, ODS, TXT. Если цель — не архив, а обмен данными, иногда правильнее выгружать в Excel. Для пакетной отправки по почте PDF-файл удобно сразу прикладывать к письму через объект ИнтернетПочтовоеСообщение, не сохраняя его пользователю на диск.
Сравнение вариантов
Штатный способ, работает везде без внешних компонент; ограничение — настройки вывода задаются через свойства табличного документа
Подходит как ручной обходной путь для пользователя, но не для программной автоматизации на сервере
Оправдано, если нужен редактируемый архив форм; требует отдельного этапа конвертации в PDF
Если требуется объединить несколько табличных документов в один PDF, штатного метода «склейки» нет. Практические варианты: вывести все разделы в один табличный документ с разрывами страниц (ВывестиГоризонтальныйРазделительСтраниц()) и записать его одним файлом — это самый простой и надёжный путь.
Проверка результата
После записи убедитесь, что файл реально создан и не пуст. Программно это делается через объект Файл: проверьте Существует() и размер — PDF нулевого размера означает сбой записи.
Как проверить результат
Файл существует по указанному пути, размер больше нуля
Файл отсутствует или размер 0 байт
Документ открывается, текст и таблицы совпадают с печатной формой
Пустые страницы, обрезанные колонки, искажённые шрифты
Совпадает с предварительным просмотром печати
Лишние пустые страницы — проверить масштаб и разделители
Для регламентных операций полезно логировать факт записи в журнал регистрации: имя файла, время, пользователя. Это упрощает разбор ситуаций «файл не сформировался» при работе в фоновых заданиях.
Что важно запомнить
PDF создаётся методом Записать с типом ТипФайлаТабличногоДокумента.PDF. Контролируйте каталог, имя файла, настройки печати табличного документа и место выполнения кода — на сервере файл появится на сервере, а не у пользователя.
Частые вопросы
Можно ли сохранить в PDF без диалога выбора файла?
Да. Если путь к файлу задан программно и код выполняется там, где есть права на запись, диалог не требуется. Диалог нужен только когда пользователь сам выбирает место сохранения — тогда используют асинхронный диалог сохранения файла на клиенте.
Почему в PDF русский текст отображается квадратами?
Чаще всего на машине, где выполняется запись (особенно на сервере под Linux), не установлены нужные шрифты. Установите шрифты, используемые в макете, на сервер и перезапустите сервер 1С. Также проверьте, что в макете не применён шрифт, отсутствующий в системе.
Как сохранить в PDF сразу несколько документов одним файлом?
Штатного объединения PDF нет. Рабочий способ — вывести все печатные формы в один табличный документ, разделяя их горизонтальными разделителями страниц, и записать его одним вызовом Записать.
Работает ли метод в веб-клиенте?
Запись напрямую на диск пользователя из веб-клиента ограничена. Правильный подход — сформировать PDF на сервере, поместить двоичные данные во временное хранилище и передать пользователю ссылку для скачивания.
Чем PDF отличается от сохранения в MXL?
MXL — внутренний формат табличного документа 1С, его можно открыть и отредактировать в конфигураторе или предприятии. PDF — конечный формат для просмотра и печати, его выбирают для отправки контрагентам и архива.
Как обработать ошибку записи, не прерывая обработку остальных документов?
Оберните вызов Записать в Попытка/Исключение внутри цикла по документам, запишите ошибку в журнал регистрации с указанием документа и продолжите цикл. Так один проблемный документ не остановит пакетное формирование.