При настройке автоматической отправки писем из системы 1С:Предприятие разработчики часто сталкиваются с необходимостью красиво оформить тело письма. Логичным решением кажется отправка сверстанного HTML-шаблона со встроенными графическими элементами (логотипами компании, изображениями товаров или подписями). Однако при попытке внедрить картинку напрямую в HTML-код с помощью кодирования в Base64 (конструкция data:image/...;base64) платформа генерирует критическую ошибку:
«Ошибка при вызове метода контекста (Послать): Файл не обнаружен 'file:///data:image/png;base64,...'»
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем внутренние механизмы работы почтового клиента 1С и реализуем два способа решения проблемы: быстрый обход ошибки и методологически правильный стандарт отправки писем со встроенными изображениями.
Давайте проанализируем ситуацию. По умолчанию при вызове метода Послать() объекта ИнтернетПочта платформа запускает автоматический парсер HTML-содержимого письма. Этот парсер предназначен для того, чтобы облегчить жизнь разработчику: он ищет все теги <img> с внешними или локальными ссылками на картинки, пытается самостоятельно загрузить эти файлы с диска или из сети, автоматически преобразует их во вложения письма и заменяет пути в HTML на внутренние ссылки.
Проблема заключается в том, что парсер платформы 1С не умеет распознавать данные в формате Base64 внутри тега src. Вместо того чтобы проигнорировать строку, начинающуюся с data:image/png;base64, система ошибочно принимает ее за относительный путь к файлу на компьютере. Платформа пытается нормализовать этот путь, принудительно подставляя в начало префикс локального протокола file:///, после чего пытается найти этот «файл» на диске. Разумеется, файла с таким именем не существует, и система выбрасывает исключение.
Если вам по какой-то причине критически важно отправить письмо именно в формате 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. Получатель вашего письма, скорее всего, увидит пустой квадрат с красным крестиком вместо красивой картинки. Поэтому мы настоятельно рекомендуем использовать второй способ.
Общепринятым мировым стандартом внедрения изображений в HTML-письма является технология CID. Вместо кодирования картинки в текстовую строку, мы прикрепляем файл изображения к письму как обычное вложение, но присваиваем ему уникальный идентификатор. В самом HTML-коде мы ссылаемся на этот идентификатор с помощью префикса cid:.
Давайте по шагам разберем, как правильно реализовать этот механизм в коде 1С:
Вложения объекта ИнтернетПочтовоеСообщение.Идентификатор. Это произвольная уникальная строка (например, имя файла без расширения).<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: дает разработчику и бизнесу несколько весомых преимуществ:
multipart/related.width и height) и обтеканием текста.Применяйте правильные стандарты верстки электронных писем в своих интеграционных механизмах 1С, и ваши пользователи всегда будут видеть корректно оформленные уведомления без сбоев в работе программы!