Почему при отправке писем из 1С приходят «кракозябры» и как это исправить?

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

Проблема некорректного отображения текста в электронных письмах (так называемые «кракозябры») — одна из самых распространенных при настройке рассылок из 1С:Предприятие. Особенно часто это проявляется при использовании современных почтовых сервисов, таких как Яндекс, Gmail или Mail.ru, в сочетании с Библиотекой стандартных подсистем (БСП). Разберем по шагам, почему это происходит и как настроить систему для максимальной совместимости с любыми почтовыми клиентами.

Анализируем причину: почему UTF-8 не всегда работает?

На первый взгляд кажется, что установка кодировки UTF-8 должна решить все проблемы, так как это мировой стандарт. Однако, как показывает практика, дьявол кроется в деталях реализации протоколов. Проанализируем технические заголовки письма, которые приходят от сервера. В типичном проблемном сообщении мы видим следующую структуру:


Content-Type: text/plain;
    charset="UTF8"
Content-Transfer-Encoding: base64

Здесь скрываются сразу две фундаментальные проблемы. Выясним их причину:

  1. Некорректное написание названия кодировки. Согласно стандартам RFC, кодировка должна указываться строго как UTF-8 (с дефисом). Многие почтовые серверы и современные веб-интерфейсы (вроде Яндекс.Почты) умеют «прощать» отсутствие дефиса и интерпретируют UTF8 верно. Однако строгие почтовые клиенты, такие как старые версии Microsoft Outlook или специфические мобильные приложения на Android, при виде charset="UTF8" могут не распознать кодировку вовсе и переключиться в режим Latin-1 или Windows-1252. В результате русский текст превращается в набор непонятных символов.
  2. Использование Base64 для текстового тела письма. Хотя Base64 является стандартным способом передачи бинарных данных, для обычного текста в кодировке UTF-8 он иногда может быть избыточным или приводить к ошибкам, если почтовый клиент некорректно обрабатывает разрывы строк в теле письма.

Шаг 1. Исправляем название кодировки в 1С

Рассмотрим, как правильно задать кодировку в коде. В БСП часто пытаются передать параметр напрямую, но важно следить за строгим соответствием стандарту. Если вы используете программное формирование письма через объект ИнтернетПочтовоеСообщение, убедитесь, что вы устанавливаете кодировку до того, как заполняете тело письма.

Проанализируем пример правильной установки параметров:


// Вместо простой строки "utf8" используем стандартное написание
ПараметрыПисьма.Вставить("Кодировка", "utf-8"); 

// Если работаем напрямую с объектом платформы:
ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;
ПочтовоеСообщение.Кодировка = "utf-8"; // Обязательно с дефисом

Важно помнить: если вы попытаетесь изменить кодировку на windows-1251, это может привести к ошибкам авторизации на сервере Яндекса. Это происходит потому, что при установке глобальной кодировки для почтового профиля 1С начинает передавать логин и пароль в этой же кодировке. Яндекс ожидает данные авторизации в UTF-8, и несовпадение байтов приводит к отказу в доступе.

Шаг 2. Выбор способа кодирования текста

Посмотрим на параметр СпособКодированияТекстаИнтернетПочты. В 1С по умолчанию часто используется Base64. Для улучшения читаемости писем и уменьшения вероятности попадания в спам, попробуем использовать Quoted-Printable. Этот метод оставляет латинские символы читаемыми, а кириллицу кодирует специальными знаками, что более «понятно» для старых почтовых систем.


ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;
ПочтовоеСообщение.СпособКодированияТекста = СпособКодированияТекстаИнтернетПочты.QuotedPrintable;

Шаг 3. Работа с HTML-содержимым

Если ваше письмо отправляется в формате HTML, необходимо синхронизировать кодировку в двух местах. Недостаточно просто указать UTF-8 в заголовках письма. Разберем, что должно быть внутри самого HTML-кода. Обязательно добавьте мета-тег в секцию head вашего письма:


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
    <p>Ваш текст письма на русском языке.</p>
</body>
</html>

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

Шаг 4. Кодирование темы и имен получателей

Как мы видели в анализе заголовков, тема письма также может отображаться некорректно:

Subject: =?UTF8?B?0JfQsNC60YDRi9GC0LjQtSDQt9Cw0LrQsNC30LAsINGB0L3Rj9GC0Lg=?=

Здесь 1С использует механизм MIME encoded-word. Основная проблема здесь часто заключается в длине заголовка. Если заголовок слишком длинный, платформа разбивает его на части. Если разбиение произошло «по живому» — посередине многобайтового символа UTF-8, то восстановить его корректно клиент не сможет.

Рекомендация: Старайтесь избегать слишком длинных тем писем и спецсимволов (кавычки-елочки, длинные тире) в теме. Если проблема сохраняется, попробуйте перед отправкой явно указать кодировку для каждого элемента:


// Пример для БСП (если используется структура ПараметрыПисьма)
ПараметрыПисьма.Вставить("Тема", СокрЛП(ТемаСообщения));
// Убедитесь, что в процедурах БСП не происходит принудительной замены "-" на ""

Шаг 5. Отключение BOM (Byte Order Mark)

При использовании UTF-8 1С иногда добавляет в начало текста невидимый маркер BOM (три байта EF BB BF). Некоторые антиспам-фильтры и почтовые серверы воспринимают эти байты как мусор в начале SMTP-сессии, что ломает дальнейшую обработку сообщения. При программном формировании текстовых файлов или тел сообщений, если это возможно, используйте параметры, отключающие BOM.

Итоговый чек-лист для исправления «кракозябр»:

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

← На главную