Как сделать перенос строки в ИнтернетПочтовоеСообщение?

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

Введение в проблематику форматирования писем

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

Давайте разберемся, почему так происходит, и рассмотрим все доступные способы корректного переноса строк, учитывая различные форматы писем (простой текст и HTML) и современные стандарты разработки в 1С.

Способ 1. Использование системных символов для простого текста

Самый простой и распространенный сценарий — это отправка письма в формате обычного текста (Plain Text). В этом случае почтовый клиент интерпретирует специальные невидимые символы как команды для переноса каретки.

Для реализации переноса строки в платформе 1С предусмотрена коллекция Символы. Конкретно нас интересует Символы.ПС (Перевод Строки, Line Feed).

Рассмотрим пример кода, который решает задачу автора темы:


Письмо = Новый ИнтернетПочтовоеСообщение;
// Явно указываем, что текст простой, чтобы клиент не пытался читать его как HTML
ТекстПисьма = "Привет! высылаю письмо из 1с." + Символы.ПС + 
              "При переносе данных " + ТекущаяДата() + " произошла ошибка синхронизации.";

Письмо.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);

В данном случае мы используем конкатенацию строк (сложение) и вставляем между предложениями символ Символы.ПС. Почтовая программа, получив такое письмо, корректно отобразит текст на двух строках.

Важное замечание про совместимость: Хотя современные почтовые сервера и клиенты отлично понимают одиночный символ перевода строки (LF), исторически стандарт электронной почты (RFC) опирается на последовательность CRLF (Carriage Return + Line Feed). Если вы отправляете письма на очень старые системы или специфическое оборудование, для надежности можно использовать комбинацию:

Текст = "Строка 1" + Символы.ВК + Символы.ПС + "Строка 2";

Где Символы.ВК — это возврат каретки.

Способ 2. Форматирование в HTML-письмах

Ситуация кардинально меняется, если вы отправляете письмо в формате HTML. Это позволяет использовать шрифты, цвета и таблицы, но накладывает свои ограничения на управление структурой текста.

В HTML любые пробельные символы (пробелы, табуляции, переносы строк в коде) при отображении в браузере или почтовом клиенте "схлопываются" в один пробел. Поэтому использование Символы.ПС в HTML-режиме не даст визуального переноса строки.

Для переноса строки в HTML необходимо использовать тег <br> (line break) или оборачивать текст в теги параграфов <p>...</p>.

Посмотрим, как это выглядит в коде 1С:


Письмо = Новый ИнтернетПочтовоеСообщение;
// Формируем текст с использованием HTML-тегов
ТекстHTML = "<html><body>" +
            "<b>Привет!</b> высылаю письмо из 1с.<br>" +
            "При переносе данных " + ТекущаяДата() + " произошла ошибка синхронизации." +
            "</body></html>";

// Обязательно указываем тип текста HTML
Письмо.Тексты.Добавить(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);

Обратите внимание: если вы добавите текст с тегами <br>, но укажете тип ТипТекстаПочтовогоСообщения.ПростойТекст, получатель увидит сами теги в тексте письма, что выглядит непрофессионально.

Способ 3. Современный подход: Шаблоны строк

Использование оператора сложения строк (+) при формировании длинных текстов делает код трудночитаемым и подверженным ошибкам. В современных конфигурациях 1С рекомендуется использовать функцию СтрШаблон (или StringTemplate в английском синтаксисе).

Этот метод позволяет создать заготовку с маркерами (%1, %2 и т.д.) и подставить в них значения. Это также упрощает вставку переносов строк.

Давайте перепишем пример, используя этот подход. Это делает код гораздо чище:


ШаблонПисьма = "Привет! высылаю письмо из 1с.%1При переносе данных %2 произошла ошибка синхронизации.";
	
// Параметр %1 заменяем на перенос строки, %2 на дату
ТекстПисьма = СтрШаблон(ШаблонПисьма, Символы.ПС, ТекущаяДата());

Письмо.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);

Способ 4. Работа с большими текстами через ТекстовыйДокумент

Если вам необходимо сформировать очень длинное письмо (например, лог операций или отчет), постоянная конкатенация строк может работать медленно и выглядеть громоздко. В таких случаях мы рекомендуем использовать объект ТекстовыйДокумент.

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

Пример реализации:


ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.ДобавитьСтроку("Привет! высылаю письмо из 1с.");
ТекстДок.ДобавитьСтроку("---------------------------------");
ТекстДок.ДобавитьСтроку("Отчет о синхронизации за " + ТекущаяДата());
ТекстДок.ДобавитьСтроку("Статус: Ошибка");

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

Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);

Мифы и ошибки: Символ вертикальной черты "|"

В обсуждениях часто можно встретить совет использовать символ |. Давайте проясним этот момент, чтобы избежать путаницы.

Символ | используется в конфигураторе 1С для написания многострочных строковых литералов. Это инструмент оформления кода, а не форматирования результирующей строки.

Сравним два варианта:

Вариант А (Без переноса внутри):


// В конфигураторе это выглядит как две строки, но в переменную запишется одна длинная строка
Текст = "Строка один |Строка два"; 
// Результат: "Строка один Строка два"

Вариант Б (С переносом):


// Чтобы здесь появился перенос, нужно нажать Enter внутри кавычек при написании кода
Текст = "Строка один
|Строка два";
// Результат: "Строка один" + Символы.ПС + "Строка два"

Использование "жестких" переносов внутри кода (Вариант Б) часто считается дурным тоном, так как нарушает отступы и читаемость кода. Гораздо правильнее использовать явное добавление Символы.ПС или СтрШаблон.

Резюме

Подведем итоги нашего разбора. Чтобы корректно перенести строку в почтовом сообщении:

  1. Определите тип письма: Простой текст или HTML.
  2. Для простого текста используйте Символы.ПС (или Chars.LF).
  3. Для HTML используйте тег <br>.
  4. Для формирования сложных сообщений применяйте функцию СтрШаблон.
  5. Для больших текстов используйте объект ТекстовыйДокумент.

Используя эти методы, вы обеспечите корректное отображение ваших уведомлений в любых почтовых клиентах получателей.

← На главную