В практике программирования на платформе 1С:Предприятие часто возникает задача автоматической отправки документов контрагентам. Например, при проведении счета или накладной необходимо сразу же отправить сформированную печатную форму клиенту на электронную почту в формате Excel (XLSX). В этой статье мы подробно разберем, как реализовать этот функционал, рассмотрим примеры кода и обсудим важные архитектурные нюансы, чтобы избежать ошибок блокировок и транзакций.
Чтобы реализовать отправку письма с вложением, нам предстоит выполнить следующие шаги:
Давайте проанализируем каждый этап подробно.
Для взаимодействия с почтовыми серверами в 1С используется объект ИнтернетПочтовыйПрофиль. Именно в нем мы указываем адреса серверов, порты и данные для аутентификации. Рассмотрим универсальный пример настройки профиля, который подойдет для большинства популярных почтовых служб (Яндекс, Mail.ru, Google).
Важное замечание по безопасности: Современные почтовые сервисы часто блокируют доступ по обычному паролю от ящика при доступе из сторонних приложений. Для корректной работы вам, скорее всего, потребуется включить двухфакторную аутентификацию в настройках почтового аккаунта и сгенерировать специальный «Пароль приложения». Именно его нужно использовать в коде 1С.
Рассмотрим код настройки профиля:
Профиль = Новый ИнтернетПочтовыйПрофиль;
// Настройки SMTP (отправка почты)
Профиль.АдресСервераSMTP = "smtp.yandex.ru"; // или smtp.mail.ru, smtp.gmail.com
Профиль.ПортSMTP = 465; // Обычно 465 для SSL или 587 для TLS
Профиль.ПользовательSMTP = "vash_login@yandex.ru";
Профиль.ПарольSMTP = "ваш_пароль_приложения"; // Не основной пароль!
// Включение защищенного соединения (SSL)
// Без этого большинство серверов откажут в доступе
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
// Установка таймаута (в секундах), чтобы 1С не "висела" слишком долго при сбоях
Профиль.ВремяОжидания = 60;
Обратите внимание на использование свойства ИспользоватьSSLSMTP. Для порта 465 оно обязательно должно быть установлено в значение Истина.
У нас есть два пути работы с файлом вложения: сохранить его во временный файл на диске или работать с потоком в памяти. Использование потока в памяти (ПотокВПамяти) более элегантно, так как не требует прав на запись диска и последующего удаления мусорных файлов. Однако метод с временным файлом проще для отладки.
Разберем пример с использованием потока в памяти, так как это более современный подход.
// 1. Получаем макет и формируем табличный документ
ТабДок = Новый ТабличныйДокумент;
// ... (здесь идет ваш код заполнения параметрами и вывода областей) ...
// 2. Сохраняем ТабличныйДокумент в поток в формате XLSX
Поток = Новый ПотокВПамяти();
ТабДок.Записать(Поток, ТипФайлаТабличногоДокумента.XLSX);
// 3. Получаем двоичные данные для вложения
ДвоичныеДанныеФайла = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Если вы решите использовать временный файл, код будет выглядеть так:
ИмяФайла = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);
// Далее путь ИмяФайла передается во вложение
Теперь объединим все вместе. Мы создадим объект ИнтернетПочтовоеСообщение, добавим тему, текст и наше вложение, а затем отправим его через объект ИнтернетПочта.
Давайте посмотрим на полную процедуру отправки, которую мы можем разместить в общем модуле или модуле объекта:
Процедура ОтправитьПечатнуюФормуПоEmail(АдресПолучателя, ТемаПисьма, ТекстПисьма, ВложениеДанные, ИмяВложения)
// 1. Настраиваем профиль (как описано выше)
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "robot@mycompany.ru";
Профиль.ПарольSMTP = "app_password_123";
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
// 2. Создаем письмо
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = ТемаПисьма;
Письмо.Отправитель = "robot@mycompany.ru";
Письмо.ИмяОтправителя = "Робот 1С";
// Добавляем получателя
Письмо.Получатели.Добавить(АдресПолучателя);
// Добавляем текст (можно HTML или ПростойТекст)
Письмо.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);
// 3. Добавляем вложение
// Если переданы ДвоичныеДанные (из потока)
Если ВложениеДанные <> Неопределено Тогда
Письмо.Вложения.Добавить(ВложениеДанные, ИмяВложения);
КонецЕсли;
// 4. Подключаемся и отправляем
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Исключение
// Обязательно логируем ошибку
ОписаниеОшибки = ИнформацияОбОшибке();
ЗаписьЖурналаРегистрации("ОтправкаПочты", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ОписаниеОшибки));
ВызватьИсключение "Не удалось отправить письмо: " + КраткоеПредставлениеОшибки(ОписаниеОшибки);
КонецПопытки;
КонецПроцедуры
Частая ошибка начинающих разработчиков — вызов процедуры отправки почты непосредственно в обработчике проведения документа (ОбработкаПроведения). Так делать категорически нельзя по нескольким причинам:
Правильное решение: Использование фоновых заданий.
Оптимальный алгоритм действий выглядит так:
ПриЗаписи или в команде формы) мы запускаем Фоновое задание.Пример запуска фонового задания:
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(СсылкаНаДокумент);
ПараметрыЗадания.Добавить(АдресEmailКонтрагента);
ФоновыеЗадания.Выполнить("МойОбщийМодуль.ОтправитьСчетНаEmail", ПараметрыЗадания);
В этом случае процедура ОтправитьСчетНаEmail будет выполняться на сервере в фоновом режиме. Пользователь сможет сразу продолжить работу, не дожидаясь отправки письма. Если отправка не удастся, это не повлияет на проведенный документ.
Если ваша конфигурация построена на базе БСП (или типовая, например УТ 11, БП 3.0), не стоит писать код отправки с нуля через ИнтернетПочта. В БСП уже есть готовые механизмы, которые учитывают множество нюансов (логирование, настройки учетных записей, очереди отправки).
Изучите общий модуль РаботаСПочтовымиСообщениями. Пример использования может выглядеть гораздо проще:
ПараметрыПисьма = Новый Структура;
ПараметрыПисьма.Вставить("Кому", АдресПолучателя);
ПараметрыПисьма.Вставить("Тема", "Счет на оплату");
ПараметрыПисьма.Вставить("Текст", "Во вложении ваш счет.");
// ... добавление вложений ...
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);
Мы рассмотрели полный цикл программной отправки файла XLSX из 1С. Ключевые моменты, которые нужно запомнить:
ИнтернетПочтовыйПрофиль с SSL и паролями приложений.ПотокВПамяти или временные файлы.