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

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

1С: как программно сохранить печатную форму в файл

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

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

Основа решения — метод Записать() объекта ТабличныйДокумент. Печатная форма в 1С почти всегда является табличным документом, а он умеет записывать себя в файл в нескольких форматах: MXL, PDF, XLSX, HTML, ODS, TXT и других. Всё, что требуется разработчику, — получить сформированный табличный документ и вызвать запись с нужным типом файла.

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

Как устроена печатная форма и почему её можно записать в файл

Любая печатная форма в 1С — счёт, накладная, акт, ТОРГ-12 — в момент формирования существует в памяти как объект встроенного языка ТабличныйДокумент. Это не картинка и не PDF, а внутренняя структура с ячейками, областями, оформлением и параметрами страниц. Именно поэтому её можно гибко преобразовать: записать в родной формат MXL, экспортировать в Excel, сконвертировать в PDF или HTML.

Метод Записать() принимает два ключевых параметра: полное имя файла и тип файла. Тип задаётся системным перечислением ТипФайлаТабличногоДокумента, например ТипФайлаТабличногоДокумента.PDF или ТипФайлаТабличногоДокумента.XLSX. Если тип не указать, используется формат MXL — он открывается только внутри 1С.

Важно понимать разницу между «сохранить табличный документ» и «напечатать». Печать отправляет форму на принтер, а Записать() создаёт файл на диске, который потом можно отправить по почте, приложить к документу или передать во внешнюю систему.

Минимальный пример: записать табличный документ в PDF

Базовый сценарий состоит из трёх шагов: сформировать табличный документ, указать путь к файлу, вызвать запись. Если у вас уже есть готовый табличный документ (например, сформированный в процедуре печати), код занимает несколько строк:

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

// ... заполнение ТабДок областями из макета ...

ИмяФайла = "C:\ПечатныеФормы\Счет_00123.pdf";

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

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

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

Как получить печатную форму документа программно

Через модуль менеджера объекта

В типовых конфигурациях (УТ, ERP, БП) формирование печатной формы вынесено в функции модуля менеджера документа, например Документы.СчетНаОплатуПокупателю. Обычно есть функция вида ПечатьСчетаНаОплату() или общая процедура Печать(), возвращающая табличный документ. Точное имя зависит от конфигурации — его можно найти, открыв модуль менеджера и поискав слово «Печать».

МассивОбъектов = Новый Массив;

МассивОбъектов.Добавить(СсылкаНаДокумент);

ТабДок = Документы.РеализацияТоваровУслуг.ПечатьТОРГ12(МассивОбъектов);

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

Через подсистему «Управление печатью» (БСП)

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

Идентификатор макета смотрят в команде печати объекта: в модуле менеджера в процедуре ДобавитьКомандыПечати указаны идентификаторы вроде «СчетЗаказ» или «ТОРГ12».

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

Выбор формата файла: PDF, XLSX, MXL и другие

Формат выбирают исходя из того, кто и как будет использовать файл. PDF подходит для отправки контрагенту: его нельзя случайно отредактировать, он выглядит одинаково везде. XLSX удобен, если получатель будет дальше обрабатывать данные в Excel. MXL нужен только для обмена между базами 1С. HTML годится для публикации, но верстка часто отличается от оригинала.

ФорматТипФайлаТабличногоДокументаКогда использоватьОграничения
PDFPDFОтправка клиенту, архив, ЭДО-подобные сценарииТочность шрифтов зависит от установленных в системе шрифтов
XLSXXLSXПередача данных для дальнейшей обработкиОформление переносится не полностью
MXLMXLОбмен между базами 1С, хранение внутри системыОткрывается только в 1С
HTMLHTMLПубликация на сайте, встраивание в письмоНеточная вёрстка, проблемы с переносами страниц
ODSODSОткрытие в LibreOffice/OpenOfficeРедко требуется, поддержка оформления ограничена

Для PDF есть дополнительная настройка через объект ПараметрыЗаписиPDF: можно задать уровень точности распознавания текста. Если PDF потом будет обрабатываться системой распознавания, стоит явно контролировать эти параметры, а не полагаться на значения по умолчанию.

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

PDF

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

XLSX

Подходит, если получатель будет работать с данными; теряется часть оформления и разметки страниц

MXL

Только для внутреннего обмена между базами 1С; внешний получатель файл не откроет

Запись файла на сервере и на клиенте

