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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике автоматизации бизнес-процессов часто возникает задача не просто сформировать печатную форму (счет, накладную или отчет), но и оперативно доставить её контрагенту. Ручное сохранение файла и отправка через почтовый клиент отнимает время сотрудников. Рассмотрим, как автоматизировать этот процесс, используя встроенные возможности платформы 1С:Предприятие 8.3.

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

Этап 1: Программное сохранение Табличного документа в PDF

Для начала нам необходимо получить сам объект табличного документа. Обычно он формируется при печати документов или отчетов. Допустим, у нас уже есть сформированный табличный документ, который хранится в переменной ТабДок.

Для сохранения файла на диск используется метод Записать(). Давайте посмотрим, как правильно использовать этот метод для экспорта в PDF.

Важные параметры метода Записать:

  1. ИмяФайла — полный путь к файлу на диске, куда будет сохранен документ.
  2. ТипФайлаТабличногоДокумента — системное перечисление, определяющее формат. Нам понадобится значение PDF.

Рассмотрим пример кода, который создает временный файл и сохраняет в него наш табличный документ:


// Получаем имя временного файла с расширением pdf
ИмяФайлаPDF = ПолучитьИмяВременногоФайла("pdf");

// Предполагаем, что переменная ТабДок уже содержит сформированный документ
// Установим параметры печати, чтобы PDF выглядел корректно (по ширине страницы)
ТабДок.АвтоМасштаб = Истина;
ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Портрет;

// Выполняем сохранение
Попытка
    ТабДок.Записать(ИмяФайлаPDF, ТипФайлаТабличногоДокумента.PDF);
    Сообщить("Файл успешно сохранен: " + ИмяФайлаPDF);
Исключение
    Сообщить("Ошибка при сохранении файла: " + ОписаниеОшибки());
КонецПопытки;

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

Этап 2: Настройка почтового профиля

Чтобы 1С могла отправлять письма, необходимо настроить подключение к почтовому серверу (SMTP). Для этого используется объект ИнтернетПочтовыйПрофиль. Давайте разберем, какие свойства этого объекта критически важны для успешного соединения.

Большинство современных почтовых сервисов (Yandex, Mail.ru, Gmail) требуют использования защищенного соединения (SSL). Рассмотрим настройку профиля с учетом этого требования.


Функция СоздатьПрофильПочты()
    
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    
    // Адрес SMTP сервера (например, smtp.yandex.ru, smtp.mail.ru)
    Профиль.АдресСервераSMTP = "smtp.yandex.ru"; 
    
    // Порт SMTP (обычно 465 для SSL или 587 для TLS)
    Профиль.ПортSMTP = 465;
    
    // Пользователь и пароль
    Профиль.ПользовательSMTP = "robot@mycompany.ru";
    // Внимание: для многих сервисов здесь нужен не пароль от почты, а "Пароль приложений"!
    Профиль.ПарольSMTP = "super_secure_app_password"; 
    
    // Настройки аутентификации
    Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
    
    // Включение защищенного соединения (SSL)
    Профиль.ИспользоватьSSLSMTP = Истина;
    
    // Таймаут соединения в секундах (чтобы 1С не "висела" вечно при проблемах с сетью)
    Профиль.Таймаут = 30;
    
    Возврат Профиль;

КонецФункции

Нюанс с паролями: Если вы используете публичные почтовые сервисы, обязательно проверьте настройки безопасности вашего почтового ящика. Часто требуется включить двухфакторную аутентификацию и сгенерировать специальный "Пароль приложения" для 1С, так как обычный вход по паролю может быть заблокирован.

Этап 3: Создание письма и вложение файла

Теперь, когда у нас есть сохраненный PDF-файл и настроенный профиль, соберем всё вместе. Создадим объект ИнтернетПочтовоеСообщение.

В этом объекте нам нужно заполнить:

  1. Тему и Текст письма.
  2. Получателя (кому отправляем).
  3. Вложение (наш PDF файл).

Рассмотрим процедуру отправки:


