Отправка уведомлений, счетов или отчетов с логотипами и изображениями товаров — стандартная задача для многих учетных систем. Однако при попытке вставить изображение непосредственно в тело письма (HTML) разработчики часто сталкиваются с тем, что у получателя картинка отображается как "битая" (красный крестик), либо платформа 1С начинает зависать при отправке. В данной статье мы подробно разберем, почему возникают эти ошибки, проанализируем различные методы вставки изображений и найдем наиболее надежное решение.
Рассмотрим самую распространенную ошибку, с которой начал автор темы. В HTML-коде письма часто пытаются указать прямой путь к файлу на диске отправителя.
Текст = "
|<h3> Привет! </h3>
|Вот картинка: <img src=""file:///F:/Base/Image.png"" />
|";
Давайте разберемся, что происходит в этот момент. Атрибут src указывает почтовому клиенту (Outlook, Thunderbird, веб-браузер), откуда загрузить изображение. Схема file:/// ссылается на локальную файловую систему компьютера того, кто читает письмо.
Когда вы тестируете отправку на своем же компьютере, картинка отображается, потому что файл действительно лежит у вас на диске F. Но когда письмо получает клиент, его почтовая программа пытается найти диск F и этот файл уже на его компьютере. Естественно, файла там нет. Именно поэтому использование прямых путей к файлам недопустимо.
Один из способов передать картинку — превратить её в текст и вшить прямо в HTML-код. Для этого используется кодировка Base64.
Алгоритм действий следующий:
ДвоичныеДанные.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%.
Наиболее правильным и стабильным способом является использование механизма 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:
В ходе обсуждения проблемы выяснилась интересная деталь: иногда код написан верно, но картинка все равно "битая".
Проверка формата файла
Причиной может стать файл: например, пользователю прислали PDF-документ, у которого просто переименовали расширение в .png. Почтовые клиенты не смогут его отрисовать. Если ваша задача — отправить страницы документа, то сначала должна быть выполнена работа с PDF файлами в 1С без внешних компонентов, в ходе которой страницы преобразуются в реальные PNG-картинки.
Сетевые пути и доступ
Если ваш код выполняется НаСервере, помните о правах доступа. Сервер 1С должен иметь доступ к файлам. Если картинки лежат в сети, используйте UNC-пути и убедитесь, что у службы сервера есть права на чтение этой папки.
Подводя итог, проанализируем лучший алгоритм действий:
file:///).