Часто перед разработчиками 1С встает задача автоматической отправки уведомлений или открыток, сформированных на основе макетов. Стандартный метод сохранения в PDF или Excel подразумевает отправку файла как вложения, что не всегда удобно, если мы хотим, чтобы получатель увидел изображение сразу при открытии письма. Рассмотрим, как программно преобразовать макет в графический файл и правильно внедрить его в тело письма.
Многие разработчики совершают ошибку, пытаясь вставить в HTML-код письма путь к файлу на сервере, используя конструкцию вида <img src="file:///C:/temp/image.jpg" />. Важно понимать, что почтовый клиент получателя будет искать этот файл на его локальном компьютере, где его, конечно же, нет. Чтобы картинка отображалась корректно, она должна стать частью самого почтового сообщения.
Первым делом нам необходимо сохранить наш ТабличныйДокумент как полноценный файл изображения. 1С позволяет сделать это стандартными средствами без использования сторонних виртуальных принтеров или внешних утилит, что критически важно для стабильности системы при переходе на другие ОС или архитектуры.
Используем метод Записать объекта ТабличныйДокумент:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("jpg");
ТабличныйДокумент.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.JPG);
Чтобы изображение не отображалось как вложение, а было встроено в тело письма, необходимо использовать механизм Content-ID (CID). Это позволяет связать HTML-тег img с конкретным объектом внутри структуры почтового сообщения.
HTML, где вместо пути к файлу укажем идентификатор: <img src="cid:имя_картинки" />.Вложения объекта ИнтернетПочтовоеСообщение.Идентификатор для вложения, которое должно в точности совпадать с тем, что мы прописали в cid.Разберем, как объединить эти действия в программный алгоритм:
// 1. Сохраняем макет во временный файл
ИмяФайлаКартинки = ПолучитьИмяВременногоФайла("jpg");
ТабличныйДокумент.Записать(ИмяФайлаКартинки, ТипФайлаТабличногоДокумента.JPG);
// 2. Формируем HTML-тело письма
ИдентификаторКартинки = "MyImage";
ТелоHTML = "<html><body><img src='cid:" + ИдентификаторКартинки + "' /></body></html>";
// 3. Подготавливаем почтовое сообщение
ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;
ПочтовоеСообщение.Тексты.Добавить(ТелоHTML, ТипТекстаПочтовогоСообщения.HTML);
// 4. Добавляем картинку как вложение с CID
Вложение = ПочтовоеСообщение.Вложения.Добавить(ИмяФайлаКартинки);
Вложение.Идентификатор = ИдентификаторКартинки;
Вложение.ИмяФайла = "postcard.jpg";
В ходе обсуждений часто возникают идеи использовать COM-объекты, внешние exe-файлы или сторонние серверные компоненты для конвертации файлов. Мы настоятельно рекомендуем избегать таких решений по следующим причинам:
Linux.ARM, внешние компоненты часто оказываются несовместимыми или требуют сложной настройки безопасности.Следуя данному подходу, вы обеспечите пользователям получение красивых и информативных писем, а себе — надежный и поддерживаемый код, который не вызовет проблем при масштабировании или смене серверного окружения.