Ключевой нюанс — где выполняется код. В клиент-серверном варианте процедуры с директивой &НаСервере выполняются на сервере 1С, и путь вроде C:\Forms\ укажет на диск сервера, а не компьютера пользователя. Файл запишется, но пользователь его «не увидит» — типичная причина жалоб «код отработал, а файла нет».

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

Для регламентных заданий и фоновой обработки код всегда серверный: файл пишется на сервер или в сетевой каталог, доступный учётной записи, под которой работает служба сервера 1С. У этой учётной записи должны быть права на запись в целевую папку — проверьте это до отладки кода.

Массовое сохранение печатных форм

Частая прикладная задача — выгрузить печатные формы по списку документов: все счета за месяц, все акты по контрагенту. Решение строится циклом: выборка ссылок запросом, формирование табличного документа для каждой ссылки, запись в файл с уникальным именем.

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг

|ГДЕ Дата МЕЖДУ &Начало И &Конец";

Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДатаСеанса()));

Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДатаСеанса()));

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Массив = Новый Массив;

Массив.Добавить(Выборка.Ссылка);

ТабДок = Документы.РеализацияТоваровУслуг.ПечатьТОРГ12(Массив);

ИмяФайла = "D:\Архив\ТОРГ12_" + Выборка.Ссылка.Номер + ".pdf";

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

КонецЦикла;

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

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

Типичные ошибки
01
Запись на сервере в путь C:\ и поиск файла на компьютере пользователя — файл создан на сервере
02
Использование номера документа в имени файла без очистки — символы / \ : ломают запись
03
Отсутствие целевого каталога — Записать() не создаёт папки и выдаёт ошибку
04
Вызов несуществующей функции печати из другой конфигурации — имена процедур различаются между УТ, ERP и БП
05
Молчаливая перезапись уже отправленных файлов при повторном запуске обработки

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

После записи убедитесь, что файл реально создан и корректен. Минимум — проверить существование файла объектом Файл и его размер: нулевой размер означает проблему формирования. Для PDF полезно открыть файл и визуально сравнить с печатной формой, которую показывает конфигурация пользователю.

Если табличный документ пустой (печатная форма не сформировалась, например документ не проведён), Записать() создаст пустой файл без ошибки. Проверяйте высоту таблицы (ТабДок.ВысотаТаблицы) до записи.

При отладке на сервере временно пишите файл в заведомо доступный каталог вроде каталога временных файлов сервера, а права и пути настраивайте после того, как логика формирования подтверждена.

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

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

Файл существует по указанному пути
Норма

Файл найден, размер больше нуля

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

Файла нет или размер 0 байт — проверяйте путь, права и заполненность ТабДок

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

Открывается и совпадает с формой в интерфейсе 1С

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

Пустые страницы или обрезанная форма — проблема в формировании ТабДок

Имя файла
Норма

Уникально, без недопустимых символов

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

Ошибка записи или перезапись чужого файла

Часто задаваемые вопросы

Можно ли сохранить печатную форму в файл без открытия окна предпросмотра?

Да. Метод Записать() работает без какого-либо интерфейса: достаточно сформировать табличный документ в коде и вызвать запись. Именно так строятся регламентные задания и массовые рассылки.

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

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

Почему в PDF пропадают или заменяются шрифты?

Конвертация в PDF использует шрифты, установленные в операционной системе того компьютера, где выполняется код. Если на сервере нет нужного шрифта, он подменяется. Установите на сервер те же шрифты, что используются в макете печатной формы.

Как сохранить файл в сетевую папку?

Укажите UNC-путь вида \\Сервер\ОбщаяПапка\файл.pdf. Учётная запись, под которой работает сервер 1С (или пользователь при клиентской записи), должна иметь права записи в эту папку — это самая частая причина ошибок доступа.

Можно ли программно сохранить форму из внешней печатной формы?

Да, если обработка внешней печатной формы возвращает табличный документ (стандартный интерфейс БСП — функция Печать в модуле обработки). Получите его вызовом этой функции и запишите обычным методом Записать().

Что делать, если функция печати в моей конфигурации называется иначе?

Откройте модуль менеджера нужного документа в конфигураторе и найдите экспортные процедуры и функции со словом «Печать». В конфигурациях на БСП альтернатива — универсальный вызов УправлениеПечатью.СформироватьПечатныеФормы() с идентификатором макета из команды печати.

Итог

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

Печатная форма — это ТабличныйДокумент, и сохранить её в файл можно одним вызовом Записать(ИмяФайла, ТипФайла). Главные подводные камни: различие серверного и клиентского выполнения, права на каталог, очистка имени файла от недопустимых символов и проверка, что табличный документ не пуст перед записью.