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

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

При настройке автоматической отправки писем из системы 1С:Предприятие разработчики часто сталкиваются с необходимостью красиво оформить тело письма. Логичным решением кажется отправка сверстанного HTML-шаблона со встроенными графическими элементами (логотипами компании, изображениями товаров или подписями). Однако при попытке внедрить картинку напрямую в HTML-код с помощью кодирования в Base64 (конструкция data:image/...;base64) платформа генерирует критическую ошибку:

«Ошибка при вызове метода контекста (Послать): Файл не обнаружен 'file:///data:image/png;base64,...'»

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

Выясняем причину: почему 1С ищет несуществующий файл?

Давайте проанализируем ситуацию. По умолчанию при вызове метода Послать() объекта ИнтернетПочта платформа запускает автоматический парсер HTML-содержимого письма. Этот парсер предназначен для того, чтобы облегчить жизнь разработчику: он ищет все теги <img> с внешними или локальными ссылками на картинки, пытается самостоятельно загрузить эти файлы с диска или из сети, автоматически преобразует их во вложения письма и заменяет пути в HTML на внутренние ссылки.

Проблема заключается в том, что парсер платформы 1С не умеет распознавать данные в формате Base64 внутри тега src. Вместо того чтобы проигнорировать строку, начинающуюся с data:image/png;base64, система ошибочно принимает ее за относительный путь к файлу на компьютере. Платформа пытается нормализовать этот путь, принудительно подставляя в начало префикс локального протокола file:///, после чего пытается найти этот «файл» на диске. Разумеется, файла с таким именем не существует, и система выбрасывает исключение.


Способ 1. Быстрое решение — отключение обработки текста письма

Если вам по какой-то причине критически важно отправить письмо именно в формате Base64 (например, если шаблон генерируется сторонним сервисом и вы не можете его переверстать), мы можем принудительно запретить платформе 1С анализировать HTML-код.

Для этого при вызове метода Послать() необходимо использовать второй параметр и передать в него системное перечисление ОбработкаТекстаИнтернетПочтовогоСообщения.НеОбрабатывать. Рассмотрим подробнее, как будет выглядеть измененный код:


// Создаем почтовый профиль и подключаемся к серверу
Профиль = Новый ИнтернетПочтовыйПрофиль;
// Заполните параметры вашего SMTP-сервера...

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

// Формируем HTML со встроенной в Base64 картинкой
СтрокаПисьма = "<div><p>Логотип нашей компании:</p><img src=""data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="" alt=""Логотип"" /></div>";

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

Письмо.Тема = "Тестовое письмо с логотипом";
Письмо.Отправитель.Адрес = "sender@company.com";
Письмо.Получатели.Добавить("recipient@company.com");

Попытка
    Почта.Подключиться(Профиль);
    // Важно: вторым параметром указываем НеОбрабатывать
    Почта.Послать(Письмо, ОбработкаТекстаИнтернетПочтовогоСообщения.НеОбрабатывать);
    Почта.Отключиться();
    Сообщить("Письмо успешно отправлено!");
Исключение
    Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;

Важное предупреждение: Хотя этот способ мгновенно убирает ошибку в 1С, у него есть огромный минус, связанный со спецификой работы почтовых клиентов. Большинство популярных программ (включая Microsoft Outlook, Gmail, Mail.ru) в целях безопасности и борьбы со спамом полностью блокируют или вырезают изображения, встроенные через Base64. Получатель вашего письма, скорее всего, увидит пустой квадрат с красным крестиком вместо красивой картинки. Поэтому мы настоятельно рекомендуем использовать второй способ.


Способ 2. Правильное решение — использование технологии CID (Content-ID)

Общепринятым мировым стандартом внедрения изображений в HTML-письма является технология CID. Вместо кодирования картинки в текстовую строку, мы прикрепляем файл изображения к письму как обычное вложение, но присваиваем ему уникальный идентификатор. В самом HTML-коде мы ссылаемся на этот идентификатор с помощью префикса cid:.

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

  1. Подготовка файла изображения. Нам необходимо получить файл картинки. Это может быть временный файл, сохраненный из хранилища значений информационной базы, или картинка с локального диска сервера.
  2. Добавление во вложения. Мы добавляем файл в коллекцию Вложения объекта ИнтернетПочтовоеСообщение.
  3. Установка идентификатора. Для созданного вложения мы обязательно заполняем свойство Идентификатор. Это произвольная уникальная строка (например, имя файла без расширения).
  4. Привязка в HTML. В тексте письма в теге <img> в качестве источника пишем src="cid:[НашИдентификатор]".

Рассмотрим пример кода, реализующий этот подход. В данном примере мы предполагаем, что у нас есть картинка логотипа, сохраненная во временный каталог на сервере:


// 1. Подготовим пути и файлы
ИмяФайлаКартинки = "logo.png";
ПутьККартинке = КаталогВременныхФайлов() + ИмяФайлаКартинки;

// (Опционально) Если картинка хранится в базе в двоичных данных:
// ДвоичныеДанныеКартинки.Записать(ПутьККартинке);

// 2. Создаем почтовое сообщение
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Официальное письмо компании";
Письмо.Отправитель.Адрес = "sender@company.com";
Письмо.Получатели.Добавить("recipient@company.com");

// Уникальный идентификатор для связывания HTML и вложения
ИдентификаторКартинки = "company_logo_id_2026";

// 3. Формируем HTML-текст с использованием cid:
СтрокаHTML = "<html><body>"
           + "<p>Здравствуйте! Благодарим вас за сотрудничество.</p>"
           + "<p><img src=""cid:" + ИдентификаторКартинки + """ alt=""Наш Логотип"" width=""150""/></p>"
           + "<p>С уважением, команда техподдержки.</p>"
           + "</body></html>";

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

// 4. Добавляем картинку во вложения и связываем ее по CID
Вложение = Письмо.Вложения.Добавить(ПутьККартинке);
Вложение.Идентификатор = ИдентификаторКартинки;

// 5. Отправка сообщения
Профиль = Новый ИнтернетПочтовыйПрофиль;
// Настройки подключения к SMTP...

Почта = Новый ИнтернетПочта;
Попытка
    Почта.Подключиться(Профиль);
    // При использовании CID метод автообработки работает корректно
    Почта.Послать(Письмо);
    Почта.Disconnect();
    Сообщить("Письмо со встроенным изображением успешно отправлено!");
Исключение
    Сообщить("Не удалось отправить письмо: " + ОписаниеОшибки());
КонецПопытки;

// Очищаем временный файл после отправки
Попытка
    УдалитьФайлы(ПутьККартинке);
Исключение
    // Запись лога, если файл занят системой
КонецПопытки;

Преимущества использования CID перед другими методами

Перевод писем на технологию cid: дает разработчику и бизнесу несколько весомых преимуществ:

Применяйте правильные стандарты верстки электронных писем в своих интеграционных механизмах 1С, и ваши пользователи всегда будут видеть корректно оформленные уведомления без сбоев в работе программы!

← На главную