СоздатьПисьмо (БСП)

Автор: 1С
ОбщийМодуль.Взаимодействия
БСП

Создать письмо. Шаблоны сообщений.

////////////////////////////////////////////////////////////////////////////////
// Шаблоны сообщений.

Функция СоздатьПисьмо(Сообщение, УчетнаяЗапись) Экспорт
	
	РезультатОтправкиПисьма = Новый Структура("Отправлено, ОписаниеОшибки", Ложь);
	
	ПисьмоHTML = (Сообщение.ДополнительныеПараметры.ФорматПисьма = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML);
	
	НачатьТранзакцию();
	Попытка
		
		Письмо = Документы.ЭлектронноеПисьмоИсходящее.СоздатьДокумент();
		
		Письмо.Автор                    = Пользователи.ТекущийПользователь();
		Письмо.Ответственный            = Пользователи.ТекущийПользователь();
		Письмо.Дата                     = ТекущаяДатаСеанса();
		Письмо.Важность                 = Перечисления.ВариантыВажностиВзаимодействия.Обычная;
		Письмо.Кодировка                = КодировкаТекста.UTF8;
		Письмо.ОтправительПредставление = Строка(УчетнаяЗапись);
		
		Если ПисьмоHTML Тогда
			
			Письмо.ТекстHTML = Сообщение.Текст;
			Письмо.Текст     = ПолучитьОбычныйТекстИзHTML(Сообщение.Текст);
			
		Иначе
			
			Письмо.Текст = Сообщение.Текст;
			
		КонецЕсли;
		
		Письмо.Тема = Сообщение.Тема;
		Письмо.ТипТекста = ?(ПисьмоHTML, Перечисления.ТипыТекстовЭлектронныхПисем.HTML, Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст);
		Письмо.УчетнаяЗапись = УчетнаяЗапись;
		Письмо.ВзаимодействиеОснование = Неопределено;
		
		// Заполним реквизиты ВключатьТелоИсходногоПисьма, ОтображатьТелоИсходногоПисьма, УведомитьОДоставке и УведомитьОПрочтении.
		НастройкиПользователя = ПолучитьПараметрыРаботыПользователяДляИсходящегоЭлектронногоПисьма(
		                           УчетнаяЗапись, Сообщение.ДополнительныеПараметры.ФорматПисьма, Истина);
		ЗаполнитьЗначенияСвойств(Письмо, НастройкиПользователя);
		
		Письмо.УдалятьПослеОтправки = Ложь;
		Письмо.Комментарий = КомментарийПоНаименованиюШаблона(Сообщение.ДополнительныеПараметры.Наименование);
		
		СписокПолучателейСпискомЗначений =( ТипЗнч(Сообщение.Получатель) = Тип("СписокЗначений"));
		Для Каждого ПолучательПисьма Из Сообщение.Получатель Цикл
			
			НоваяСтрока = Письмо["ПолучателиПисьма"].Добавить();
			
			Если СписокПолучателейСпискомЗначений Тогда
				НоваяСтрока.Адрес         = ПолучательПисьма.Значение;
				НоваяСтрока.Представление = ПолучательПисьма.Представление;
			Иначе
				НоваяСтрока.Адрес         = ПолучательПисьма.Адрес;
				НоваяСтрока.Представление = ПолучательПисьма.Представление;
				НоваяСтрока.Контакт       = ПолучательПисьма.ИсточникКонтактнойИнформации;
			КонецЕсли;
			
		КонецЦикла;
		
		Письмо.СписокПолучателейПисьма    = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Письмо.ПолучателиПисьма, Ложь);
		Письмо.СтатусПисьма = ?(ОбщегоНазначения.ИнформационнаяБазаФайловая(),
			Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик,
			Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее);
		
		Письмо.ЕстьВложения = (Сообщение.Вложения.Количество() > 0);
		РазмерВложений  = 0;
		РазмерыВложений = Новый Соответствие;
		Для Каждого Вложение Из Сообщение.Вложения Цикл
			
			Размер = ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище).Размер() * 1.5;
			РазмерВложений = РазмерВложений + Размер;
			РазмерыВложений.Вставить(Вложение.АдресВоВременномХранилище, Размер);
			
			// Если у идентификатора не английские символы, то письмо может быть некорректно обработано.
			Если ЗначениеЗаполнено(Вложение.Идентификатор) Тогда
				Идентификатор = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(Вложение.Идентификатор);
				Письмо.ТекстHTML = СтрЗаменить(Письмо.ТекстHTML, "cid:" + Вложение.Идентификатор, "cid:" + Идентификатор);
				Вложение.Идентификатор = Идентификатор;
			КонецЕсли;
			
		КонецЦикла;
		
		Письмо.Размер = РазмерВложений + СтрДлина(Письмо.Тема) * 2
			+ ?(ПисьмоHTML, СтрДлина(Письмо.ТекстHTML), СтрДлина(Письмо.Текст)) * 2;
		Письмо.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее;
		
		Письмо.Записать();
		
		// Добавим вложения
		Для Каждого Вложение Из Сообщение.Вложения Цикл
			
			МодульУправлениеЭлектроннойПочтой = ОбщегоНазначения.ОбщийМодуль("УправлениеЭлектроннойПочтой");
			Если ПустаяСтрока(Вложение.Идентификатор) Тогда
				
				МодульУправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(Письмо.Ссылка,
					Вложение.АдресВоВременномХранилище, Вложение.Представление, РазмерыВложений[Вложение.АдресВоВременномХранилище]);
					
			ИначеЕсли ПисьмоHTML Тогда
				
				ПрисоединенныйФайл = МодульУправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(Письмо.Ссылка,
					Вложение.АдресВоВременномХранилище, Вложение.Представление, РазмерыВложений[Вложение.АдресВоВременномХранилище]);
				
				Если ПрисоединенныйФайл <> Неопределено Тогда
					ПрисоединенныйФайлОбъект = ПрисоединенныйФайл.ПолучитьОбъект();
					ПрисоединенныйФайлОбъект.ИДФайлаЭлектронногоПисьма = Вложение.Идентификатор;
					ПрисоединенныйФайлОбъект.Записать();
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЦикла;
		
		Если Сообщение.ДополнительныеПараметры.Свойство("Предмет") И ЗначениеЗаполнено(Сообщение.ДополнительныеПараметры.Предмет) Тогда
			Предмет = Сообщение.ДополнительныеПараметры.Предмет;
		Иначе
			Предмет = Письмо.Ссылка;
		КонецЕсли;
	
		Реквизиты       = СтруктураРеквизитовВзаимодействияДляЗаписи(Предмет, Истина);
		Реквизиты.Папка = ОпределитьПапкуДляПисьма(Письмо.Ссылка);
		
		РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаписатьПредметыПапкиВзаимодействий(Письмо.Ссылка, Реквизиты);
		
		ЗафиксироватьТранзакцию();
		
	Исключение
		
		ОтменитьТранзакцию();
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ШаблонТекстаСообщения = НСтр("ru = 'Не удалось сформировать письмо по причине:
		|%1'");
		
		ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(),
			УровеньЖурналаРегистрации.Ошибка,, Письмо,
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)));
			
		РезультатОтправкиПисьма.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Возврат РезультатОтправкиПисьма;
		
	КонецПопытки;
		
	Попытка
		ИдентификаторПисьма = ВыполнитьОтправкуПисьма(Письмо);
	Исключение
		
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ШаблонТекстаСообщения = НСтр("ru = 'Не удалось отправить письмо по причине:
				|%1'");
				
		ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(),
			УровеньЖурналаРегистрации.Ошибка,, Письмо,
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)));
		
		РезультатОтправкиПисьма.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Возврат РезультатОтправкиПисьма;
		
	КонецПопытки;
	
	Если НЕ Письмо.УдалятьПослеОтправки Тогда
		
		Попытка
			Письмо.ИдентификаторСообщения = ИдентификаторПисьма;
			Письмо.СтатусПисьма           = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено;
			Письмо.ДатаОтправления        = ТекущаяДатаСеанса();
			Письмо.Записать(РежимЗаписиДокумента.Запись);
			
			ВзаимодействияВызовСервера.УстановитьПапкуЭлектронногоПисьма(
				Письмо.Ссылка, ОпределитьПапкуДляПисьма(Письмо.Ссылка));
		Исключение
				
			ИнформацияОбОшибке = ИнформацияОбОшибке();
			ШаблонТекстаСообщения = НСтр("ru = 'Не удалось сохранить письмо в программе после успешной отправки по причине:
				|%1'");
				
			ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(),
				УровеньЖурналаРегистрации.Ошибка,, Письмо,
				СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)));
				
			РезультатОтправкиПисьма.Отправлено     = Истина;
			РезультатОтправкиПисьма.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаСообщения, КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
			Возврат РезультатОтправкиПисьма;

		КонецПопытки;
		
	Иначе
		
		Письмо.Прочитать();
		Письмо.Удалить();
		
	КонецЕсли;
	
	РезультатОтправкиПисьма.Отправлено = Истина;
	Возврат РезультатОтправкиПисьма;
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

СоздатьSMS (БСП)

СоздатьЭлектронноеПисьмо (БСП)

СоздатьНовоеПисьмо (БСП)

СоздатьНовоеПисьмоПодготовитьВложения (БСП)

СоздатьНовоеПисьмоПроверкаУчетнойЗаписиВыполнена (БСП)

ПредставлениеПисьма (БСП)

ОтправлятьПисьмаВФорматеHTML (БСП)

ОткрытьВложениеПисьмо (БСП)

УстановитьТекстПисьма (БСП)

Обновлятор-1С: групповое (пакетное) обновление и обслуживание всех баз за один раз