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