Как отправить макет 1С в теле письма в виде картинки

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

Часто перед разработчиками 1С встает задача автоматической отправки уведомлений или открыток, сформированных на основе макетов. Стандартный метод сохранения в PDF или Excel подразумевает отправку файла как вложения, что не всегда удобно, если мы хотим, чтобы получатель увидел изображение сразу при открытии письма. Рассмотрим, как программно преобразовать макет в графический файл и правильно внедрить его в тело письма.

Понимание проблемы: почему прямые ссылки не работают

Многие разработчики совершают ошибку, пытаясь вставить в HTML-код письма путь к файлу на сервере, используя конструкцию вида <img src="file:///C:/temp/image.jpg" />. Важно понимать, что почтовый клиент получателя будет искать этот файл на его локальном компьютере, где его, конечно же, нет. Чтобы картинка отображалась корректно, она должна стать частью самого почтового сообщения.

Шаг 1: Преобразование макета в графический формат

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

Используем метод Записать объекта ТабличныйДокумент:


ИмяВременногоФайла = ПолучитьИмяВременногоФайла("jpg");
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.JPG);

Шаг 2: Правильное внедрение изображения в письмо

Чтобы изображение не отображалось как вложение, а было встроено в тело письма, необходимо использовать механизм Content-ID (CID). Это позволяет связать HTML-тег img с конкретным объектом внутри структуры почтового сообщения.

  1. Сначала сформируем текст письма в формате HTML, где вместо пути к файлу укажем идентификатор: <img src="cid:имя_картинки" />.
  2. Затем добавим этот файл в коллекцию Вложения объекта ИнтернетПочтовоеСообщение.
  3. Укажем свойство Идентификатор для вложения, которое должно в точности совпадать с тем, что мы прописали в cid.

Пример реализации кода

Разберем, как объединить эти действия в программный алгоритм:


// 1. Сохраняем макет во временный файл
ИмяФайлаКартинки = ПолучитьИмяВременногоФайла("jpg");
ТабличныйДокумент.Записать(ИмяФайлаКартинки, ТипФайлаТабличногоДокумента.JPG);

// 2. Формируем HTML-тело письма
ИдентификаторКартинки = "MyImage";
ТелоHTML = "<html><body><img src='cid:" + ИдентификаторКартинки + "' /></body></html>";

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

// 4. Добавляем картинку как вложение с CID
Вложение = ПочтовоеСообщение.Вложения.Добавить(ИмяФайлаКартинки);
Вложение.Идентификатор = ИдентификаторКартинки;
Вложение.ИмяФайла = "postcard.jpg";

Почему стоит избегать использования сторонних библиотек

В ходе обсуждений часто возникают идеи использовать COM-объекты, внешние exe-файлы или сторонние серверные компоненты для конвертации файлов. Мы настоятельно рекомендуем избегать таких решений по следующим причинам:

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

← На главную