В процессе автоматизации бизнес-процессов часто возникает задача автоматической рассылки печатных форм (счетов, актов или отчетов) клиентам или сотрудникам. В системе 1С:Предприятие 8.3 для этого предусмотрены мощные встроенные средства работы с файлами и электронной почтой. В данной статье мы проанализируем ситуацию, когда необходимо без участия пользователя сформировать ТабличныйДокумент, сохранить его в формате PDF на сервере и отправить через системную учетную запись почты.
Первым делом нам необходимо подготовить сам документ. Как правило, это результат выполнения запроса или сформированная печатная форма. Разберем по шагам процесс конвертации данных в формат PDF. Основным методом здесь является Записать(), который поддерживает различные типы файлов.
Рассмотрим пример кода, который выполняет сохранение сформированного документа во временный файл:
// Инициализируем табличный документ (например, из макета)
ТабДок = Новый ТабличныйДокумент;
// ... тут должен быть код заполнения ТабДок данными ...
// Получаем имя временного файла во временном хранилище ОС
ПутьКФайлу = ПолучитьИмяВременногоФайла("pdf");
// Сохраняем табличный документ в PDF
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
Важно помнить, что при работе в клиент-серверном варианте, код сохранения должен выполняться на стороне сервера, чтобы иметь доступ к файловой системе сервера или использовать механизмы временных хранилищ для передачи файла на клиент.
Чтобы отправить письмо, системе нужно знать параметры сервера исходящей почты (SMTP). В 1С для этого используется объект ИнтернетПочтовыйПрофиль. Выясним причину, по которой часто возникают ошибки при отправке: обычно это неверно указанные порты или отсутствие флага использования защищенного соединения (SSL).
Проанализируем пример создания профиля для типового почтового сервиса:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.Пользователь = "sender@mail.ru";
Профиль.Пароль = "ваш_пароль_приложения";
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ТолькоЛогинSMTP = Истина;
Обратите внимание, что современные почтовые сервисы требуют использования специальных "паролей приложений" вместо обычных паролей от почтового ящика.
Теперь, когда у нас есть файл и настройки подключения, нам нужно создать само электронное письмо. Объект ИнтернетПочтовоеСообщение позволяет задать тему, текст, получателей и, что самое важное в нашей задаче, вложения.
Посмотрим на пример подготовки сообщения:
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Ваш счет на оплату";
Письмо.Отправитель = "sender@mail.ru";
Письмо.Получатели.Добавить("client@example.com");
// Создаем текст письма
ТекстПисьма = Письмо.Тексты.Добавить();
ТекстПисьма.Текст = "Добрый день! Во вложении ваш счет в формате PDF.";
ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
// Добавляем PDF файл во вложения
Письмо.Вложения.Добавить(ПутьКФайлу, "СчетНаОплату.pdf");
В методе Вложения.Добавить() первым параметром передается полный путь к файлу на диске, а вторым — имя файла, которое увидит получатель в письме.
Заключительный этап — это установка соединения с сервером и непосредственная передача данных. Для этого используется объект ИнтернетПочта. Рассмотрим подробнее процедуру отправки:
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Сообщить("Письмо успешно отправлено!");
Исключение
// В случае ошибки выводим описание проблемы
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
Если Почта.Подключена() Тогда
Почта.Отключиться();
КонецЕсли;
КонецПопытки;
Использование блока Попытка...Исключение является критически важным, так как проблемы с интернет-соединением или доступностью почтового сервера могут возникнуть в любой момент. Также не забывайте удалять временный файл с диска после отправки с помощью команды УдалитьФайлы(ПутьКФайлу), чтобы не засорять серверное пространство.
При реализации данного механизма проанализируем ситуацию с правами доступа. У пользователя, под которым работает служба 1С (в серверном варианте), должны быть права на запись в папку временных файлов. Кроме того:
ТабДок.Записать() можно управлять качеством и защитой файла, используя дополнительные параметры метода.Таким образом, мы рассмотрели полный цикл программной работы с печатными формами и почтовыми сообщениями, что позволяет полностью автоматизировать документооборот с внешними контрагентами.