При автоматизации бизнес-процессов в 1С, таких как согласование документов через электронную почту, разработчики часто сталкиваются с проблемой: красивые HTML-таблицы, отправленные из системы, "разваливаются" или превращаются в нечитаемый список строк при получении ответа от пользователя. Это происходит из-за различий в движках рендеринга почтовых клиентов и специфики обработки цитируемого текста. Рассмотрим подробнее, как минимизировать эти риски и сделать письма устойчивыми к изменениям.
Прежде чем приступать к коду, проанализируем ситуацию. Основная сложность заключается в том, что почтовые клиенты (особенно десктопный Microsoft Outlook) используют для отображения HTML не современные браузерные движки, а движок Microsoft Word. Word крайне специфично интерпретирует CSS-стили и теги. При ответе на письмо Outlook пересобирает HTML-код, часто вырезая стили из заголовка head и добавляя собственные префиксы mso-. Кроме того, некоторые пользователи предпочитают режим Plain Text, который полностью удаляет любое оформление, превращая таблицу в обычный текст.
Для того чтобы таблица сохраняла свою структуру в большинстве почтовых клиентов, необходимо придерживаться правил "старой школы" верстки. Забудьте про блочную верстку на div — она крайне ненадежна в письмах. Единственный рабочий вариант — использование вложенных таблиц table.
Рассмотрим основные правила оформления:
style в начале письма. Поэтому все стили оформления (цвет, шрифты, отступы) нужно прописывать непосредственно в тегах td и table.cellpadding="0", cellspacing="0" и border="0".table-layout: fixed; и жестко задавайте ширину колонок в пикселях или процентах.Посмотрим на пример формирования текста HTML-письма в 1С:
ТекстHTML = "<table width=""100%"" border=""0"" cellpadding=""0"" cellspacing=""0"" style=""border-collapse: collapse; table-layout: fixed;"">";
ТекстHTML = ТекстHTML + "<tr>";
ТекстHTML = ТекстHTML + "<td style=""border: 1px solid #cccccc; padding: 10px; font-family: Arial, sans-serif;"">Номер документа</td>";
ТекстHTML = ТекстHTML + "<td style=""border: 1px solid #cccccc; padding: 10px; font-family: Arial, sans-serif;"">Сумма</td>";
ТекстHTML = ТекстHTML + "</tr>";
// ... добавление строк из выборки данных ...
ТекстHTML = ТекстHTML + "</table>";
Для корректного отображения в Microsoft Outlook рекомендуется добавлять специальные свойства в стили таблицы. Выясним, какие именно параметры помогают стабилизировать верстку:
mso-table-lspace: 0pt; и mso-table-rspace: 0pt; — убирают специфические для Outlook внешние отступы у таблиц.border-collapse: collapse; — критически важно для того, чтобы границы ячеек не двоились и не "разъезжались".Если ваша задача — не только показать таблицу, но и программно считать данные из ответного письма пользователя (например, результат согласования), полагаться на визуальную таблицу нельзя. Как мы выяснили, пользователь может ответить в текстовом режиме, и теги table исчезнут.
Разберем стратегию "невидимых маркеров":
Добавляйте в письмо техническую строку, которую легко найти регулярным выражением или поиском подстроки. Эту строку можно сделать визуально незаметной для пользователя, применив шрифт размером 1px и цвет, совпадающий с фоном. Однако, надежнее оставить ее видимой в самом низу письма как "служебную информацию".
// Добавление технической строки для парсинга в 1С
ТехническийБлок = "<div style=""display:none; color:#ffffff; font-size:1px;"">";
ТехническийБлок = ТехническийБлок + "ID_DOC:" + Строка(ДокументСсылка.УникальныйИдентификатор()) + ";RESULT:WAIT;";
ТехническийБлок = ТехническийБлок + "</div>";
// И для надежности — дубликат в явном виде
ТекстПисьма = ТекстПисьма + "-------------------" + Символы.ПС;
ТекстПисьма = ТекстПисьма + "Код согласования: " + ДокументСсылка.Номер;
Если верстка таблиц кажется слишком трудозатратной или требования к надежности данных очень высоки, рассмотрим альтернативные варианты:
Полностью контролировать то, как почтовый клиент пользователя сформирует ответное письмо, невозможно. Однако, используя табличную верстку с инлайновыми стилями и дублирование важных данных в скрытых или текстовых блоках, можно добиться стабильной работы системы автоматизации. Помните, что в мире email-рассылок простота кода является залогом того, что ваше сообщение будет прочитано именно так, как вы задумали.