Процедура ОтправитьПечатнуюФормуПоПочте(ТабДок, АдресПолучателя)
    
    // 1. Сохраняем файл (как рассматривали выше)
    ИмяФайлаВложения = ПолучитьИмяВременногоФайла("pdf");
    ТабДок.Записать(ИмяФайлаВложения, ТипФайлаТабличногоДокумента.PDF);
    
    // 2. Подготавливаем письмо
    Письмо = Новый ИнтернетПочтовоеСообщение;
    Письмо.Тема = "Счет на оплату от ООО ""Ромашка""";
    
    // Создаем тело письма (можно использовать простой текст или HTML)
    ТекстПисьма = Письмо.Тексты.Добавить("Добрый день! Во вложении ваш счет.");
    ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
    
    // Добавляем получателя
    Письмо.Получатели.Добавить(АдресПолучателя);
    Письмо.Отправитель.Адрес = "robot@mycompany.ru";
    Письмо.Отправитель.ОтображаемоеИмя = "Робот рассылки счетов";
    
    // 3. Прикрепляем файл
    // Конструктор ДвоичныеДанные читает файл с диска
    ДанныеФайла = Новый ДвоичныеДанные(ИмяФайлаВложения);
    
    // Добавляем вложение. Третий параметр - имя файла, которое увидит получатель
    Вложение = Письмо.Вложения.Добавить(ДанныеФайла, "СчетНаОплату.pdf");
    
    // 4. Отправляем
    Профиль = СоздатьПрофильПочты();
    Почта = Новый ИнтернетПочта;
    
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Письмо);
        Почта.Отключиться();
        Сообщить("Письмо успешно отправлено на " + АдресПолучателя);
    Исключение
        Сообщить("Не удалось отправить письмо: " + ОписаниеОшибки());
        // Обязательно отключаемся даже в случае ошибки, если соединение было установлено
        Если Почта.СостояниеПочтовогоСоединения <> СостояниеПочтовогоСоединения.Отключено Тогда
            Почта.Отключиться();
        КонецЕсли;
    КонецПопытки;
    
    // 5. Удаляем временный файл, чтобы не засорять диск
    УдалитьФайлы(ИмяФайлаВложения);

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

Разберем важные моменты реализации

Давайте проанализируем ключевые детали кода, которые обеспечивают стабильную работу механизма.

Работа с временными файлами

Мы используем функцию ПолучитьИмяВременногоФайла. Это критически важно, особенно если код выполняется на сервере, где у нас может не быть прав писать в корень диска C: или в другие защищенные папки. Временная папка пользователя (или сервера 1С) всегда доступна для записи.

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

Обработка исключений при работе с сетью

В блоке работы с объектом ИнтернетПочта мы обернули все действия в Попытка. Сетевые операции — это всегда источник потенциальных ошибок: пропал интернет, сервер отклонил пароль, превышен лимит отправки. Программа не должна "падать" с критической ошибкой, она должна корректно сообщить пользователю о проблеме и продолжить работу.

Работа на Сервере и Клиенте

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

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

Расширенные возможности: HTML в теле письма

Иногда простого текста недостаточно. Если вы хотите отправить красиво оформленное письмо с логотипом и подписью, используйте тип текста HTML. Давайте посмотрим, как изменить формирование тела письма:


ТекстHTML = "
|<html>
|<body>
|   <h2>Здравствуйте!</h2>
|   <p>Направляем вам счет за услуги.</p>
|   <p style='color: gray;'>С уважением,<br>Ваша компания</p>
|</body>
|</html>";

ТекстПисьма = Письмо.Тексты.Добавить(ТекстHTML);
ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;

Заключение

Мы рассмотрели полный цикл автоматизации отправки печатных форм: от сохранения макета в PDF до отправки его через SMTP-сервер. Использование встроенных объектов ТабличныйДокумент и ИнтернетПочта позволяет реализовать этот функционал без использования внешних компонент и дополнительных библиотек, что значительно упрощает поддержку кода.

Используйте этот подход для рассылки счетов, прайс-листов, расчетных листков сотрудникам и любых других отчетов, которые генерирует ваша система 1С.

← На главную