Как правильно вставить картинку в текст электронного письма из 1С?

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

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

Почему не работают локальные пути?

Рассмотрим самую распространенную ошибку, с которой начал автор темы. В HTML-коде письма часто пытаются указать прямой путь к файлу на диске отправителя.


Текст = "
|<h3> Привет! </h3>
|Вот картинка: <img src=""file:///F:/Base/Image.png"" />
|";

Давайте разберемся, что происходит в этот момент. Атрибут src указывает почтовому клиенту (Outlook, Thunderbird, веб-браузер), откуда загрузить изображение. Схема file:/// ссылается на локальную файловую систему компьютера того, кто читает письмо.

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

Метод 1: Встраивание картинки через Base64

Один из способов передать картинку — превратить её в текст и вшить прямо в HTML-код. Для этого используется кодировка Base64.

Алгоритм действий следующий:

  1. Читаем файл с диска в ДвоичныеДанные.
  2. Преобразуем двоичные данные в строку Base64.
  3. Вставляем эту строку в атрибут src тега img со специальным префиксом.

Посмотрим на пример кода, реализующего этот подход:


// 1. Получаем двоичные данные картинки
ИмяФайла = "F:\Base\Штрихкод.png";
ФайлКартинки = Новый ДвоичныеДанные(ИмяФайла);

// 2. Преобразуем в строку Base64
СтрокаBase64 = Base64Строка(ФайлКартинки);

// Убираем переносы строк, которые может добавить функция Base64Строка (опционально, но желательно)
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ПС, "");
СтрокаBase64 = СтрЗаменить(СтрокаBase64, Символы.ВК, "");

// 3. Формируем HTML
ТекстHTML = "
|<html><body>
|<h3>Пример Base64</h3>
|<img src=""data:image/png;base64," + СтрокаBase64 + """ />
|</body></html>";

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

Недостатки метода Base64:

В ходе обсуждения была выявлена серьезная проблема: метод ОбработатьТексты() объекта ИнтернетПочтовоеСообщение может зависать или выдавать ошибку при работе с Base64. Кроме того, для корректной подготовки таких писем может потребоваться ручная замена base64-строк и ссылок в файле HTML, чтобы структура документа оставалась валидной.

Дело в том, что картинка среднего размера (например, 600 Кб) в формате Base64 превращается в строку длиной около 800 000 символов. Парсер 1С плохо справляется с такими длинными строками внутри атрибутов тегов, что приводит к переполнению памяти. Также Base64 увеличивает объем передаваемых данных примерно на 33%.

Метод 2: Использование Content-ID (CID) — Рекомендуемый способ

Наиболее правильным и стабильным способом является использование механизма CID (Content-ID). Этот метод подразумевает, что картинка прикрепляется к письму как вложение, но помечается специальным идентификатором, на который ссылается HTML-код. Такая отправка почтовых сообщений с вложениями гарантирует корректное отображение контента в большинстве почтовых клиентов.

Давайте подробно рассмотрим, как это реализовать.

Шаг 1. Подготовка вложения

Мы должны добавить картинку в коллекцию вложений письма и присвоить ей уникальный текстовый идентификатор (CID). Этот идентификатор должен быть уникальным в рамках одного письма.

Шаг 2. Формирование ссылки в HTML

В теге img вместо пути к файлу мы пишем конструкцию cid:ВашИдентификатор. Если вам необходимо отправить автоматически созданное изображение, например, когда реализована генерация QR и штрихкодов без библиотек, вы просто сохраняете результат во временный файл и подключаете его через CID.

Разберем пример кода:


Письмо = Новый ИнтернетПочтовоеСообщение;

// Путь к файлу на сервере или диске
ПутьКФайлу = "F:\Base\Logo.png";

// Генерируем уникальный ID
ИдентификаторCID = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");

// Добавляем вложение
Вложение = Письмо.Вложения.Добавить(ПутьКФайлу);
Вложение.Идентификатор = ИдентификаторCID; 
Вложение.ТипСодержимого = "image/png"; 

// Формируем текст письма
ТекстHTML = "
|<html>
|<body>
|   <h3>Приветствуем!</h3>
|   <p>Ниже представлен ваш штрихкод:</p>
|   <img src=""cid:" + ИдентификаторCID + """ alt=""Штрихкод"" />
|   <p>С уважением, Наша Компания</p>
|</body>
|</html>";

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

Преимущества метода CID:

  1. Надежность: Это стандарт индустрии электронной почты (MIME Standard).
  2. Производительность: Тело письма остается легким, так как картинка лежит отдельно.
  3. Совместимость: Платформа 1С корректно обрабатывает такие письма.

Важные нюансы и диагностика проблем

В ходе обсуждения проблемы выяснилась интересная деталь: иногда код написан верно, но картинка все равно "битая".

Проверка формата файла

Причиной может стать файл: например, пользователю прислали PDF-документ, у которого просто переименовали расширение в .png. Почтовые клиенты не смогут его отрисовать. Если ваша задача — отправить страницы документа, то сначала должна быть выполнена работа с PDF файлами в 1С без внешних компонентов, в ходе которой страницы преобразуются в реальные PNG-картинки.

Сетевые пути и доступ

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

Резюме

Подводя итог, проанализируем лучший алгоритм действий:

  1. Откажитесь от локальных путей (file:///).
  2. Используйте Base64 только для очень маленьких иконок (1-2 Кб).
  3. Для полноценных изображений (логотипы, фото товаров) используйте метод CID (Content-ID).
  4. Всегда явно указывайте тип содержимого (MIME-Type) для вложений.
← На главную