Почему при отправке почты из 1С в списке писем Gmail вместо русских букв отображаются непонятные символы и как это исправить?

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

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

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

Выясняем причину: как устроен механизм предпросмотра писем (сниппетов)

Для того чтобы понять природу ошибки, нам необходимо погрузиться в устройство почтового стандарта MIME (Multipurpose Internet Mail Extensions). Когда мы отправляем электронное письмо из 1С, оно представляет собой сложную древовидную структуру. Сообщение состоит из заголовков (тема, отправитель, получатель) и нескольких частей тела (например, текстовая версия и HTML-версия).

Почтовые клиенты, такие как Gmail, Yandex или Mail.ru, обрабатывают входящие письма по определенным алгоритмам. Давайте рассмотрим, как формируется список входящих писем в интерфейсе почтового ящика. В этом списке для каждого письма отображается так называемый сниппет (snippet) — краткий предпросмотр первых строк сообщения.

Процесс генерации сниппета выглядит следующим образом:

  1. Почтовый сервер получает письмо, имеющее формат multipart/alternative (когда внутри есть и обычный текст, и HTML) или multipart/mixed (с вложениями).
  2. Для создания краткого описания сервер не загружает тяжелую HTML-версию со всеми стилями и тегами. Вместо этого он ищет простейшую текстовую часть письма — text/plain.
  3. Если сервер находит текстовую часть, он берет из нее первые 100–200 символов и выводит их в список писем.

Теперь проанализируем, где именно происходит сбой. Когда мы пишем код отправки почты в 1С, мы часто задаем кодировку для всего сообщения в целом, используя свойство Сообщение.Кодировка = "utf-8";. Однако это свойство влияет преимущественно на заголовки письма (тему, имя отправителя). Каждая отдельная текстовая часть в коллекции Сообщение.Тексты является самостоятельным объектом. Если мы явно не укажем кодировку для каждого добавленного текста, платформа 1С сформирует почтовый пакет, в котором для текстовой части кодировка будет отсутствовать либо будет выставлена по умолчанию как US-ASCII.

В этот момент в игру вступают различия между почтовыми сервисами:

  1. Яндекс.Почта использует лояльные алгоритмы автоопределения кодировок. Даже если в заголовке части текста указана кодировка US-ASCII, но внутри содержится кириллица, сервер Яндекса проанализирует байты и автоматически перекодирует их в читаемый вид. Поэтому на Яндексе сниппеты выглядят нормально.
  2. Gmail строго следует международным стандартам RFC. Если в заголовке MIME-части указано US-ASCII (или кодировка не указана вовсе), Gmail не будет пытаться угадать кодировку. Он честно декодирует байты по таблице ASCII. Поскольку в таблице ASCII нет русских букв, все русские символы превращаются в пустоту, знаки вопроса или нечитаемые спецсимволы. При этом, когда пользователь открывает само письмо, Gmail отображает HTML-версию, в которой кодировка UTF-8 прописана явно внутри тега <meta>, поэтому текст внутри письма выглядит нормально.

Анализируем типичные ошибки разработчиков 1С

Давайте разберем типичный пример кода, который приводит к описываемой проблеме. Очень часто разработчики пишут код следующим образом:


// ПРИМЕР КОДА С ОШИБКОЙ
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Тема = "Уведомление об отгрузке";
Сообщение.Отправитель = "sales@company.com";
Сообщение.Получатели.Добавить("client@gmail.com");

// Установка кодировки для всего сообщения
Сообщение.Кодировка = "utf-8"; 

// Добавление текста письма
ТекстПисьма = "Уважаемый клиент, ваш заказ готов к отгрузке!";
НовыйТекст = Сообщение.Тексты.Добавить(ТекстПисьма);
НовыйТекст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;

// Отправка сообщения...

В данном примере разработчик установил свойство Сообщение.Кодировка, надеясь, что этого достаточно. Но объект НовыйТекст, добавленный в коллекцию Сообщение.Тексты, остался без явно заданной кодировки. В результате почтовый клиент Gmail не смог корректно отобразить предпросмотр этого письма в списке сообщений.

Решение проблемы: правильная установка кодировок для всех частей письма

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


// ПРАВИЛЬНЫЙ ШАБЛОН ОТПРАВКИ ПОЧТЫ ИЗ 1С
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Тема = "Уведомление об отгрузке";
Сообщение.Отправитель.Адрес = "sales@company.com";
Сообщение.Получатели.Добавить("client@gmail.com");

// Задаем общую кодировку для заголовков сообщения
Сообщение.Кодировка = "utf-8";

// 1. Создаем и настраиваем простую текстовую часть (для сниппетов)
ТекстПростой = Сообщение.Тексты.Добавить();
ТекстПростой.Текст = "Уважаемый клиент, ваш заказ готов к отгрузке! Подробности во вложении.";
ТекстПростой.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
// КРИТИЧЕСКИ ВАЖНО: Явно указываем UTF-8 для простого текста!
ТекстПростой.Кодировка = "utf-8";

// 2. Если мы используем красивое HTML-оформление, добавляем HTML-часть
ТекстHTML = Сообщение.Тексты.Добавить();
ТекстHTML.Текст = "<html><head><meta charset='utf-8'></head><body><p>Уважаемый клиент, ваш заказ <strong>готов к отгрузке</strong>!</p></body></html>";
ТекстHTML.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
// КРИТИЧЕСКИ ВАЖНО: Явно указываем UTF-8 для HTML-текста!
ТекстHTML.Кодировка = "utf-8";

