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