При разработке механизмов рассылки из 1С программисты часто сталкиваются с необходимостью формирования красивых HTML-писем, содержащих изображения (логотипы, подписи, рекламные баннеры). Казалось бы, самый простой способ — встроить картинку прямо в код HTML, используя кодировку Base64. Однако при попытке отправить такое письмо методом Послать() объекта ИнтернетПочта система часто выдает критическую ошибку: «Файл не обнаружен 'file:///data:image/jpeg;base64...'». В этой статье мы подробно разберем, почему это происходит, и рассмотрим правильные способы вставки изображений, которые гарантированно работают во всех почтовых клиентах.
Проанализируем ситуацию с точки зрения работы платформы 1С. Когда мы передаем в объект ИнтернетПочтовоеСообщение текст в формате ТипТекстаПочтовогоСообщения.HTML, встроенные механизмы платформы пытаются выполнить предварительную обработку этого текста. Платформа сканирует теги img и их атрибуты src.
Если 1С видит в пути src ссылку, которая не начинается с протоколов http:// или https://, она автоматически предполагает, что перед ней путь к локальному файлу на компьютере или сервере. Поскольку строка Base64 (начинающаяся с data:image/...) не является сетевым адресом, 1С пытается найти такой файл в файловой системе, принудительно добавляя префикс file:///. Естественно, файл с таким именем не существует, что и приводит к аварийному завершению метода Послать().
Даже если бы нам удалось обойти это ограничение платформы, использование Base64 в теле письма считается плохим тоном в разработке по нескольким причинам:
Рассмотрим наиболее правильный и надежный способ — использование связанных вложений. Идея заключается в том, что картинка прикрепляется к письму как вложение, но не отображается в списке файлов, а выводится внутри текста письма по специальному идентификатору.
Разберем по шагам, как это реализовать программно:
1. Сначала подготовим HTML-шаблон, где в теге изображения вместо пути укажем ссылку на cid:.
ТекстHTML = "
|<html>
|<body>
| <h1>Здравствуйте!</h1>
| <p>Вот наше изображение:</p>
| <img src=""cid:my_unique_image_id"">
|</body>
|</html>";
2. Создадим объект сообщения и добавим в него вложение, указав тот же идентификатор в свойстве Идентификатор.
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Тексты.Добавить(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);
// Путь к картинке на диске сервера или временное хранилище
ПутьКФайлу = "C:\Pictures\logo.png";
КартинкаВложение = Сообщение.Вложения.Добавить(ПутьКФайлу, "Логотип");
// Ключевой момент: устанавливаем CID
КартинкаВложение.Идентификатор = "my_unique_image_id";
Проанализируем этот код: когда почтовый клиент получит такое письмо, он увидит тег img со ссылкой на cid. Он заглянет в список вложений, найдет там файл с соответствующим идентификатором и отобразит его прямо в тексте. Это стандарт индустрии, который поддерживается всеми современными программами.
Посмотрим на более «автоматизированный» способ, который предоставляет платформа 1С. Объект ФорматированныйДокумент умеет самостоятельно обрабатывать изображения и готовить их к отправке. Это особенно удобно, если пользователь сам редактирует текст письма в экранной форме.
Рассмотрим пример кода:
// Предположим, у нас есть объект ФорматированныйДокумент
ТекстПисьма = Новый ФорматированныйДокумент;
// Извлекаем HTML и структуру вложений (картинок)
СтруктураВложений = Новый Структура;
ТекстHTML = "";
ТекстПисьма.ПолучитьHTML(ТекстHTML, СтруктураВложений);
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Тексты.Добавить(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);
// Автоматически добавляем все картинки, которые были в документе
Для Каждого Вложение Из СтруктураВложений Цикл
ДанныеКартинки = Вложение.Значение; // Это объект Картинка
ИмяФайла = Вложение.Ключ; // Имя, которое сгенерировала 1С
НовоеВложение = Сообщение.Вложения.Добавить(ДанныеКартинки.ПолучитьДвоичныеДанные(), ИмяФайла);
НовоеВложение.Идентификатор = ИмяФайла;
КонецЦикла;
Использование ФорматированныйДокумент позволяет не заботиться о ручном присвоении идентификаторов cid. Платформа сама расставит их в HTML и вернет вам структуру с картинками, где ключами будут именно те идентификаторы, которые прописаны в src.
Существует еще один интересный нюанс работы 1С. Если в HTML-тексте указать прямой путь к файлу на диске (например, src="C:\Temp\img.jpg"), то при вызове метода Послать() платформа может попытаться сама найти эти файлы и вложить их в письмо. Однако этот метод ненадежен, так как сильно зависит от настроек прав доступа и того, на какой стороне (клиент или сервер) выполняется код.
Проанализируем важный параметр: ОбработкаТекстаИнтернетПочтовогоСообщения.
Если вы используете метод Почта.Послать(Сообщение, ОбработкаТекстаИнтернетПочтовогоСообщения.Обрабатывать), 1С попытается выполнить подстановку. Однако мы рекомендуем использовать Решение №1 (явное указание CID), так как оно дает полный контроль над процессом и исключает ошибки «Файл не обнаружен» из-за неправильной интерпретации путей.
Выясним главные правила при работе с картинками в почте 1С:
src для отправки почты — это гарантированный путь к ошибке или блокировке письма.Вложения объекта сообщения.Идентификатор во вложении в точности совпадал с тем, что написано в src="cid:...".ФорматированныйДокумент, который сделает большую часть работы за вас.Соблюдение этих рекомендаций позволит вам создавать профессиональные рассылки, которые будут корректно отображаться у всех получателей, вне зависимости от их почтового сервиса или настроек безопасности.