В этом примере мы явно разделили письмо на две части и для каждой из них установили свойство Кодировка = "utf-8". Теперь Gmail получит четкие инструкции по декодированию каждой части сообщения. Предпросмотр письма в списке входящих будет отображаться красивым русским текстом.

Рассмотрим работу с вложениями и кодировкой их имен

Проблема с кодировкой в почте 1С не ограничивается только телом письма. Очень часто разработчики сталкиваются с тем, что имена прикрепленных файлов (вложений) также превращаются в нечитаемый набор символов. Это происходит по схожей причине — из-за неверной кодировки заголовков вложений.

Давайте посмотрим, как правильно прикреплять файлы к письму, чтобы их названия отображались корректно на любых почтовых серверах:


// ДОБАВЛЕНИЕ ВЛОЖЕНИЯ С НАСТРОЙКОЙ КОДИРОВКИ ИМЕНИ ФАЙЛА
ПутьКФайлу = "C:\Docs\Накладная_123.pdf";
Вложение = Сообщение.Вложения.Добавить(ПутьКФайлу);

// Задаем имя вложения, которое увидит получатель
Вложение.Имя = "Накладная_№123.pdf";

// Указываем кодировку для имени вложения
Вложение.Кодировка = "utf-8";

Использование свойства Кодировка для объекта вложения гарантирует, что имя файла будет правильно закодировано по стандарту RFC 2047, и получатель сможет скачать файл с исходным русским названием.

Особенности отправки через типовые механизмы БСП

Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), ручное создание объектов ИнтернетПочтовоеСообщение обычно заменяется вызовом процедур общего модуля РаботаСПочтовымиСообщениями.

Проанализируем, как правильно передавать параметры кодировки при использовании БСП. Для этого обычно подготавливается структура параметров письма. Пример формирования параметров представлен ниже:


// ФОРМИРОВАНИЕ ПИСЬМА ЧЕРЕЗ БСП
ПараметрыПисьма = Новый Структура;
ПараметрыПисьма.Вставить("Кому", "client@gmail.com");
ПараметрыПисьма.Вставить("Тема", "Уведомление от компании");
ПараметрыПисьма.Вставить("Тело", "Приветствуем! Это текст сообщения.");
ПараметрыПисьма.Вставить("ТипТекста", "HTML"); // или "ПростойТекст"

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

// Вызываем отправку почты через БСП
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(СистемнаяУчетнаяЗапись, ПараметрыПисьма);

В актуальных версиях БСП разработчики фирмы «1С» уже учли особенности работы различных почтовых сервисов, и при явном указании кодировки utf-8 в структуре параметров библиотека автоматически пропишет нужные заголовки для всех создаваемых MIME-частей. Однако, если ваша конфигурация давно не обновлялась, рекомендуется проверить код общего модуля БСП, отвечающий за заполнение почтового сообщения, и убедиться, что свойство Кодировка присваивается элементам коллекции Тексты.

Альтернативные кодировки: стоит ли использовать Windows-1251 или KOI8-R?

В процессе обсуждения на форумах часто можно встретить советы использовать устаревшие кодировки, такие как windows-1251, koi8-r или cp866. Давайте выясним, почему в современных реалиях этого делать не стоит.

Сегодня стандартом де-факто во всем мире является UTF-8 (Юникод). Использование UTF-8 имеет целый ряд неоспоримых преимуществ:

  1. Универсальность: UTF-8 поддерживает символы любых алфавитов одновременно. Вы можете в одном письме использовать русский текст, английские термины и специальные символы.
  2. Поддержка мобильными устройствами: Все современные смартфоны (iOS, Android) по умолчанию настроены на работу с UTF-8. Использование региональных кодировок на мобильных устройствах часто приводит к нечитаемым сообщениям.
  3. Совместимость с веб-интерфейсами: Крупнейшие почтовые гиганты оптимизируют свои парсеры именно под Юникод, минимизируя вероятность сбоев автоопределения.

Поэтому мы настоятельно рекомендуем всегда использовать кодировку utf-8 в качестве основной для всех почтовых интеграций в 1С.

Резюме и чеклист для разработчика

Для того чтобы ваши письма всегда выглядели презентабельно, а их предпросмотр в списке писем не пугал клиентов непонятными символами, следуйте простому правилу при написании кода отправки почты из 1С:

  1. Всегда устанавливайте общую кодировку сообщения: Сообщение.Кодировка = "utf-8";.
  2. Обязательно настраивайте индивидуально каждую добавленную часть текста (как ПростойТекст, так и HTML) и явно прописывайте для них кодировку: ТекстЧасть.Кодировка = "utf-8";.
  3. Не забывайте указывать кодировку для вложений, чтобы русские имена файлов не искажались при получении: Вложение.Кодировка = "utf-8";.
  4. При использовании БСП проверяйте заполнение свойства Кодировка в параметрах отправки писем.

Соблюдение этих простых стандартов MIME позволит вам создавать надежные интеграции, которые будут стабильно работать с любыми почтовыми сервисами по всему миру!

← На главную