Как программно сформировать и отправить письмо с печатной формой в формате PDF из 1С 8.3

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

В процессе автоматизации бизнес-процессов часто возникает задача автоматической рассылки документов контрагентам. Это может быть отправка счетов на оплату, актов сверки или отчетов для руководства. В данной статье мы проанализируем ситуацию, когда необходимо программно сформировать печатную форму, сохранить ее во временный файл и отправить получателю через встроенные механизмы 1С.

Шаг 1. Формирование и сохранение печатной формы в PDF

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

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


// Получаем печатную форму документа (функция Печать возвращает ТабличныйДокумент)
ТабДок = Документы.СчетНаОплатуПокупателю.Печать(СсылкаНаДокумент);

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

// Сохраняем табличный документ в файл PDF
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

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

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

Для взаимодействия с почтовым сервером в 1С используется объект ИнтернетПочтовыйПрофиль. Посмотрим на пример настройки профиля для работы с распространенными почтовыми сервисами. Обратите внимание, что современные серверы требуют использования защищенного соединения SSL.


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "your_email@yandex.ru";
Профиль.Пароль = "your_app_password"; // Используйте пароль приложения!
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ТолькоМетодAuthLogin = Истина;

Проанализируем ситуацию с безопасностью: большинство почтовых провайдеров (Yandex, Mail.ru, Gmail) больше не позволяют использовать основной пароль от почты для сторонних программ. Вам необходимо создать специальный "Пароль приложения" в настройках безопасности вашего почтового ящика, иначе попытка подключения завершится ошибкой аутентификации.

Шаг 3. Создание сообщения и добавление вложения

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


Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Счет на оплату №" + СсылкаНаДокумент.Номер;
Письмо.Отправитель.Адрес = "your_email@yandex.ru";
Письмо.Отправитель.ОтображаемоеИмя = "Наша Организация";

// Добавляем получателя
НовыйПолучатель = Письмо.Получатели.Добавить();
НовыйПолучатель.Адрес = "client_email@example.com";

// Текст письма
Текст = Письмо.Тексты.Добавить();
Текст.Текст = "Добрый день! Во вложении ваш счет на оплату.";
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;

// Добавляем вложение
Письмо.Вложения.Добавить(ИмяФайла, "Счет_" + СсылкаНаДокумент.Номер + ".pdf");

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

Шаг 4. Отправка письма через объект ИнтернетПочта

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


Почта = Новый ИнтернетПочта;

Попытка
    Почта.Подключиться(Профиль);
    Почта.Послать(Письмо);
    Сообщить("Письмо успешно отправлено!");
Исключение
    Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;

Почта.Отключиться();

// Удаляем временный файл после отправки
УдалитьФайлы(ИмяФайла);

Разберем по шагам завершающие действия:

  1. Всегда вызывайте метод Отключиться(), чтобы освободить ресурсы и корректно закрыть сессию с сервером.
  2. Используйте блок Попытка...Исключение, так как проблемы с интернетом или недоступность почтового сервера — частое явление.
  3. Не забывайте удалять временные файлы с помощью команды УдалитьФайлы(), чтобы не забивать дисковое пространство сервера лишним мусором.

Использование встроенных механизмов БСП (Библиотека Стандартных Подсистем)

Если ваша конфигурация построена на базе БСП (например, 1С:ERP, 1С:Управление торговлей или 1С:Бухгалтерия), процесс можно значительно упростить. В БСП предусмотрен механизм УправлениеЭлектроннойПочтой, который берет на себя большинство рутинных операций.

Проанализируем ситуацию использования БСП: в этом случае настройки почты хранятся в справочнике УчетныеЗаписиЭлектроннойПочты, а отправка выполняется одной строкой кода. Это позволяет пользователю самостоятельно менять пароли и настройки серверов в интерфейсе программы без привлечения программиста для правки кода.


// Пример для БСП
ПараметрыОтправки = Новый Структура;
ПараметрыОтправки.Вставить("Кому", "client@example.com");
ПараметрыОтправки.Вставить("Тема", "Счет на оплату");
ПараметрыОтправки.Вставить("Тело", "Здравствуйте! Направляем вам счет.");

Вложения = Новый СписокЗначений;
Вложения.Добавить(Новый Структура("Хранилище, Наименование", Новый ХранилищеЗначения(ДвоичныеДанныеФайла), "Счет.pdf"));
ПараметрыОтправки.Вставить("Вложения", Вложения);

РаботаСПочтой.ОтправитьПисьмо(УчетнаяЗапись, ПараметрыОтправки);

Таким образом, мы рассмотрели как низкоуровневый способ работы с объектами ИнтернетПочта, так и более современный подход с использованием БСП. Выбор метода зависит от ваших задач и используемой конфигурации.

← На главную