Как отправить электронное письмо с форматированным текстом и HTML из 1С на управляемых формах?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке почтовых механизмов в 1С часто возникает задача отправить не просто плоский текст, а красиво оформленное письмо: с выделением жирным шрифтом, курсивом, пользовательскими цветами текста, таблицами и вложенными графическими элементами. Для визуального редактирования такого текста на управляемой форме используется реквизит с типом ФорматированныйДокумент. Однако при прямой передаче содержимого в почтовое сообщение оформление нередко теряется, и получатель видит обычный неформатированный текст.

Разберем подробно, почему это происходит и как правильно выгрузить разметку и отправить полноценное HTML-письмо с помощью встроенного языка 1С.

Причина потери форматирования

Проанализируем ситуацию: объект ФорматированныйДокумент хранит текст и его стили во внутреннем представлении платформы 1С. При попытке получить из него обычную строку (например, через строковое приведение или обращение к текстовому содержимому) платформа отсекает теги оформления.

Чтобы почтовый клиент адресата корректно отобразил все цвета, шрифты и структуру, необходимо решить две задачи:

  1. Сконвертировать содержимое форматированного документа в стандартный формат HTML с помощью метода ПолучитьHTML.
  2. Явно указать тип почтового блока как ТипТекстаПочтовогоСообщения.HTML при формировании объекта ИнтернетПочтовоеСообщение.

Метод ПолучитьHTML: синтаксис и особенности работы

Рассмотрим синтаксис метода объекта ФорматированныйДокумент:

ПолучитьHTML(<ТекстHTML>, <Вложения>)

Разберем параметры данного метода:

  1. ТекстHTML (обязательный, тип Строка) — переменная, в которую метод помещает сгенерированный HTML-код страницы. Обратите внимание: переменная передается по ссылке и заполняется самим методом.
  2. Вложения (необязательный, тип Структура) — коллекция встроенных объектов (например, изображений, вставленных в текст). Ключами структуры являются строковые идентификаторы (CID), а значениями — объекты типа Картинка.

Пошаговая реализация отправки форматированного письма

Разберем по шагам весь процесс формирования и отправки письма из формы обработки или документа.

Шаг 1. Получение HTML и вложений на клиенте или сервере

Метод ПолучитьHTML доступен как в клиентском, так и в серверном контексте. Создадим переменные и извлечем данные из реквизита формы:


&НаКлиенте
Процедура ОтправитьПисьмо(Команда)
    ТекстHTML = "";
    СтруктураВложений = Новый Структура;
    
    // Получаем HTML-код и структуру встроенных картинок
    ФорматированныйДокумент.ПолучитьHTML(ТекстHTML, СтруктураВложений);
    
    // Передаем сформированные данные на сервер для отправки
    ОтправитьПисьмоНаСервере(ТекстHTML, СтруктураВложений);
КонецПроцедуры

Шаг 2. Формирование интернет-почтового сообщения на сервере

Посмотрим на пример серверной процедуры, выполняющей сборку и отправку сообщения через объект ИнтернетПочта:


&НаСервере
Процедура ОтправитьПисьмоНаСервере(Знач ТекстHTML, Знач СтруктураВложений)
    Письмо = Новый ИнтернетПочтовоеСообщение;
    Письмо.Тема = "Тестовое форматированное письмо";
    Письмо.Отправитель.Адрес = "sender@example.com";
    Письмо.Получатели.Добавить("recipient@example.com");
    Письмо.Кодировка = "UTF-8";
    
    // Добавляем основной текст письма с обязательным указанием типа HTML
    Письмо.Тексты.Добавить(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);
    
    // Обрабатываем встроенные изображения
    Для Каждого ЭлементВложения Из СтруктураВложений Цикл
        КартинкаОбъект = ЭлементВложения.Значение;
        ИдентификаторCID = ЭлементВложения.Ключ;
        
        // Получаем двоичные данные картинки
        ДвоичныеДанныеКартинки = КартинкаОбъект.ПолучитьДвоичныеДанные();
        
        // Добавляем во вложения письма и связываем по CID
        ВложениеПисьма = Письмо.Вложения.Добавить(ДвоичныеДанныеКартинки, ИдентификаторCID);
        ВложениеПисьма.Идентификатор = ИдентификаторCID;
    КонецЦикла;
    
    // Подключение к почтовому серверу и отправка
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераSMTP = "smtp.example.com";
    Профиль.ПортSMTP = 465;
    Профиль.ПользовательSMTP = "sender@example.com";
    Профиль.ПарольSMTP = "secret_password";
    Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
    Профиль.ИспользоватьSSLSMTP = Истина;
    
    Почта = Новый ИнтернетПочта;
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Письмо);
        Почта.Отключиться();
    Исключение
        Почта.Отключиться();
        ВызватьИсключение "Ошибка при отправке почты: " + ОписаниеОшибки();
    КонецПопытки;
КонецПроцедуры

Важные нюансы и практические рекомендации

Рассмотрим подробнее тонкости, на которые следует обратить внимание при работе с почтовыми сообщениями:

  1. Связывание встроенных картинок (CID): когда метод ПолучитьHTML генерирует разметку, ссылки на внедренные картинки получают вид src="cid:ид_картинки". Чтобы почтовый клиент смог отобразить их внутри тела письма, свойство Идентификатор у объекта вложения в Письмо.Вложения должно строго совпадать с ключом из структуры вложений.
  2. Явная установка кодировки: всегда задавайте свойство Письмо.Кодировка = "UTF-8". Это исключает искажение кириллических символов при прохождении через различные почтовые шлюзы.
  3. Специфика отображения в почтовых клиентах: генератор разметки ФорматированныйДокумент создает базовый HTML и встроенные CSS-стили. Некоторые почтовые программы (например, Microsoft Outlook) используют специфические движки рендеринга, поэтому слишком сложные стили или нестандартные шрифты могут отображаться упрощенно.

Альтернативные варианты формирования HTML-писем

Если возможностей встроенного редактора недостаточно или требуется отправлять строгие отчеты и шаблоны, рассмотрим альтернативные подходы:

  1. Использование макета типа HTML-документ или Текстовый документ: позволяет сформировать готовый адаптивный шаблон разметки и программно подставлять параметры через функцию СтрШаблон или СтрЗаменить.
  2. Экспорт табличного документа: сформированный отчет или печатную форму в объекте ТабличныйДокумент можно сохранить в HTML с помощью метода ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.HTML), после чего прочитать полученный файл в строку и передать в тело письма.
← На главную