При разработке механизмов уведомлений или рассылок из системы 1С:Предприятие мы часто сталкиваемся с необходимостью отправки электронных писем. Одним из основных объектов для этой задачи является ИнтернетПочтовоеСообщение. На первый взгляд, задача кажется тривиальной: сформировать текст и отправить его. Однако, когда дело доходит до форматирования, многие разработчики сталкиваются с тем, что текст приходит получателю "сплошной простыней", игнорируя визуальное разделение на абзацы.
Давайте разберемся, почему так происходит, и рассмотрим все доступные способы корректного переноса строк, учитывая различные форматы писем (простой текст и HTML) и современные стандарты разработки в 1С.
Самый простой и распространенный сценарий — это отправка письма в формате обычного текста (Plain Text). В этом случае почтовый клиент интерпретирует специальные невидимые символы как команды для переноса каретки.
Для реализации переноса строки в платформе 1С предусмотрена коллекция Символы. Конкретно нас интересует Символы.ПС (Перевод Строки, Line Feed).
Рассмотрим пример кода, который решает задачу автора темы:
Письмо = Новый ИнтернетПочтовоеСообщение;
// Явно указываем, что текст простой, чтобы клиент не пытался читать его как HTML
ТекстПисьма = "Привет! высылаю письмо из 1с." + Символы.ПС +
"При переносе данных " + ТекущаяДата() + " произошла ошибка синхронизации.";
Письмо.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);
В данном случае мы используем конкатенацию строк (сложение) и вставляем между предложениями символ Символы.ПС. Почтовая программа, получив такое письмо, корректно отобразит текст на двух строках.
Важное замечание про совместимость: Хотя современные почтовые сервера и клиенты отлично понимают одиночный символ перевода строки (LF), исторически стандарт электронной почты (RFC) опирается на последовательность CRLF (Carriage Return + Line Feed). Если вы отправляете письма на очень старые системы или специфическое оборудование, для надежности можно использовать комбинацию:
Текст = "Строка 1" + Символы.ВК + Символы.ПС + "Строка 2";
Где Символы.ВК — это возврат каретки.
Ситуация кардинально меняется, если вы отправляете письмо в формате HTML. Это позволяет использовать шрифты, цвета и таблицы, но накладывает свои ограничения на управление структурой текста.
В HTML любые пробельные символы (пробелы, табуляции, переносы строк в коде) при отображении в браузере или почтовом клиенте "схлопываются" в один пробел. Поэтому использование Символы.ПС в HTML-режиме не даст визуального переноса строки.
Для переноса строки в HTML необходимо использовать тег <br> (line break) или оборачивать текст в теги параграфов <p>...</p>.
Посмотрим, как это выглядит в коде 1С:
Письмо = Новый ИнтернетПочтовоеСообщение;
// Формируем текст с использованием HTML-тегов
ТекстHTML = "<html><body>" +
"<b>Привет!</b> высылаю письмо из 1с.<br>" +
"При переносе данных " + ТекущаяДата() + " произошла ошибка синхронизации." +
"</body></html>";
// Обязательно указываем тип текста HTML
Письмо.Тексты.Добавить(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);
Обратите внимание: если вы добавите текст с тегами <br>, но укажете тип ТипТекстаПочтовогоСообщения.ПростойТекст, получатель увидит сами теги в тексте письма, что выглядит непрофессионально.
Использование оператора сложения строк (+) при формировании длинных текстов делает код трудночитаемым и подверженным ошибкам. В современных конфигурациях 1С рекомендуется использовать функцию СтрШаблон (или StringTemplate в английском синтаксисе).
Этот метод позволяет создать заготовку с маркерами (%1, %2 и т.д.) и подставить в них значения. Это также упрощает вставку переносов строк.
Давайте перепишем пример, используя этот подход. Это делает код гораздо чище:
ШаблонПисьма = "Привет! высылаю письмо из 1с.%1При переносе данных %2 произошла ошибка синхронизации.";
// Параметр %1 заменяем на перенос строки, %2 на дату
ТекстПисьма = СтрШаблон(ШаблонПисьма, Символы.ПС, ТекущаяДата());
Письмо.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);
Если вам необходимо сформировать очень длинное письмо (например, лог операций или отчет), постоянная конкатенация строк может работать медленно и выглядеть громоздко. В таких случаях мы рекомендуем использовать объект ТекстовыйДокумент.
Этот объект имеет удобный метод ДобавитьСтроку(), который автоматически добавляет разделители строк. Вам не придется вручную прописывать Символы.ПС в конце каждой фразы.
Пример реализации:
ТекстДок = Новый ТекстовыйДокумент;
ТекстДок.ДобавитьСтроку("Привет! высылаю письмо из 1с.");
ТекстДок.ДобавитьСтроку("---------------------------------");
ТекстДок.ДобавитьСтроку("Отчет о синхронизации за " + ТекущаяДата());
ТекстДок.ДобавитьСтроку("Статус: Ошибка");
// Получаем готовый текст со всеми переносами
ТекстПисьма = ТекстДок.ПолучитьТекст();
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тексты.Добавить(ТекстПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);
В обсуждениях часто можно встретить совет использовать символ |. Давайте проясним этот момент, чтобы избежать путаницы.
Символ | используется в конфигураторе 1С для написания многострочных строковых литералов. Это инструмент оформления кода, а не форматирования результирующей строки.
Сравним два варианта:
Вариант А (Без переноса внутри):
// В конфигураторе это выглядит как две строки, но в переменную запишется одна длинная строка
Текст = "Строка один |Строка два";
// Результат: "Строка один Строка два"
Вариант Б (С переносом):
// Чтобы здесь появился перенос, нужно нажать Enter внутри кавычек при написании кода
Текст = "Строка один
|Строка два";
// Результат: "Строка один" + Символы.ПС + "Строка два"
Использование "жестких" переносов внутри кода (Вариант Б) часто считается дурным тоном, так как нарушает отступы и читаемость кода. Гораздо правильнее использовать явное добавление Символы.ПС или СтрШаблон.
Подведем итоги нашего разбора. Чтобы корректно перенести строку в почтовом сообщении:
Символы.ПС (или Chars.LF).<br>.СтрШаблон.ТекстовыйДокумент.Используя эти методы, вы обеспечите корректное отображение ваших уведомлений в любых почтовых клиентах получателей.