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

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

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

Рассмотрим типичную ситуацию: у нас есть корректно работающий код, который отправляет письмо с PDF-вложением и HTML-текстом. Но как только мы пытаемся вставить в тег img источник в виде data:image/png;base64,..., система выдает критическую ошибку: «Ошибка при вызове метода контекста (Послать): Файл не обнаружен». При этом к строке Base64 автоматически добавляется префикс file:///. Выясним причину этой проблемы и разберем по шагам способы ее решения.

Почему возникает ошибка «Файл не обнаружен»?

Проанализируем ситуацию. Когда мы используем метод РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение, платформа 1С или служебные модули БСП анализируют содержимое HTML-текста. Если система встречает тег img с атрибутом src, она пытается определить, является ли это внешней ссылкой (URL), внутренним вложением (CID) или путем к файлу на диске.

В определенных версиях платформы и БСП внутренний парсер не распознает специфический формат data:image/... как встроенные двоичные данные. Вместо этого он ошибочно интерпретирует длинную строку Base64 как относительный или абсолютный путь к файлу в файловой системе сервера. Добавляя префикс file:///, система пытается «найти» файл, имя которого состоит из тысяч символов кода картинки. Естественно, такой путь не существует, и метод Послать() объекта ИнтернетПочтовоеСообщение выбрасывает исключение.

Решение №1: Правильная настройка параметров структуры письма

Самый простой способ решить проблему, если вы используете БСП, — это явно указать системе, как именно нужно обрабатывать текст письма. В структуре ПараметрыПисьма за это отвечают два ключевых поля: ТипТекста и ОбрабатыватьТексты. Для изучения остальных функций библиотеки и работы с их параметрами пригодится справочник по методам БСП с примерами использования.

Рассмотрим исправленный пример кода:


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

// Указываем специальный тип текста из перечисления БСП
ПараметрыПисьма.Вставить("ТипТекста", Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками);

// Отключаем автоматическую обработку (парсинг) текстов, чтобы БСП не пыталась найти файлы в Base64
ПараметрыПисьма.Вставить("ОбрабатыватьТексты", Ложь);

ПараметрыПисьма.Вставить("Вложения", Вложения);

ДоступныеУчетныеЗаписи = РаботаСПочтовымиСообщениями.ДоступныеУчетныеЗаписи(Истина);
УчетнаяЗапись = ДоступныеУчетныеЗаписи[0].Ссылка;

РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма);

Разберем, что мы изменили. Установка ТипТекста в значение HTMLСКартинками сообщает подсистеме почты, что внутри HTML могут содержаться связанные объекты. Однако критически важным здесь является параметр ОбрабатыватьТексты = Ложь. Он запрещает подсистеме БСП выполнять поиск локальных файлов по путям, указанным в src, тем самым предотвращая ошибочную подстановку префикса file:///.

Решение №2: Использование механизма CID (рекомендуемый подход)

Хотя вставка картинок через Base64 кажется удобной, это считается «плохим тоном» в верстке электронных писем. Многие почтовые клиенты (например, старые версии Outlook или мобильные приложения) блокируют такие изображения из соображений безопасности. Кроме того, Base64 увеличивает размер письма на 30–40%.

Более профессиональный и надежный метод — использование Content-ID (CID). Разберем этот алгоритм:

  1. Картинка добавляется в коллекцию Вложения не как обычный файл, а как связанный объект.
  2. В структуре вложения указывается уникальный идентификатор (например, "my_logo").
  3. В HTML-коде вместо длинной строки Base64 используется ссылка: <img src="cid:my_logo">.

Посмотрим на пример реализации такого подхода:


// 1. Подготавливаем вложения
Вложения = Новый СписокЗначений;

// Сохраняем картинку во временный файл или берем из двоичных данных
ДанныеКартинки = ПолучитьДвоичныеДанныеЛоготипа(); 
ИмяФайла = "logo.png";

// Формируем структуру вложения для БСП
СтруктураВложения = Новый Структура;
СтруктураВложения.Вставить("Представление", ИмяФайла);
СтруктураВложения.Вставить("Данные", ДанныеКартинки);
СтруктураВложения.Вставить("Идентификатор", "company_logo"); // Это и есть наш CID

Вложения.Добавить(СтруктураВложения);

// 2. Формируем HTML
ТекстHTML = "<html><body>";
ТекстHTML = ТекстHTML + "<h1>Здравствуйте!</h1>";
ТекстHTML = ТекстHTML + "<img src=""cid:company_logo"">"; // Ссылка на идентификатор
ТекстHTML = ТекстHTML + "<p>Текст вашего письма...</p>";
ТекстHTML = ТекстHTML + "</body></html>";

// 3. Отправляем через параметры
ПараметрыПисьма.Вставить("Тело", ТекстHTML);
ПараметрыПисьма.Вставить("ТипТекста", "HTML");
ПараметрыПисьма.Вставить("Вложения", Вложения);

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

Дополнительные советы по оформлению писем

Проанализируем еще несколько нюансов, которые помогут избежать ошибок при отправке:

Выяснив причину ошибки «Файл не обнаружен», мы понимаем, что она кроется в излишней «самостоятельности» механизмов 1С, пытающихся найти файлы там, где их нет. Использование параметра ОбрабатыватьТексты = Ложь или переход на использование CID — это проверенные способы сделать вашу отправку почты стабильной и корректной.

← На главную