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

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:"+ИдентификаторКартинки+"""");
	КонецЦикла;

 

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

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

См. также

Печать любых непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать любые печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

3480 руб.

22.08.2023    786    1    0    

1

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    3016    YA_418728146    3    

84

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    13182    100    sapervodichka    106    

118

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    6309    quazare    8    

103

Хитрости СКД. Часть 3

СКД Универсальные функции Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Столкнулся с тем, что мне приходится писать гору отчетов. Во многих приходится использовать повторяющиеся приемы. Решил написать шпаргалку, которая, надеюсь пригодится не только мне. В этой статье: Объединение ячеек в отчете только на определенном уровне иерархии, Постобработка итогов в табличном документе, Скрытие колонок в зависимости от количества месяцев в периоде.

28.05.2022    7648    milkers    11    

87

Базовые принципы работы с регламентными заданиями подсистем БСП

Универсальные функции БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В очередной публикации рассмотрим некоторые базовые приемы работы с регламентными заданиями в рамках библиотеки стандартных подсистем

22.05.2022    12344    quazare    25    

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

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