В процессе разработки в среде 1С:Предприятие 8.3 часто возникает задача автоматизации выгрузки документов. Одной из наиболее востребованных функций является сохранение печатной формы (табличного документа) в формате PDF для последующей отправки по электронной почте или архивирования. В рамках данной статьи мы подробно разберем, как реализовать этот функционал программно, какие методы платформы использовать и на какие нюансы обратить внимание при работе на сервере и клиенте.
Основным инструментом для решения нашей задачи является встроенный метод Записать() объекта ТабличныйДокумент. Этот метод универсален и позволяет сохранять данные в различных форматах, включая PDF, Excel и HTML. Рассмотрим подробнее синтаксис и базовый пример использования.
Проанализируем ситуацию, когда у нас уже сформирован табличный документ (например, печатная форма счета или акта). Для его сохранения нам необходимо выполнить следующий код:
// Предположим, ТабДок — это уже сформированный ТабличныйДокумент
ПутьКФайлу = "C:\Temp\MyDocument.pdf";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Разберем по шагам, что происходит в этом фрагменте:
ПутьКФайлу, которая содержит полный путь в операционной системе, включая имя файла и расширение.Записать(), где первым параметром передаем путь, а вторым — системное перечисление ТипФайлаТабличногоДокумента.PDF. Это критически важный момент, так как именно этот параметр указывает платформе на необходимость конвертации в PDF.Часто формирование печатных форм происходит в серверных модулях. Здесь мы можем столкнуться с проблемой прав доступа. Выясним причину: когда код исполняется на сервере, 1С обращается к файловой системе от имени пользователя, под которым запущен агент службы 1С:Предприятия (обычно это USR1CV8). Если у этой учетной записи нет прав на запись в указанную папку, возникнет ошибка доступа.
Посмотрим на пример правильной организации серверного сохранения с использованием временных файлов, что является "лучшей практикой" разработки:
&НаСервере
Функция СохранитьПечатнуюФормуВоВременныйФайл(ИмяДокумента)
// Создаем табличный документ (или получаем его из функции печати)
ТабДок = СформироватьПечатнуюФорму(ИмяДокумента);
// Получаем путь во временном каталоге сервера
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
// Записываем файл
Попытка
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
Возврат ИмяФайла;
Исключение
ЗаписьЖурналаРегистрации("Ошибка сохранения PDF", УровеньЖурналаРегистрации.Ошибка,,, КраткоеПредставлениеОшибки(ОписаниеОшибки()));
ВызватьИсключение "Не удалось сохранить файл на сервере.";
КонецПопытки;
КонецФункции
В этом примере мы используем функцию ПолучитьИмяВременногоФайла(), которая гарантирует, что файл будет создан в доступной для службы 1С директории с уникальным именем. Это исключает конфликты имен при одновременной работе нескольких пользователей.
Просто вызвать метод записи иногда недостаточно. Чтобы PDF-документ выглядел профессионально и корректно отображался при печати, необходимо проанализировать настройки страницы табличного документа. Если таблица слишком широкая, она может "разрезаться" на несколько страниц в PDF.
Рассмотрим, как программно подогнать масштаб под ширину страницы:
ТабДок.АвтоМасштаб = Истина; // Автоматически масштабировать документ
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт; // Если форма широкая
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 10;
ТабДок.ПолеСверху = 10;
ТабДок.ПолеСнизу = 10;
Использование свойства АвтоМасштаб позволяет платформе самостоятельно вычислить коэффициент сжатия, чтобы все колонки уместились на одном листе по ширине. Это особенно важно для отчетов и сложных спецификаций.
Разберем ситуацию, когда пользователю необходимо выгрузить сразу пакет документов в отдельные PDF-файлы. В этом случае удобно использовать цикл и формировать уникальные имена файлов на основе номера или даты документа.
Пример цикла обработки:
Для Каждого СсылкаНаДокумент Из МассивСсылок Цикл
ТабДок = СформироватьПечатнуюФорму(СсылкаНаДокумент);
// Очищаем имя файла от недопустимых символов (/, \, :, *, ?, ", <, >, |)
БезопасныйНомер = СтрЗаменить(СсылкаНаДокумент.Номер, "/", "_");
ИмяФайла = "Счет_№_" + БезопасныйНомер + ".pdf";
ПолныйПуть = КаталогВыгрузки + "\" + ИмяФайла;
ТабДок.Записать(ПолныйПуть, ТипФайлаТабличногоДокумента.PDF);
КонецЦикла;
Важно помнить, что если вы работаете в веб-клиенте, прямое сохранение на локальный диск пользователя через Записать() невозможно из соображений безопасности браузера. В таком случае необходимо сначала сохранить файл на сервере, а затем передать его на клиент с помощью метода ПолучитьФайл().
Проанализируем основные проблемы, с которыми сталкиваются разработчики:
ТабличныйДокумент пуст (не содержит областей или строк), метод Записать() может выдать ошибку. Всегда проверяйте заполненность документа перед сохранением.Попытка...Исключение.Подводя итог, можно сказать, что механизм сохранения в PDF в 1С 8.3 реализован достаточно просто и надежно. Ключевым объектом является ТабличныйДокумент, а правильная настройка его свойств АвтоМасштаб и ОриентацияСтраницы гарантирует качественный результат выгрузки.