В процессе разработки механизмов автоматизации часто возникает задача автоматической отправки документов контрагентам сразу после их проведения. Одной из самых распространенных проблем является ситуация, когда программный код формирования письма отрабатывает, но вложение не доходит до адресата или система выдает ошибку «Файл не найден». Рассмотрим подробно, как правильно подготовить печатную форму, сохранить ее на диск в формате PDF и корректно прикрепить к электронному письму.
Разберем типичную ситуацию. Программист подготавливает объект ТабличныйДокумент, определяет путь во временном каталоге, но забывает выполнить фактическую запись данных на диск. Объект ИнтернетПочтовоеСообщение при добавлении вложения ищет физический файл по указанному пути. Если метод Записать() не был вызван, вложение не будет сформировано, и метод Послать() выдаст ошибку или отправит пустое письмо. Посмотрим на алгоритм исправления этой ситуации.
Прежде всего, нам необходимо получить печатную форму документа. В типовых и самописных конфигурациях для этого обычно используются функции, возвращающие ТабличныйДокумент. Проанализируем пример получения такой формы:
// Вызываем функцию формирования печатной формы
ТабДок = СформироватьПечатнуюФормуСчетФактура(ДокСсылка);
// Обязательно проверяем, не пустой ли документ получился
Если ТабДок.ВысотаТаблицы = 0 Тогда
Сообщить("Печатная форма пуста, отправка отменена.");
Возврат;
КонецЕсли;
Важно помнить, что перед сохранением в PDF стоит настроить параметры печати, чтобы документ выглядел корректно у получателя. Рекомендуется установить свойство АвтоМасштаб в значение Истина, чтобы содержимое «вписалось» в лист А4.
Это ключевой этап, который часто упускают. Мы должны физически создать файл в файловой системе сервера или клиента (в зависимости от того, где выполняется код). Для этого используется метод Записать() объекта ТабличныйДокумент. Выясним, какие параметры необходимы для этого метода.
// Формируем уникальное имя файла во временном каталоге
ИмяФайла = КаталогВременныхФайлов() + "СчетНаОплату_" + СтрЗаменить(Строка(ДокСсылка.Номер), "/", "_") + ".pdf";
// Сохраняем табличный документ на диск
// Первый параметр — путь к файлу, второй — тип файла PDF
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
Обратите внимание: если вы используете платформу 1С:Предприятие 8.3 на сервере под управлением Linux, убедитесь, что в системе установлены шрифты Microsoft (пакет msttcorefonts), иначе PDF-файл может сформироваться некорректно (пустым или с иероглифами).
Теперь, когда файл физически существует на диске, мы можем приступить к созданию почтового сообщения. Проанализируем ситуацию настройки профиля для работы через протокол SMTP (например, для Mail.ru или Gmail).
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПользовательSMTP = "your_email@mail.ru";
Профиль.ПарольSMTP = "your_app_password"; // Рекомендуется использовать пароли приложений
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Отправитель = "your_email@mail.ru";
Письмо.Тема = "Документы по сделке";
Письмо.Получатели.Добавить("client@example.com");
// Добавляем текст письма
Текст = Письмо.Тексты.Добавить("Здравствуйте! Во вложении ваш счет.");
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.Текст;
Теперь мы добавляем созданный ранее PDF-файл в коллекцию Вложения объекта сообщения. После успешной отправки крайне важно удалить временный файл, чтобы не засорять дисковое пространство сервера.
// Прикрепляем файл по пути, который использовали при записи
Письмо.Вложения.Добавить(ИмяФайла);
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
Почта.Отключиться();
// Обязательно удаляем временный файл после отправки
Попытка
УдалитьФайлы(ИмяФайла);
Исключение
// Файл может быть заблокирован системой, обрабатываем ошибку без прерывания
КонецПопытки;
Рассмотрим важный архитектурный момент. В исходном вопросе автор пытался вставить код отправки прямо в процедуру ОбработкаПроведения. Мы крайне не рекомендуем так делать по нескольким причинам:
Правильным решением будет использование Дополнительных обработок, подсистемы Очередь сообщений из БСП или фоновых заданий, которые инициируют отправку сразу после успешной записи документа в базу.
Если ваша конфигурация построена на базе БСП (УТ 11, БП 3.0, ERP), мы рекомендуем использовать готовые методы подсистемы «Работа с почтой». Это позволит избежать ручного описания профилей и повысит надежность кода.
// Пример использования БСП для формирования вложения
ПараметрыОтправки = Новый Структура;
ПараметрыОтправки.Вставить("Кому", "client@example.com");
ПараметрыОтправки.Вставить("Тема", "Счет на оплату");
ПараметрыОтправки.Вставить("Текст", "Добрый день! Файл во вложении.");
// Подготовка вложения (БСП сама может сформировать PDF)
Вложение = Новый Структура;
Вложение.Вставить("Псевдоним", "Счет.pdf");
Вложение.Вставить("Данные", ТабДок.ПолучитьДвоичныеДанные()); // Современный метод получения данных PDF
МассивВложений = Новый Массив;
МассивВложений.Добавить(Вложение);
ПараметрыОтправки.Вставить("Вложения", МассивВложений);
РаботаСПочтой.ОтправитьПочтовоеСообщение(Объект.УчетнаяЗапись, ПараметрыОтправки);
Подведем итог: для успешной отправки PDF-вложения необходимо убедиться, что ТабличныйДокумент корректно сформирован, записан на диск методом Записать() с типом ТипФайлаТабличногоДокумента.PDF, и путь к этому файлу передан в объект сообщения. Соблюдение этих простых правил обеспечит стабильную работу вашего почтового модуля.