Как сохранить переносы строк в теле письма при отправке через DialMail в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При автоматизации отправки почтовых сообщений из 1С:Предприятия 7.7 с помощью популярной внешней компоненты DialMail разработчики часто сталкиваются с ситуацией, когда текст письма, содержащий несколько абзацев, отображается у получателя одной сплошной строкой. Стандартные разделители 1С, такие как системная переменная РазделительСтрок, символ Симв(10) или знак вертикальной черты |, в теле письма игнорируются и не переносят текст на новую строку.

Разберем причины такого поведения компоненты и рассмотрим практические варианты решения этой задачи.

Почему происходит склеивание строк?

Выясним причину, из-за которой почтовые клиенты игнорируют стандартные разделители строк:

  1. MIME-тип содержимого письма (HTML): Если компонента отправляет письмо в формате text/html, почтовые программы интерпретируют любые служебные символы перевода строки и возврата каретки (CRLF, LF) как обычные пробелы. Чтобы отобразить перенос в HTML-разметке, требуются специальные теги.
  2. Неполная последовательность символов: В операционных системах Windows и протоколе SMTP стандартный перенос строки представляет собой комбинацию из двух символов — возврата каретки и перевода строки Симв(13) + Симв(10) (CRLF). Если передать только Симв(10), некоторые клиенты не смогут распознать его как корректный конец строки.

Способ 1. Форматирование тела письма в HTML с использованием тега <br>

Проанализируем самый распространенный вариант. Если письмо отправляется в формате HTML, для разделения строк необходимо использовать соответствующий тег разметки <br>.

Посмотрим на пример формирования текста письма вручную:


ТекстПисьма = "Здравствуйте!" + "<br><br>" +
              "Направляем вам акт сверки взаиморасчетов." + "<br>" +
              "Просим подписать и отправить ответным письмом." + "<br><br>" +
              "С уважением, отдел бухгалтерии.";
ОтправкаПочты.ТелоПисьма = ТекстПисьма;

Способ 2. Автоматическая замена стандартных разделителей строк на <br>

Часто текст сообщения генерируется динамически или передается из многострочных текстовых полей диалога 1С 7.7. В таких строках разделителем служит системная переменная РазделительСтрок. Чтобы не переписывать логику формирования текста, применим функцию СтрЗаменить().

Разберем по шагам, как выполнить преобразование текста перед передачей в объект отправки:


// Исходный многострочный текст из 1С
ТекстСообщения = "Первая строка сообщения" + РазделительСтрок + "Вторая строка сообщения";

// Преобразуем стандартные переносы в HTML-теги
ТекстПисьма = СтрЗаменить(ТекстСообщения, РазделительСтрок, "<br>");

// Передаем подготовленный текст в компоненту
ОтправкаПочты.ТелоПисьма = ТекстПисьма;

Способ 3. Сохранение форматирования с помощью тега <pre>

Если требуется передать форматированный текст со всеми отступами, пробелами и стандартными переводами строк без ручной расстановки тегов <br>, обернем текст в HTML-тег <pre>.

Посмотрим на реализацию:


ТекстПисьма = "<pre>" + ТекстСПереносами + "</pre>";
ОтправкаПочты.ТелоПисьма = ТекстПисьма;

Внутри блока <pre> почтовые клиенты и браузеры сохраняют исходную структуру текста, включая все символы РазделительСтрок.

Способ 4. Переключение типа тела письма на обычный текст (Plain Text)

Если оформление в виде HTML не требуется, переключим режим тела письма в объекте компоненты DialMail на простой текст. Для этого установим свойство ТипТелаПисьма:

  1. 0 — простой текст (text/plain);
  2. 1 — HTML-документ (text/html).

Рассмотрим пример кода для отправки обычного текстового сообщения с корректной последовательностью символов CRLF:


// Устанавливаем режим обычного текста
ОтправкаПочты.ТипТелаПисьма = 0;

// Формируем текст с явным указанием возврата каретки и перевода строки
CRLF = Симв(13) + Симв(10);
ТекстПисьма = "Первая строка" + CRLF + "Вторая строка";

ОтправкаПочты.ТелоПисьма = ТекстПисьма;

В режиме простого текста стандартные разделители строк 1С обрабатываются почтовыми серверами без необходимости добавления HTML-тегов.

Альтернативный вариант: отправка через системный объект CDO.Message

Если использование сторонних DLL вызывает сложности с совместимостью на современных версиях Windows, рассмотрим штатный системный COM-объект Windows — CDO.Message. Он позволяет четко разделить отправку простого текста и HTML с помощью свойств TextBody и HTMLBody:


Почта = СоздатьОбъект("CDO.Message");
Почта.From = "sender@company.ru";
Почта.To = "client@domain.ru";
Почта.Subject = "Тема сообщения";

// Для простого текста с переносами строк:
Почта.TextBody = "Строка 1" + РазделительСтрок + "Строка 2";

// Или для HTML-письма:
// Почта.HTMLBody = "<html><body>Строка 1<br>Строка 2</body></html>";

// Настройка параметров SMTP и отправка
Почта.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;
Почта.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "smtp.company.ru";
Почта.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 25;
Почта.Configuration.Fields.Update();

Почта.Send();

Резюме: При работе с компонентой DialMail по умолчанию используется режим HTML. Чтобы текст не склеивался, заменяйте разделители строк на тег <br>, оборачивайте текст в <pre> или явно переключайте свойство ТипТелаПисьма = 0 при отправке обычного текста.

← На главную