В современной практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача автоматизации документооборота. Одной из самых востребованных функций является автоматическое формирование печатной формы документа и её последующее сохранение в файл формата PDF для отправки по электронной почте или архивации. В данной статье мы разберем по шагам, как реализовать этот механизм, проанализируем возможные трудности и изучим примеры кода для различных ситуаций.
Для начала проанализируем ситуацию: любая печатная форма в 1С базируется на объекте ТабличныйДокумент. Чтобы программно получить заполненный документ, нам необходимо обратиться к менеджеру объекта (например, документа или справочника) и вызвать экспортную процедуру печати. Рассмотрим стандартный подход, который используется в большинстве современных конфигураций.
Выясним причину, почему важно выполнять эти действия на стороне сервера. Работа с файловой системой и объектами метаданных напрямую связана с серверными вызовами, особенно если мы планируем сохранять файл в общую сетевую папку или временное хранилище сервера.
Если ваша задача — быстро сохранить результат работы в файл, воспользуемся методом Записать() объекта ТабличныйДокумент. Посмотрим на пример кода, который выполняет эту операцию:
// Создаем объект Табличный документ
ТабДок = Новый ТабличныйДокумент;
// Вызываем процедуру печати из менеджера документа
// ДокументОбъект - ссылка на конкретный документ в базе
Менеджер = Документы.РеализацияТоваровУслуг;
Менеджер.Печать(МассивСсылок, КоллекцияПечатныхФорм, ТабДок, ОбъектыПечати);
// Указываем имя файла и путь, куда он будет сохранен
ПутьКФайлу = "C:\Temp\Invoice_" + Строка(ДокументСсылка.Номер) + ".pdf";
// Сохраняем табличный документ в формате PDF
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
В данном примере мы используем системное перечисление ТипФайлаТабличногоДокумента.PDF. Это критически важный параметр, который указывает платформе на необходимость конвертации внутреннего формата 1С в кроссплатформенный PDF.
Если вы работаете в типовой конфигурации (например, 1С:ERP, 1С:Управление торговлей или 1С:Бухгалтерия), рекомендуется использовать механизмы БСП. Это обеспечит более стабильную работу и соблюдение прав доступа. Рассмотрим, как это сделать через подсистему УправлениеПечатью.
Проанализируем алгоритм действий при использовании БСП:
УправлениеПечатью.СформироватьПечатныеФормыДляТиражирования.
ПараметрыПечати = Новый Структура;
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ИНВОЙС");
ОбъектыПечати = Новый СписокЗначений;
УправлениеПечатью.СформироватьПечатныеФормыДляТиражирования(
"Документ.РеализацияТоваровУслуг",
"ИНВОЙС",
МассивСсылок,
ПараметрыПечати,
КоллекцияПечатныхФорм,
ОбъектыПечати
);
СтрокаПечатнойФормы = КоллекцияПечатныхФорм.Найти("ИНВОЙС", "ИмяВТаблице");
Если СтрокаПечатнойФормы <> Неопределено Тогда
ТабДок = СтрокаПечатнойФормы.ТабличныйДокумент;
ТабДок.Записать("D:\Reports\Order.pdf", ТипФайлаТабличногоДокумента.PDF);
КонецЕсли;
Рассмотрим подробнее важные моменты, которые часто упускают из виду программисты при реализации данной задачи. Выясним причину возможных ошибок, таких как отсутствие прав доступа или пустой файл.
Во-первых, если код выполняется на сервере (например, в регламентном задании), убедитесь, что у пользователя, под которым запущен агент службы 1C:Enterprise, есть права на запись в целевую папку. Если прав недостаточно, система выдаст ошибку доступа.
Во-вторых, стоит обратить внимание на шрифты. При сохранении в PDF на серверах под управлением Linux необходимо, чтобы в системе были установлены Microsoft Core Fonts, иначе текст в PDF может отображаться некорректно или "кракозябрами".
В-третьих, разберем ситуацию, когда печатная форма должна содержать картинки (логотипы или печати). Чтобы они корректно попали в PDF, убедитесь, что в свойствах рисунка в макете установлено свойство ВыводитьНаПечать.
Часто нам не нужно сохранять файл на физический диск сервера, а требуется передать его на клиент или прикрепить к электронному письму. В этом случае мы используем временные файлы и хранилище. Посмотрим на пример:
// Получаем имя временного файла на сервере
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
// Записываем документ во временный файл
ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
// Помещаем файл во временное хранилище для передачи на клиент
АдресФайлаВоХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла));
// Удаляем временный файл после использования, чтобы не засорять диск
УдалитьФайлы(ИмяФайла);
Этот метод является наиболее безопасным и чистым с точки зрения администрирования системы, так как 1С сама очистит временные папки через некоторое время, а мы не создаем лишних зависимостей от путей на диске C: или D:.
Мы проанализировали основные способы программного формирования и сохранения документов в формат PDF. Помните, что выбор метода зависит от вашей конфигурации: для самописных решений подойдет прямой вызов Записать(), а для типовых на базе БСП лучше использовать стандартные программные интерфейсы. Надеемся, что предложенные примеры помогут вам эффективно решить поставленные задачи автоматизации.