Столкнулся с проблемой отправки электронных писем с вложением файла в формате HTML - многие почтовые клиенты блокируют картинки в HTML вложениях из-за угрозы безопасности или из-за попадания писем в спам. Есть варианты прописать DKIM и SPF для доменных почт, но мы же тут про 1С все-таки, сделаем по своему. Было принято решение конвертировать HTML в PDF в самой 1С, но типовых методов или функций в конфиге нет. В интернете есть какие-то статьи про вставку html в табличный документ с последующей отправкой - проверил, не работает, поэтому используем другой универсальный метод. Для конвертации HTML в PDF можно использовать различные конвертеры, список для ознакомления:
https://habr.com/ru/post/134505/
Наиболее подходящий и удобный в использовании для 1C - wkhtmltopdf.
Дальше речь пойдет именно о том, как его внедрить и использовать.
1. Установка: ссылка для скачивания. Устанавливается он в каталог "C:\Program Files\wkhtmltopdf\bin", файл exe можно перенести в другое место для удобства.
2. Конвертер адаптирован для работы в командной строке, синтаксис: "wkhtmltopdf http://google.com google.pdf"
Соответственно: wkhtmltopdf - путь к файлу exe, "http://google.com" - HTML страница, "google.pdf" - сохраняемый PDF файл
3. Запуск из 1С
Используем метод ЗапуститьПриложение(<СтрокаКоманды>, <ТекущийКаталог>, <ДождатьсяЗавершения>, <КодВозврата>)
Пример:
КаталогСДокументами = "C:\Users\Public\pdf\docs\";
Имя = Строка(Новый УникальныйИдентификатор);
Приложение = "C:\Users\Public\pdf\wkhtmltopdf ";
ЗапуститьПриложение(Приложение + КаталогСДокументами + Имя + ".html " + КаталогСДокументами + Имя + ".pdf",,Истина);
- СтрокаКоманды это и есть основной синтаксис конвертера, прописываем полный путь к исполняемому файлу:
Приложение = "C:\Users\Public\pdf\wkhtmltopdf ";
и вслед за ним указываем полный путь к файлу HTML и будущее имя сохраняемого файла PDF, все это указывается через пробел без точек, запятых и т.д.
- ДождатьсяЗавершения - параметр, отвечающий за ожидание окончательного выполнения команды. Если его не указать и после этого сразу, например попытаться вставить файл pdf во вложение электронного письма, возможно команда еще будет конвертировать файл и конвертер не успеет сохранить файл на диск, тем самым спровоцирует ошибку.
*предварительно нужно сохранить файл HTML на диск в путь "КаталогСДокументами + Имя + ".html"", чтобы к нему обратиться. Вероятно можно работать с Временными файлами, но потестив я понял, что wkntmltopdf их не видит.
Таким образом, мы получаем сохраненный pdf файл на диск и можем к нему обратиться по адресу "КаталогСДокументами + Имя + ".pdf""
Если команда каким-то образом не смогла сконвертировать файл, тогда файл не сохранится и можно выполнить проверку:
Процедура Пример()
////
Если ФайлСуществует(КаталогСДокументами + Имя + ".pdf") Тогда
Вложение = Новый ДвоичныеДанные(КаталогСДокументами + Имя + ".pdf");
Письмо.Вложения.Добавить(Вложение, "ИмяДокумента".pdf" );
УдалитьФайлы(СтрЗаменить(КаталогСДокументами, "docs\", "docs"),"*" + ".html");
УдалитьФайлы(СтрЗаменить(КаталогСДокументами, "docs\", "docs"),"*" + ".pdf");
Иначе
////
КонецЕсли;
КонецПроцедуры
Функция ФайлСуществует(ПутьКФайлу)
Файл = Новый Файл(ПутьКФайлу);
Возврат Файл.Существует();
КонецФункции
Удаление файлов необязательно, но желательно.
Работает, насколько я знаю, начиная с 1С 8.2. Тестировалось на 8.3.