Как отправить письмо с картинкой из 1С и избежать ошибки «Файл не обнаружен»

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

При разработке механизмов рассылки из 1С программисты часто сталкиваются с необходимостью формирования красивых HTML-писем, содержащих изображения (логотипы, подписи, рекламные баннеры). Казалось бы, самый простой способ — встроить картинку прямо в код HTML, используя кодировку Base64. Однако при попытке отправить такое письмо методом Послать() объекта ИнтернетПочта система часто выдает критическую ошибку: «Файл не обнаружен 'file:///data:image/jpeg;base64...'». В этой статье мы подробно разберем, почему это происходит, и рассмотрим правильные способы вставки изображений, которые гарантированно работают во всех почтовых клиентах.

Выясним причину ошибки: почему Base64 не работает напрямую

Проанализируем ситуацию с точки зрения работы платформы 1С. Когда мы передаем в объект ИнтернетПочтовоеСообщение текст в формате ТипТекстаПочтовогоСообщения.HTML, встроенные механизмы платформы пытаются выполнить предварительную обработку этого текста. Платформа сканирует теги img и их атрибуты src.

Если 1С видит в пути src ссылку, которая не начинается с протоколов http:// или https://, она автоматически предполагает, что перед ней путь к локальному файлу на компьютере или сервере. Поскольку строка Base64 (начинающаяся с data:image/...) не является сетевым адресом, 1С пытается найти такой файл в файловой системе, принудительно добавляя префикс file:///. Естественно, файл с таким именем не существует, что и приводит к аварийному завершению метода Послать().

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

  1. Блокировка почтовиками: Microsoft Outlook и многие другие корпоративные клиенты блокируют отображение Base64 из соображений безопасности.
  2. Объем письма: Кодирование изображения в Base64 увеличивает его размер на 30–40%, что может привести к попаданию письма в спам-фильтры из-за слишком большого размера тела (RFC рекомендует не превышать 100 КБ для HTML-части).
  3. Разрыв строк: Почтовые протоколы требуют, чтобы длина строки не превышала 998 символов. Огромная непрерывная строка Base64 может быть принудительно обрезана сервером, что «сломает» картинку.

Решение №1: Использование механизма CID (Content-ID)

Рассмотрим наиболее правильный и надежный способ — использование связанных вложений. Идея заключается в том, что картинка прикрепляется к письму как вложение, но не отображается в списке файлов, а выводится внутри текста письма по специальному идентификатору.

Разберем по шагам, как это реализовать программно:

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. Он заглянет в список вложений, найдет там файл с соответствующим идентификатором и отобразит его прямо в тексте. Это стандарт индустрии, который поддерживается всеми современными программами.

Решение №2: Использование объекта ФорматированныйДокумент

Посмотрим на более «автоматизированный» способ, который предоставляет платформа 1С. Объект ФорматированныйДокумент умеет самостоятельно обрабатывать изображения и готовить их к отправке. Это особенно удобно, если пользователь сам редактирует текст письма в экранной форме.

Рассмотрим пример кода:


// Предположим, у нас есть объект ФорматированныйДокумент
ТекстПисьма = Новый ФорматированныйДокумент;

// Извлекаем HTML и структуру вложений (картинок)
СтруктураВложений = Новый Структура;
ТекстHTML = "";
ТекстПисьма.ПолучитьHTML(ТекстHTML, СтруктураВложений);

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

// Автоматически добавляем все картинки, которые были в документе
Для Каждого Вложение Из СтруктураВложений Цикл
    ДанныеКартинки = Вложение.Значение; // Это объект Картинка
    ИмяФайла = Вложение.Ключ;           // Имя, которое сгенерировала 1С
    
    НовоеВложение = Сообщение.Вложения.Добавить(ДанныеКартинки.ПолучитьДвоичныеДанные(), ИмяФайла);
    НовоеВложение.Идентификатор = ИмяФайла;
КонецЦикла;

Использование ФорматированныйДокумент позволяет не заботиться о ручном присвоении идентификаторов cid. Платформа сама расставит их в HTML и вернет вам структуру с картинками, где ключами будут именно те идентификаторы, которые прописаны в src.

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

Существует еще один интересный нюанс работы 1С. Если в HTML-тексте указать прямой путь к файлу на диске (например, src="C:\Temp\img.jpg"), то при вызове метода Послать() платформа может попытаться сама найти эти файлы и вложить их в письмо. Однако этот метод ненадежен, так как сильно зависит от настроек прав доступа и того, на какой стороне (клиент или сервер) выполняется код.

Проанализируем важный параметр: ОбработкаТекстаИнтернетПочтовогоСообщения. Если вы используете метод Почта.Послать(Сообщение, ОбработкаТекстаИнтернетПочтовогоСообщения.Обрабатывать), 1С попытается выполнить подстановку. Однако мы рекомендуем использовать Решение №1 (явное указание CID), так как оно дает полный контроль над процессом и исключает ошибки «Файл не обнаружен» из-за неправильной интерпретации путей.

Подведем итоги

Выясним главные правила при работе с картинками в почте 1С:

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

← На главную