Форматированный документ - преобразование вставленных картинок (скриншотов) для почтового сообщения

19.04.16

Разработка - Универсальные функции

Алгоритм преобразования картинок в читабельный веб-формат

Проблема, решаемая в данной статье, следующая.

В БСП и других конфигурациях есть встроенный "почтовик". В нем есть возможность создать письмо в формате html. Для этого используется объект ФорматированныйДокумент. В этот объем в т.ч. можно через буфер обмена вставить скриншот.

Проблема в том, что картинки письма, отправленного в таком виде, для получателя будут не видны.

Техническая проблема выражается в том, что текст html выглядит так: <img src='data:image/png;base64,[строка base]'>, где параметр [строка base] содержит двоичные данные картинки, преобразованной по base64. Для движка mail.ru или любого другого сервера (кроме самой 1С) - это будет непонятный набор символов, поэтому получатель ничего и не увидит.

Чтобы решить эту проблему, нужно преобразовать src в общепринятый вид и поместить картинку как вложение. Ниже приводится алгоритм, который это и делает. Данный алгоритм для БСП был помещен в общий модуль РаботаСПочтовымиСообщениямиСлужебный в функцию ОтправитьСообщение перед строкой Текст = Письмо.Тексты.Добавить(Тело).

Вот сам алгоритм:

	ЗаменяемыеКартинки = Новый Соответствие; //!!!
	
	ПозицияПоиска = 1;
	Пока Истина Цикл
		Позиция_img = СтрНайти(Тело,"<img ",,ПозицияПоиска); //!!!
		Если Позиция_img = 0 Тогда Прервать; КонецЕсли;
		
		ПозицияЗакрывающийАтрибут = СтрНайти(Тело,">",,Позиция_img); //!!!
		
		КартинкаВХ = "src='data:image/png;base64,";
		Позиция_src = СтрНайти(Тело,КартинкаВХ,,Позиция_img);
		
		Если Позиция_src > ПозицияЗакрывающийАтрибут Тогда 
			ПозицияПоиска = ПозицияЗакрывающийАтрибут;
			Продолжить;
		КонецЕсли;
		
		ПозицияНачалоКартинки = Позиция_src + СтрДлина(КартинкаВХ);
		ПозицияКонецКартинки = СтрНайти(Тело,"'",,ПозицияНачалоКартинки);
		
		Строка_base64 = Сред(Тело,ПозицияНачалоКартинки,ПозицияКонецКартинки-ПозицияНачалоКартинки);
		ДвоичныеДанныеКартинки = Base64Значение(Строка_base64);
		
		ЗаменяемыеКартинки.Вставить(КартинкаВХ+Строка_base64+"'",ДвоичныеДанныеКартинки);
		
		ПозицияПоиска = ПозицияКонецКартинки;
	КонецЦикла;
	
	Для Каждого ЗаменяемаяКартинка Из ЗаменяемыеКартинки Цикл
		ИдентификаторКартинки = Новый УникальныйИдентификатор;
		ИдентификаторКартинки = СтрЗаменить(ИдентификаторКартинки,"-","_");
		
		НовоеВложение = Письмо.Вложения.Добавить(ЗаменяемаяКартинка.Значение,ИдентификаторКартинки);
		НовоеВложение.Идентификатор = ИдентификаторКартинки;
		НовоеВложение.ТипСодержимого = "image/png";
		
		Тело = СтрЗаменить(Тело,ЗаменяемаяКартинка.Ключ,"src=""cid:"+ИдентификаторКартинки+"""");
	КонецЦикла;

 

Может быть, кому-то пригодится.

Вступайте в нашу телеграмм-группу Инфостарт

ФорматированныйДокумент

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    5314    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    9855    DeerCven    15    

64

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    60740    dimanich70    85    

175

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8389    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    76137    atdonya    31    

74

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    10511    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4612 22.04.16 15:06 Сейчас в теме
2. Meta 72 13.07.18 10:16 Сейчас в теме
Пригодилось! Очень во время! Огромное спасибо!

Только типовой модуль не обязательно править. Можно обработать у себя и в параметры для типовой процедуры отправки передать текст и вложения.
Там просто вместо двоичных данных адрес на них надо передавать, а идентификатор предусмотрен.
Для отправки сообщения требуется регистрация/авторизация