Электронное письмо исходящее / Форма документа / Модуль формы

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

#Область ОписаниеПеременных

&НаКлиенте
Перем КонтекстВыбора;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	УстановитьУсловноеОформление();
	
	ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
	
	Объект.ТекстHTML = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Объект.ТекстHTML);
	
	Если Объект.Ссылка.Пустая() Тогда
		Рассмотрено = Истина;
		ПриСозданииИПриЧтенииНаСервере();
		Взаимодействия.УстановитьПредметПоДаннымЗаполнения(Параметры, Предмет);
		ИзменилисьКонтакты = Истина;
	КонецЕсли;
	
	Взаимодействия.ЗаполнитьСписокВыбораДляРассмотретьПосле(Элементы.РассмотретьПосле.СписокВыбора);
	ЗапрещенныеРасширения = РаботаСФайламиСлужебный.СписокЗапрещенныхРасширений();
	
	// Подготовить оповещения взаимодействий.
	Взаимодействия.ПодготовитьОповещения(ЭтотОбъект,Параметры);
	
	// СтандартныеПодсистемы.Свойства
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		ДополнительныеПараметры = Новый Структура;
		ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "СтраницаДополнительныеРеквизиты");
		ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.Свойства
	
	// СтандартныеПодсистемы.ШаблоныСообщений
	ОпределитьВозможностьЗаполненияПисьмаПоШаблону();
	// Конец СтандартныеПодсистемы.ШаблоныСообщений
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
		МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды       
	
	СостояниеОтправкиПисем = СостояниеОтправкиПисем();
	Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость = СостояниеОтправкиПисем.ОтправкаПриостановлена;
	Элементы.ПредупреждениеОНеотправленныхПисьмахНадпись.Заголовок = СостояниеОтправкиПисем.ТекстПредупреждения;
	
	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.УточнитьКонтакты.Заголовок                  = НСтр("ru = 'Сохранить адреса в контакты'");
		Элементы.УточнитьКонтакты.Отображение                = ОтображениеКнопки.Текст;
		Элементы.ГруппаЛево.ВыравниваниеЭлементовИЗаголовков = ВариантВыравниванияЭлементовИЗаголовков.ЭлементыПравоЗаголовкиЛево;
		Элементы.Тема.ПоложениеЗаголовка                     = ПоложениеЗаголовкаЭлементаФормы.Верх;
		Элементы.ГруппаВложения.ОтображатьЗаголовок          = Истина;
		Элементы.ГруппаПолучатели.ОтображатьЗаголовок        = Истина;
		Элементы.СохранитьВложение.Отображение               = ОтображениеКнопки.Картинка;
		Элементы.УдалитьВложение.Отображение                 = ОтображениеКнопки.Картинка;
		Элементы.УдалитьВложение.ПоложениеВКоманднойПанели   = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели;
	КонецЕсли;
	
	ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	// СтандартныеПодсистемы.Свойства
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.Свойства
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
		МодульПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
	УправлениеДоступностью();

	Интервал = ?(Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость, 60, 600);
	ПодключитьОбработчикОжидания("ПроверитьСостояниеОтправкиПисем", Интервал, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

	// СтандартныеПодсистемы.Свойства
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		Если МодульУправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
			ОбновитьЭлементыДополнительныхРеквизитов();
			МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
		КонецЕсли;
	КонецЕсли;
	// Конец СтандартныеПодсистемы.Свойства
	
	ВзаимодействияКлиент.ОтработатьОповещение(ЭтотОбъект, ИмяСобытия, Параметр, Источник);

	Если ИмяСобытия = "Запись_ПрисоединенныйФайл" Тогда
		Если ТипЗнч(Источник) = Тип("СправочникСсылка.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы") Тогда
			
			ВложенияТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
			Если ВложенияТекущиеДанные = Неопределено Тогда
				Возврат;
			КонецЕсли;
			РеквизитыФайла = РеквизитыФайла(Источник);
			ЗаполнитьЗначенияСвойств(ВложенияТекущиеДанные, РеквизитыФайла);
			ВложенияТекущиеДанные.РазмерПредставление = 
				ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(РеквизитыФайла.Размер);
			ВложенияТекущиеДанные.ИмяФайла = ?(ПустаяСтрока(РеквизитыФайла.Расширение),
			                                   РеквизитыФайла.Наименование,
			                                   РеквизитыФайла.Наименование + "." + РеквизитыФайла.Расширение);
		КонецЕсли;
	КонецЕсли;
	
	// СтандартныеПодсистемы.ШаблоныСообщений
	Если ИмяСобытия = "Запись_ШаблоныСообщений" Тогда
		ОпределитьВозможностьЗаполненияПисьмаПоШаблону();
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ШаблоныСообщений
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	
	Перем СтрокаНачало, СтрокаКонец, КолонкаНачало, КолонкаКонец;
	Перем НачалоВыделения, КонецВыделения;
	
	Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Документ.ЭлектронноеПисьмоИсходящее.Форма.ФормированиеВнешнейСсылкиНаОбъект") Тогда
		
		Если ФорматСообщения = ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст") Тогда
			Элементы.ТекстПисьма.ПолучитьГраницыВыделения(СтрокаНачало, КолонкаНачало, СтрокаКонец, КолонкаКонец);
			
			ТекстПисьма = РезультатВставкиТекстаВПисьмо(ТекстПисьма, СтрокаНачало, КолонкаНачало, КолонкаКонец, ВыбранноеЗначение);
			
		Иначе
			
			Элементы.ТекстПисьмаФорматированныйДокумент.ПолучитьГраницыВыделения(НачалоВыделения, КонецВыделения);
			ТекстПисьмаФорматированныйДокумент.Вставить(НачалоВыделения, ВыбранноеЗначение);
			
		КонецЕсли;
	
	ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ЖурналДокументов.Взаимодействия.Форма.ПараметрыЭлектронногоПисьма") Тогда
		
		Если ВыбранноеЗначение <> Неопределено И Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено") Тогда
			
			Объект.УведомитьОДоставке          = ВыбранноеЗначение.УведомитьОДоставке;
			Объект.УведомитьОПрочтении         = ВыбранноеЗначение.УведомитьОПрочтении;
			Объект.ВключатьТелоИсходногоПисьма = ВыбранноеЗначение.ВключатьТелоИсходногоПисьма;
			Модифицированность = Истина;
			
		КонецЕсли;
		
	ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.АдреснаяКнига")
		ИЛИ ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.УточнениеКонтактов") Тогда
		
		ЗаполнитьПодобранныхПолучателейПослеВыбора(ВыбранноеЗначение);
		
	Иначе
		
		ВзаимодействияКлиент.ФормаОбработкаВыбора(ЭтотОбъект, ВыбранноеЗначение, ИсточникВыбора, КонтекстВыбора);
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	
	ВключитьНебезопасноеСодержимое = Ложь;
	
	Взаимодействия.УстановитьРеквизитыФормыВзаимодействияПоДаннымРегистра(ЭтотОбъект);
	ПриСозданииИПриЧтенииНаСервере();
	
	Объект.ТекстHTML = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Объект.ТекстHTML);
	
	// СтандартныеПодсистемы.Свойства
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.Свойства
	
	// СтандартныеПодсистемы.УправлениеДоступом
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.УправлениеДоступом
	
	// СтандартныеПодсистемы.ПодключаемыеКоманды
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
		МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
	ОчиститьСообщения();
	
	Если Не ВыполняетсяОтправка Тогда
		
		Если ПроверитьЗаполнениеСписковАдресатов() Тогда
			Отказ = Истина;
		КонецЕсли;
		
		Если Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик") 
			ИЛИ Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено") Тогда
			ВзаимодействияКлиент.ПроверкаЗаполненностиРеквизитовОтложеннойОтправки(Объект, Отказ);
		КонецЕсли;
		
		Если Отказ Тогда
			Возврат;
		КонецЕсли;
		
	КонецЕсли;
	
#Если Не ВебКлиент Тогда
		Для Каждого СтрокаТаблицыВложений Из Вложения Цикл
			Если СтрокаТаблицыВложений.Расположение = 2 Тогда
				Попытка
					Данные = Новый ДвоичныеДанные(СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере);
					СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(Данные, "");
					СтрокаТаблицыВложений.Расположение = 4;
				Исключение
					ОбщегоНазначенияКлиент.СообщитьПользователю(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),,"Вложения",, Отказ);
				КонецПопытки;
			КонецЕсли;
		КонецЦикла;
#КонецЕсли
	
	Объект.ЕстьВложения = (Вложения.Количество() <> 0);
	
	ЗаполнитьТабличныеЧастиПоСпискуПолучателей();
	
	Объект.СписокПолучателейПисьма =
		ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиПисьма, Ложь);
	Объект.СписокПолучателейКопий =
		ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиКопий, Ложь);
	Объект.СписокПолучателейСкрытыхКопий = 
		ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиСкрытыхКопий, Ложь);
		
	Для Каждого Вложение Из Вложения Цикл
		
		Если Вложение.Расположение = 0 
			И Вложение.Редактируется Тогда
			
			ОписаниеОповещенияПомещенияФайла = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
			РаботаСФайламиКлиент.ПоместитьПрисоединенныйФайл(ОписаниеОповещенияПомещенияФайла, Вложение.Ссылка, УникальныйИдентификатор);
			
		КонецЕсли;

	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
	
	Если Не ЗавершениеРаботы
		И Модифицированность
		И Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик") Тогда
		
		ЕстьРедактируемыеФайлы = Ложь;
		МассивРедактируемыхФайлов = Новый Массив;
		
		Для Каждого Вложение Из Вложения Цикл
			
			Если Вложение.Редактируется Тогда
				ЕстьРедактируемыеФайлы = Истина;
				МассивРедактируемыхФайлов.Добавить(Вложение.Ссылка);
			КонецЕсли;
			
		КонецЦикла;
		
		Если ЕстьРедактируемыеФайлы Тогда
			
			Отказ                = Истина;
			СтандартнаяОбработка = Ложь;
			
			ТекстВопроса = НСтр("ru = 'Данные были изменены, Записать?'");
			ДополнительныеПараметры = Новый Структура;
			ДополнительныеПараметры.Вставить("МассивРедактируемыхФайлов", МассивРедактируемыхФайлов);
			ОповещениеПослеВопросаОЗакрытии = Новый ОписаниеОповещения("ПослеВопросаПриЗакрытии", ЭтотОбъект, ДополнительныеПараметры);
			
			ПоказатьВопрос(ОповещениеПослеВопросаОЗакрытии, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена);
			
		КонецЕсли;
		
	КонецЕсли;
		
КонецПроцедуры

&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, РежимЗаписи, РежимПроведения)
	
	ДокументHTMLТекущегоПисьмаПодготовлен = Ложь;
	
	// Подготовим документ HTML из содержимого форматированного документа.
	Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML
		 И ТекущийОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда
		
		ТаблицаСоответствийИменВложенийИдентификаторам.Очистить();
		
		СтруктураВложений = Новый Структура;
		ТекстПисьмаФорматированныйДокумент.ПолучитьHTML(ТекущийОбъект.ТекстHTML, СтруктураВложений);
		Для каждого Вложение Из СтруктураВложений Цикл
			
			НоваяСтрока = ТаблицаСоответствийИменВложенийИдентификаторам.Добавить();
			НоваяСтрока.ИмяФайла = Вложение.Ключ;
			НоваяСтрока.ИдентификаторФайлаДляHTML = Новый УникальныйИдентификатор;
			НоваяСтрока.Картинка = Вложение.Значение;
			
		КонецЦикла;
		
		Если ТаблицаСоответствийИменВложенийИдентификаторам.Количество() > 0 Тогда
			
			ДокументHTML = Взаимодействия.ПолучитьОбъектДокументHTMLИзТекстаHTML(ТекущийОбъект.ТекстHTML);
			Взаимодействия.ЗаменитьИменаКартинокНаИдентификаторыПочтовыхВложенийВHTML(
			    ДокументHTML, ТаблицаСоответствийИменВложенийИдентификаторам.Выгрузить());
			ДокументHTMLТекущегоПисьмаПодготовлен = Истина;
			
		КонецЕсли;
		
	Иначе
		
		ТекущийОбъект.Текст = ТекстПисьма;
		
	КонецЕсли;
	
	Если НеобходимаОбработкаПисьмаОснования() Тогда
		
		Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда
			
			ТекущийОбъект.ТекстHTML = СформироватьТекстПисьмаВключаяПисьмоОснование(
				?(ДокументHTMLТекущегоПисьмаПодготовлен,ДокументHTML,Неопределено), ТекущийОбъект);
				
			ТекущийОбъект.Текст = Взаимодействия.ПолучитьОбычныйТекстИзHTML(ТекущийОбъект.ТекстHTML);
			
		Иначе
			
			ТекущийОбъект.Текст = СформироватьТекстПисьмаВключаяПисьмоОснование(Неопределено, ТекущийОбъект);
			
		КонецЕсли;
		
	Иначе
		
		Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда
			
			Если ДокументHTMLТекущегоПисьмаПодготовлен Тогда
			
				ТекущийОбъект.ТекстHTML = Взаимодействия.ПолучитьТекстHTMLИзОбъектаДокументHTML(ДокументHTML);
				
			КонецЕсли;
	
			ТекущийОбъект.Текст     = Взаимодействия.ПолучитьОбычныйТекстИзHTML(ТекущийОбъект.ТекстHTML);
			
		КонецЕсли;
		
	КонецЕсли;
	
	Если Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда
		
		ТекущийОбъект.ПисьмаВложения.Очистить();
		ИндексСтроки = 1;
		Для Каждого Вложение Из Вложения Цикл
			
			Если Вложение.Расположение = 5 И ЗначениеЗаполнено(Вложение.Письмо) Тогда
				НоваяСтрока = ТекущийОбъект.ПисьмаВложения.Добавить();
				НоваяСтрока.Письмо                     = Вложение.Письмо;
				НоваяСтрока.ПорядковыйНомерВоВложениях = ИндексСтроки;
			КонецЕсли;
			
			ИндексСтроки =  ИндексСтроки + 1;
			
		КонецЦикла;
		
	КонецЕсли;
	
	Если ВыполняетсяОтправка И Не ОтправлятьСообщенияСразу Тогда
		
		ТекущийОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее;
		
	КонецЕсли;
	
	Если Объект.СтатусПисьма <> ТекущийСтатусПисьма 
		И ТекущийОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее 
		И Не ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML")
		И (ТипЗнч(ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее")
		ИЛИ ТипЗнч(ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее"))
		И ТипТекстаВходящегоПисьма = Перечисления.ТипыТекстовЭлектронныхПисем.HTML Тогда
		
		ТекущийОбъект.ЕстьВложения = Истина;
		
	КонецЕсли;
	
	ТекущийОбъект.Размер = ОценитьРазмерПисьма();
	
	// СтандартныеПодсистемы.Свойства
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.Свойства
	
	Взаимодействия.ПередЗаписьюВзаимодействияИзФормы(ЭтотОбъект, ТекущийОбъект, ИзменилисьКонтакты);
	
КонецПроцедуры

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
	
	Взаимодействия.ПриЗаписиВзаимодействияИзФормы(ТекущийОбъект, ЭтотОбъект);
	
	Если Объект.СтатусПисьма <> Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	
	Письмо = ТекущийОбъект.Ссылка;
	
	Блокировка = Новый БлокировкаДанных;
	ЭлементБлокировкиДанных = Блокировка.Добавить("Справочник.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы");
	ЭлементБлокировкиДанных.УстановитьЗначение("ВладелецФайла", Письмо);
	РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаблокироватьПредметыПапокВзаимодействий(Блокировка, Письмо);
	Блокировка.Заблокировать();
	
	// Добавим в список удаленных вложений ранее сохраненные картинки, отображаемые в теле форматированного документа.
	ТаблицаВложенийКартинокФорматированногоДокумента = Взаимодействия.ПолучитьВложенияПисьмаСНеПустымИД(Письмо);
	Для каждого Вложение Из ТаблицаВложенийКартинокФорматированногоДокумента Цикл
		УдаленныеВложения.Добавить(Вложение.Ссылка);
	КонецЦикла;
	
	// Удалим удаленные вложения
	Для Каждого УдаленноеВложение Из УдаленныеВложения Цикл
		ОбъектВложение = УдаленноеВложение.Значение.ПолучитьОбъект();
		ОбъектВложение.Удалить();
	КонецЦикла;
	УдаленныеВложения.Очистить();
	
	Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда
		
		Для каждого Вложение Из ТаблицаСоответствийИменВложенийИдентификаторам Цикл
			
			ДвоичныеДанныеКартинки = Вложение.Картинка.ПолучитьДвоичныеДанные();
			АдресКартинкиВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
			
			ПараметрыВложения = Новый Структура;
			ПараметрыВложения.Вставить("ИмяФайла", "_" + СтрЗаменить(Вложение.ИдентификаторФайлаДляHTML, "-", "_"));
			ПараметрыВложения.Вставить("Размер", ДвоичныеДанныеКартинки.Размер());
			ПараметрыВложения.Вставить("ИДФайлаЭлектронногоПисьма", Вложение.ИдентификаторФайлаДляHTML);
			
			УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(
				Письмо, АдресКартинкиВоВременномХранилище, ПараметрыВложения);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Если НеобходимаОбработкаПисьмаОснования() Тогда
		
		ВложенияПисьмаОснования = Взаимодействия.ПолучитьВложенияПисьмаСНеПустымИД(Объект.ВзаимодействиеОснование);
		
		Для Каждого Вложение Из ВложенияПисьмаОснования Цикл
			
			ДвоичныеДанныеКартинки = РаботаСФайлами.ДвоичныеДанныеФайла(Вложение.Ссылка);
			АдресКартинкиВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
			
			ПараметрыВложения = Новый Структура;
			ПараметрыВложения.Вставить("ИмяФайла", Вложение.Наименование);
			ПараметрыВложения.Вставить("Размер", Вложение.Размер);
			ПараметрыВложения.Вставить("ИДФайлаЭлектронногоПисьма", Вложение.ИДФайлаЭлектронногоПисьма);
			
			УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(
				Письмо, АдресКартинкиВоВременномХранилище, ПараметрыВложения);
			
		КонецЦикла;
		
	КонецЕсли;
	
	Для Каждого СтрокаТаблицыВложений Из Вложения Цикл
		
		Размер = 0;
		ИмяФайла = СтрокаТаблицыВложений.ИмяФайла;
		
		Если СтрокаТаблицыВложений.Расположение = 4 Тогда
			// из временного хранилища
			
			ПараметрыВложения = Новый Структура;
			ПараметрыВложения.Вставить("ИмяФайла", ИмяФайла);
			ПараметрыВложения.Вставить("Размер", Размер);
			
			УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(
				Письмо, СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере, ПараметрыВложения);
			
		ИначеЕсли СтрокаТаблицыВложений.Расположение = 3 Тогда
			// из файла на сервере
			
		ИначеЕсли СтрокаТаблицыВложений.Расположение = 2 Тогда
			// из файла на компьютере
			
			ДвоичныеДанные = Новый ДвоичныеДанные(СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере);
			АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
			
			ПараметрыВложения = Новый Структура;
			ПараметрыВложения.Вставить("ИмяФайла", ИмяФайла);
			ПараметрыВложения.Вставить("Размер", Размер);
			
			УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(
				Письмо, АдресВременногоХранилищаФайла, ПараметрыВложения);
			
		ИначеЕсли СтрокаТаблицыВложений.Расположение = 1 Тогда
			
			УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаСкопировавВложениеДругогоПисьма(
				Письмо, СтрокаТаблицыВложений.Ссылка, УникальныйИдентификатор);
			
		ИначеЕсли СтрокаТаблицыВложений.Расположение = 0 Тогда
			// перезаписать вложение
			
		КонецЕсли;
		
		СтрокаТаблицыВложений.Расположение = 0;
		
	КонецЦикла;
	
	Если Объект.СтатусПисьма <> ТекущийСтатусПисьма Тогда
		ПрикрепитьВходящееПисьмоОснованиеКакВложениеЕслиНеобходимо(ТекущийОбъект);
		Взаимодействия.УстановитьПапкуЭлектронногоПисьма(Письмо, 
			Взаимодействия.ОпределитьПапкуДляПисьмаПоУмолчанию(Письмо, Истина));
		ТекущийСтатусПисьма = Объект.СтатусПисьма;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)

	// СтандартныеПодсистемы.УправлениеДоступом
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
		МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
		МодульУправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.УправлениеДоступом
	
	ЗаполнитьВложения();
	Взаимодействия.УстановитьЗаголовокФормыЭлектронногоПисьма(ЭтотОбъект);
	УстановитьЗаголовокКнопкиПоУмолчанию();
	
	Элементы.СтраницаКомментарий.Картинка = ОбщегоНазначенияКлиентСервер.КартинкаКомментария(Объект.Комментарий);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)

	ВзаимодействияКлиент.ВзаимодействиеПредметПослеЗаписи(ЭтотОбъект, Объект,
		ПараметрыЗаписи, "ЭлектронноеПисьмоИсходящее");
		
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
		МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
		МодульПодключаемыеКомандыКлиент.ПослеЗаписи(ЭтотОбъект, Объект, ПараметрыЗаписи);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
	
	// СтандартныеПодсистемы.Свойства
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.Свойства
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура СтраницыОписаниеДополнительноПриСменеСтраницы(Элемент, ТекущаяСтраница)
	
	// СтандартныеПодсистемы.Свойства
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства")
		И ТекущаяСтраница.Имя = "СтраницаДополнительныеРеквизиты"
		И Не ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда
		
		СвойстваВыполнитьОтложеннуюИнициализацию();
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	// Конец СтандартныеПодсистемы.Свойства
	
КонецПроцедуры

&НаКлиенте
Процедура РассмотретьПослеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	ВзаимодействияКлиент.ОбработатьВыборВПолеРассмотретьПосле(
		РассмотретьПосле, ВыбранноеЗначение, СтандартнаяОбработка, Модифицированность);
	
КонецПроцедуры

&НаКлиенте
Процедура ПредставлениеОтправителяОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	Если Объект.УчетнаяЗапись <> ВыбранноеЗначение Тогда
		
		УчетнаяЗаписьДоИзменения = Объект.УчетнаяЗапись;
		Объект.УчетнаяЗапись = ВыбранноеЗначение;
		ЭлементСписка = Элемент.СписокВыбора.НайтиПоЗначению(ВыбранноеЗначение);
		Если ЭлементСписка <> Неопределено Тогда
			СтандартнаяОбработка = Ложь;
			Объект.ОтправительПредставление = ЭлементСписка.Представление;
		КонецЕсли;
		Модифицированность = Истина;
		ПодключитьОбработчикОжидания("ПослеИзмененияОтправителя", 0.1, Истина);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ТекстПисьмаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	
	ВзаимодействияКлиент.ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ТекстВходящегоПисьмаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	
	ВзаимодействияКлиент.ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПредметНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ВзаимодействияКлиент.ПредметНачалоВыбора(ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПредупреждениеОНебезопасномСодержимомОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	Если НавигационнаяСсылкаФорматированнойСтроки = "ВключитьНебезопасноеСодержимое" Тогда
		СтандартнаяОбработка = Ложь;
		ВключитьНебезопасноеСодержимое = Истина;
		ПрочитатьТекстВходящегоПисьмаHTML();
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПредупреждениеОНеотправленныхПисьмахНадписьОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)

	ВзаимодействияКлиент.ОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыВложения

&НаКлиенте
Процедура ВложенияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	ОткрытьВложениеВыполнить();
	
КонецПроцедуры

&НаКлиенте
Процедура ВложенияПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	Если Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик") Тогда
		ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВложенияПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	
	СтандартнаяОбработка = Ложь;
	
	МассивФайлов = Новый Массив;
	
	Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") Тогда
		
		МассивФайлов.Добавить(ПараметрыПеретаскивания.Значение);
		
	ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда
		
		Если ПараметрыПеретаскивания.Значение.Количество() >= 1
			И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда
			
			Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл
				Если ТипЗнч(ФайлПринятый) = Тип("Файл") Тогда
					МассивФайлов.Добавить(ФайлПринятый);
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
	КонецЕсли;
	
	Для Каждого ВыбранныйФайл Из МассивФайлов Цикл
		
		ДополнительныеПараметры = Новый Структура("ВыбранныйФайл", ВыбранныйФайл);
		ОписаниеОповещение = Новый ОписаниеОповещения("ПроверкаЭтоФайлПослеЗавершения", ЭтотОбъект, ДополнительныеПараметры);
		ВыбранныйФайл.НачатьПроверкуЭтоФайл(ОписаниеОповещение);
		
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокПолучателей

&НаКлиенте
Процедура СписокПолучателейПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	ОчиститьСообщения();
	
	Если Элементы.СписокПолучателей.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено") Тогда
		
		ВариантОтправки = Элементы.СписокПолучателей.ТекущиеДанные.ВариантОтправки;

		Если ВариантОтправки  = "Кому" Тогда
			ГруппаПодбора = "Кому";
		ИначеЕсли ВариантОтправки  = "Копия" Тогда
			ГруппаПодбора = "Копии";
		ИначеЕсли ВариантОтправки = "СкрытаяКопия" Тогда
			ГруппаПодбора = "Скрытые";
		КонецЕсли;
		
		РедактироватьСписокПолучателей(Истина, ГруппаПодбора);
	Иначе
		РедактироватьСписокПолучателей(Ложь);
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура СписокПолучателейПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
	
	Если ОтменаРедактирования Тогда
		Возврат;
	КонецЕсли;
	
	ДанныеСтроки = Элемент.ТекущиеДанные;
	Если ДанныеСтроки = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Адрес = "";
	ПозицияНачало = СтрНайти(ДанныеСтроки.Представление, "<");
	Если ПозицияНачало > 0 Тогда
		ПозицияОкончание = СтрНайти(ДанныеСтроки.Представление, ">", НаправлениеПоиска.СНачала, ПозицияНачало);
		Если ПозицияОкончание > 0 Тогда
			Адрес = Сред(ДанныеСтроки.Представление, ПозицияНачало + 1, ПозицияОкончание - ПозицияНачало - 1);
		КонецЕсли;
	КонецЕсли;
	
	Если ПустаяСтрока(Адрес) Тогда
		Адрес = ДанныеСтроки.Представление;
	КонецЕсли;
	
	Если ПустаяСтрока(Адрес) Тогда
		Возврат;
	КонецЕсли;
	
	Если СтрНайти(Адрес, "@") = 0 ИЛИ СтрНайти(Адрес, ".") = 0 Тогда
		ПодключитьОбработчикОжидания("ПоказатьПредупреждениеОНеобходимостиВвестиАдресЭлектроннойПочты", 0.1, Истина);
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	Элемент.ТекущиеДанные.Адрес = СокрЛП(Адрес);

	Отбор = Новый Структура("Адрес", Адрес);
	НайденныеСтроки = СписокПолучателей.НайтиСтроки(Отбор);
	Если НайденныеСтроки.Количество() > 1 Тогда
		ШаблонТекстаОшибки = НСтр("ru = 'Адрес %1 уже есть в списке.'");
		ОбщегоНазначенияКлиент.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки, Адрес)
			,, "СписокПолучателей[" + Формат(СписокПолучателей.Индекс(НайденныеСтроки[0]), "ЧГ=0") + "].Представление");
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	ИзменилисьКонтакты = Истина;

КонецПроцедуры

&НаКлиенте
Процедура СписокПолучателейПредставлениеАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
	Если Ожидание = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Если ПустаяСтрока(Текст) Тогда
		Возврат;
	КонецЕсли;
	
	ДанныеВыбора = НайтиКонтакты(Текст);
	Если ДанныеВыбора.Количество() > 0 Тогда
		СтандартнаяОбработка = Ложь;
	Иначе
		ДанныеВыбора = Неопределено;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПолучателейПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
	Если НоваяСтрока Тогда
		Элемент.ТекущиеДанные.ВариантОтправки = "Кому";
		Элемент.ТекущийЭлемент = Элементы.СписокПолучателейПредставление;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СписокПолучателейПредставлениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда
		ТекущиеДанные = Элементы.СписокПолучателей.ТекущиеДанные;
		ТекущиеДанные.Адрес         = ВыбранноеЗначение.Адрес;
		ТекущиеДанные.Представление = ВзаимодействияКлиентСервер.ПолучитьПредставлениеАдресата(ВыбранноеЗначение.Представление, ВыбранноеЗначение.Адрес, "");
		ТекущиеДанные.Контакт       = ВыбранноеЗначение.Контакт;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокПолучателейПередУдалением(Элемент, Отказ)
	Если СписокПолучателей.Количество() = 1 Тогда
		Отказ = Истина;
		СписокПолучателей[0].Представление = "";
		СписокПолучателей[0].Адрес = "";
		СписокПолучателей[0].Контакт = Неопределено;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура СписокПолучателейПриИзменении(Элемент)
	
	ЗаполнитьТабличныеЧастиПоСпискуПолучателей();
	ВзаимодействияКлиентСервер.ПроверитьЗаполнениеКонтактов(Объект, ЭтотОбъект, "ЭлектронноеПисьмоИсходящее");
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ОтправитьПереслатьВыполнить(Команда)
	
	ОчиститьСообщения();
	
	Если Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено") Тогда
		ПереслатьВыполнить();
		Возврат;
	КонецЕсли;
		
	Если ПроверитьЗаполнениеСписковАдресатов() Тогда
		Возврат;
	КонецЕсли;
	
	Если СписокПолучателей.Количество() = 0 Тогда
		
		ОбщегоНазначенияКлиент.СообщитьПользователю(
			НСтр("ru = 'Укажите хотя бы одного получателя письма.'"),, "СписокПолучателей");
		Возврат;
		
	ИначеЕсли (СписокПолучателей.Количество() = 1 И ПустаяСтрока(СписокПолучателей[0].Адрес)) Тогда
		
		ОбщегоНазначенияКлиент.СообщитьПользователю(
			НСтр("ru = 'Укажите хотя бы одного получателя письма.'"),, "СписокПолучателей[0].Представление");
		Возврат;
		
	КонецЕсли;
	
	ОтправитьВыполнить();
	
КонецПроцедуры

&НаКлиенте
Процедура ФорматHTML(Команда)
	
	Если ФорматСообщения <> ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.HTML") Тогда
		
		ФорматСообщения = ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.HTML");
		ФорматСообщенияПриИзменении();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ФорматОбычныйТекст(Команда)
	
	Если ФорматСообщения <> ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст") Тогда
		
		ФорматСообщения = ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст");
		ФорматСообщенияПриИзменении();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтображатьТекстПисьмаОснования(Команда)
	
	Элементы.ОтображатьТекстПисьмаОснования.Пометка = НЕ Элементы.ОтображатьТекстПисьмаОснования.Пометка;
	Элементы.ГруппаВходящее.Видимость = Элементы.ОтображатьТекстПисьмаОснования.Пометка;
	Объект.ОтображатьТелоИсходногоПисьма = Не Объект.ОтображатьТелоИсходногоПисьма;
	
КонецПроцедуры

&НаКлиенте
Процедура УточнитьКонтакты(Команда)
	
	РедактироватьСписокПолучателей(Ложь);
	
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыПисьма(Команда)
	
	ТекстИдентификаторы = Новый Массив;
	ТекстИдентификаторы.Добавить("Идентификатор сообщения:  " + Объект.ИдентификаторСообщения);
	ТекстИдентификаторы.Добавить("Идентификатор основания:  " + Объект.ИдентификаторОснования);
	ТекстИдентификаторы.Добавить("Идентификаторы оснований: " 
	                                   + ПолучитьПредставлениеИдентификаторовОснований(Объект.ИдентификаторыОснований));
	
	СтруктураПараметры = Новый Структура;
	СтруктураПараметры.Вставить("Создано", Объект.Дата);
	СтруктураПараметры.Вставить("Отправлено", Объект.ДатаОтправления);
	СтруктураПараметры.Вставить("УведомитьОДоставке", Объект.УведомитьОДоставке);
	СтруктураПараметры.Вставить("УведомитьОПрочтении", Объект.УведомитьОПрочтении);
	СтруктураПараметры.Вставить("ЗаголовкиИнтернета", СтрСоединить(ТекстИдентификаторы, Символы.ПС));
	СтруктураПараметры.Вставить("Письмо", Объект.Ссылка);
	СтруктураПараметры.Вставить("ТипПисьма", "ЭлектронноеПисьмоИсходящее");
	СтруктураПараметры.Вставить("Кодировка", Объект.Кодировка);
	СтруктураПараметры.Вставить("ВнутреннийНомер", Объект.Номер);
	СтруктураПараметры.Вставить("ВключатьТелоИсходногоПисьма", Объект.ВключатьТелоИсходногоПисьма);
	СтруктураПараметры.Вставить("УчетнаяЗапись", Объект.УчетнаяЗапись);
	
	ОткрытьФорму("ЖурналДокументов.Взаимодействия.Форма.ПараметрыЭлектронногоПисьма", СтруктураПараметры, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ВставитьВнешнююСсылкуНаОбъектИнформационнойБазы(Команда)
	
	ОткрытьФорму("Документ.ЭлектронноеПисьмоИсходящее.Форма.ФормированиеВнешнейСсылкиНаОбъект",,ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ВажностьВысокая(Команда)
	
	Объект.Важность = ПредопределенноеЗначение("Перечисление.ВариантыВажностиВзаимодействия.Высокая");
	Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьВысокая;
	Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Высокая важность'");
	Элементы.ВажностьДекорация.Картинка = БиблиотекаКартинок.ВажностьВысокая;
	Элементы.ВажностьДекорация.Подсказка = НСтр("ru = 'Высокая важность'");
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ВажностьОбычная(Команда)
	
	Объект.Важность = ПредопределенноеЗначение("Перечисление.ВариантыВажностиВзаимодействия.Обычная");
	Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьНеЗадана;
	Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Обычная важность'");
	Элементы.ВажностьДекорация.Картинка = БиблиотекаКартинок.ВажностьНеЗадана;
	Элементы.ВажностьДекорация.Подсказка = НСтр("ru = 'Обычная важность'");
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ВажностьНизкая(Команда)
	
	Объект.Важность = ПредопределенноеЗначение("Перечисление.ВариантыВажностиВзаимодействия.Низкая");
	Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьНизкая;
	Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Низкая важность'");
	Элементы.ВажностьДекорация.Картинка = БиблиотекаКартинок.ВажностьНизкая;
	Элементы.ВажностьДекорация.Подсказка = НСтр("ru = 'Низкая важность'");
	Модифицированность = Истина;
	
КонецПроцедуры

// СтандартныеПодсистемы.Свойства

&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
	КонецЕсли;
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.Свойства

// СтандартныеПодсистемы.ШаблоныСообщений

&НаКлиенте
Процедура СформироватьПоШаблону(Команда)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда
		
		ЗаполнитьТабличныеЧастиПоСпискуПолучателей();
		
		МодульШаблоныСообщенийКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ШаблоныСообщенийКлиент");
		Оповещение = Новый ОписаниеОповещения("ЗаполнитьПоШаблонуПослеВыбораШаблона", ЭтотОбъект);
		ПредметСообщения = ?(ЗначениеЗаполнено(Предмет), Предмет, "Общий");
		МодульШаблоныСообщенийКлиент.ПодготовитьСообщениеПоШаблону(ПредметСообщения, "Письмо", Оповещение);
		
	КонецЕсли
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.ШаблоныСообщений

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();
	
	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.Тема.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.СтатусПисьма");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено;

	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Ложь);

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.ВложенияКонтекстноеМенюСвойстваВложения.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.СтатусПисьма");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик;

	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
	// Список вариантов отправки
	ОбщегоНазначения.УстановитьУсловноеОформлениеСпискаВыбора(ЭтотОбъект, "СписокПолучателейВариантОтправки", "СписокПолучателей.ВариантОтправки");

КонецПроцедуры

&НаКлиенте
Процедура НаКонтролеПриИзменении()
	
	УправлениеДоступностью();
	
	Рассмотрено = НЕ НаКонтроле;
	Модифицированность = Истина;
	
КонецПроцедуры

&НаКлиенте
Функция ПроверитьЗаполнениеСписковАдресатов()
	
	Отказ = Ложь;
	АдресаПоПредставлению = Новый Соответствие;
	АдресаПоЗначению = Новый Соответствие;
	ШаблонТекстаОшибки = НСтр("ru = 'Адрес %1 уже есть в списке.'");
	
	Для каждого СтрокаАдреса Из СписокПолучателей Цикл
		
		Результат = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(СтрокаАдреса.Представление);
		Для Каждого СтруктураАдреса Из Результат Цикл
			
			Если Не ПустаяСтрока(СтруктураАдреса.ОписаниеОшибки) Тогда
				Отказ = Истина;
				ОбщегоНазначенияКлиент.СообщитьПользователю(СтруктураАдреса.ОписаниеОшибки,, 
					"СписокПолучателей[" + Формат(СписокПолучателей.Индекс(СтрокаАдреса), "ЧГ=0") + "].Представление");
			КонецЕсли;
			
			Если АдресаПоПредставлению.Получить(СтруктураАдреса.Адрес) <> Неопределено Тогда
				Отказ = Истина;
				ОбщегоНазначенияКлиент.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки,
					СтруктураАдреса.Адрес),, "СписокПолучателей[" + Формат(СписокПолучателей.Индекс(СтрокаАдреса), "ЧГ=0") + "].Представление");
			Иначе
				АдресаПоПредставлению.Вставить(СтруктураАдреса.Адрес, СтрокаАдреса.ПолучитьИдентификатор());
			КонецЕсли;
			
		КонецЦикла;
		
		Если НЕ Отказ Тогда
			Результат = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(СтрокаАдреса.Адрес);
			Для Каждого СтруктураАдреса Из Результат Цикл
				
				Если Не ПустаяСтрока(СтруктураАдреса.ОписаниеОшибки) Тогда
					Отказ = Истина;
					ОбщегоНазначенияКлиент.СообщитьПользователю(СтруктураАдреса.ОписаниеОшибки,, 
						"СписокПолучателей[" + Формат(СписокПолучателей.Индекс(СтрокаАдреса), "ЧГ=0") + "].Представление");
				КонецЕсли;
				
				Если АдресаПоЗначению.Получить(СтруктураАдреса.Адрес) <> Неопределено Тогда
					Отказ = Истина;
					ОбщегоНазначенияКлиент.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки,
						СтруктураАдреса.Адрес),, "СписокПолучателей[" + Формат(СписокПолучателей.Индекс(СтрокаАдреса), "ЧГ=0") + "].Представление");
				Иначе
					АдресаПоЗначению.Вставить(СтруктураАдреса.Адрес, СтрокаАдреса.ПолучитьИдентификатор());
				КонецЕсли;
			
			КонецЦикла;
		КонецЕсли;
		
	КонецЦикла;
	
	Если НЕ Отказ Тогда
		
		Для каждого АдресПоЗначению Из АдресаПоЗначению Цикл
			Если АдресаПоПредставлению[АдресПоЗначению.Ключ] <> Неопределено
				И АдресаПоПредставлению[АдресПоЗначению.Ключ] <> АдресПоЗначению.Значение Тогда
					Отказ = Истина;
					Индекс = СписокПолучателей.Индекс(СписокПолучателей.НайтиПоИдентификатору(АдресПоЗначению.Значение));
					ОбщегоНазначенияКлиент.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки,
						АдресПоЗначению.Ключ),, "СписокПолучателей[" + Формат(Индекс, "ЧГ=0") + "].Представление");
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	
	Возврат Отказ;
	
КонецФункции

&НаСервере
Функция НеобходимаОбработкаПисьмаОснования()

	Возврат ВыполняетсяОтправка И Объект.ВключатьТелоИсходногоПисьма И ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML") 
	        И (Не Объект.ВзаимодействиеОснование = Неопределено) И (Не Объект.ВзаимодействиеОснование.Пустая()) 
	        И Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик;

КонецФункции

&НаСервере
Процедура ОтобразитьВажность()

	Если Объект.Важность = Перечисления.ВариантыВажностиВзаимодействия.Высокая Тогда
		Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьВысокая;
		Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Высокая важность'");
		Элементы.ВажностьДекорация.Картинка = БиблиотекаКартинок.ВажностьВысокая;
		Элементы.ВажностьДекорация.Подсказка = НСтр("ru = 'Высокая важность'");
		
	ИначеЕсли Объект.Важность = Перечисления.ВариантыВажностиВзаимодействия.Низкая Тогда
		Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьНизкая;
		Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Низкая важность'");
		Элементы.ВажностьДекорация.Картинка = БиблиотекаКартинок.ВажностьНизкая;
		Элементы.ВажностьДекорация.Подсказка = НСтр("ru = 'Низкая важность'");
		
	Иначе
		Элементы.ГруппаВажность.Картинка = БиблиотекаКартинок.ВажностьНеЗадана;
		Элементы.ГруппаВажность.Подсказка = НСтр("ru = 'Обычная важность'");
		Элементы.ВажностьДекорация.Картинка = БиблиотекаКартинок.ВажностьНеЗадана;
		Элементы.ВажностьДекорация.Подсказка = НСтр("ru = 'Обычная важность'");
	КонецЕсли;

КонецПроцедуры

#Область УправлениеДоступностьюЭлементовФормы

&НаКлиенте
Процедура УправлениеДоступностью()

	Элементы.РассмотретьПосле.Доступность = НаКонтроле;
	
	Если Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Исходящее") 
		И (НЕ ИнформационнаяБазаФайловая
		ИЛИ (Объект.ДатаКогдаОтправить <> Дата(1,1,1) И Объект.ДатаКогдаОтправить > ОбщегоНазначенияКлиент.ДатаСеанса())
		ИЛИ (Объект.ДатаАктуальностиОтправки <> Дата(1,1,1) И Объект.ДатаАктуальностиОтправки < ОбщегоНазначенияКлиент.ДатаСеанса())) Тогда
		Элементы.Отправить.Видимость = Ложь;
	Иначе
		Элементы.Отправить.Видимость = Истина;
	КонецЕсли;
	Элементы.ФормаЗаписатьИЗакрыть.Видимость = Не Элементы.Отправить.Видимость;
	
	Элементы.ГруппаДатаОтправкиАктуальность.Доступность = (Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено")); 

КонецПроцедуры

&НаСервере
Процедура ОпределитьВидимостьДоступностьЭлементовВЗависимостиОтСтатусаПисьма()

	Если Объект.СтатусПисьма <> Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено Тогда
		УправлениеЭлектроннойПочтой.ПолучитьДоступныеУчетныеЗаписиДляОтправки(
			Элементы.ОтправительПредставление.СписокВыбора,ДоступныеДляОтправкиУчетныеЗаписи);
			
		Если Объект.УчетнаяЗапись.Пустая()
			И ДоступныеДляОтправкиУчетныеЗаписи.Количество() > 0
			И Объект.Ссылка.Пустая() Тогда
			
			Объект.УчетнаяЗапись = ДоступныеДляОтправкиУчетныеЗаписи[0].УчетнаяЗапись;
			
		КонецЕсли;
		
		ЭлементСписка = Элементы.ОтправительПредставление.СписокВыбора.НайтиПоЗначению(Объект.УчетнаяЗапись);
		Если ЭлементСписка <> Неопределено Тогда
			Объект.ОтправительПредставление = ЭлементСписка.Представление;
		КонецЕсли;
		
	Иначе
		
		Элементы.ОтправительПредставление.ТолькоПросмотр             = Истина;
		Элементы.СписокПолучателейВариантОтправки.ТолькоПросмотр     = Истина;
		Элементы.СписокПолучателейПредставление.РедактированиеТекста = Ложь;
		Элементы.СписокПолучателей.ТолькоПросмотр                    = Истина;
		Элементы.ГруппаВажность.Видимость                            = Ложь;
		Элементы.ВажностьДекорация.Видимость = Объект.Важность <> Перечисления.ВариантыВажностиВзаимодействия.Обычная;
		
	КонецЕсли;
	
	Если Объект.СтатусПисьма <> Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда
		
		Если Вложения.Количество() > 0 Тогда
			Элементы.ДобавитьВложение.Доступность = Ложь;
			Элементы.УдалитьВложение.Доступность  = Ложь;
			Элементы.ДобавитьПисьмо.Доступность   = Ложь;
		Иначе
			Элементы.Вложения.Видимость = Ложь;
		КонецЕсли;
		
		Если Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML Тогда
			ТекстПисьма = Объект.ТекстHTML;
			ТекстПисьма = Взаимодействия.ОбработатьТекстHTML(Объект.Ссылка, Ложь, Ложь);
			Элементы.ТекстПисьма.Вид = ВидПоляФормы.ПолеHTMLДокумента;
			Элементы.ТекстПисьма.ТолькоПросмотр = Ложь;
		Иначе
			ТекстПисьма = Объект.Текст;
			Элементы.ТекстПисьма.Вид = ВидПоляФормы.ПолеТекстовогоДокумента;
			Элементы.ТекстПисьма.ТолькоПросмотр = Истина;
		КонецЕсли;
		
		Если Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее 
			И (НЕ ИнформационнаяБазаФайловая 
			ИЛИ (Объект.ДатаКогдаОтправить <> Дата(1,1,1) И Объект.ДатаКогдаОтправить > ТекущаяДатаСеанса())
			ИЛИ (Объект.ДатаАктуальностиОтправки <> Дата(1,1,1) И Объект.ДатаАктуальностиОтправки < ТекущаяДатаСеанса())) Тогда
			
			Элементы.Отправить.Доступность = Ложь;
			
		КонецЕсли;
		
	Иначе
		
		ОпределитьСпособРедактированияПисьма();
		
	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область РаботаСВложениями

&НаСервере
Процедура ДобавитьВложениеПисьмо(Письмо)
	
	Если Вложения.НайтиСтроки(Новый Структура("Письмо", Письмо)).Количество() > 0 Тогда
		Возврат;
	КонецЕсли;
	
	СтрокаРеквизиты = "Размер, Тема";
	Если ТипЗнч(Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда
		СтрокаРеквизиты =  СтрокаРеквизиты + ", ДатаПолучения";
	ИначеЕсли ТипЗнч(Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее") Тогда
		СтрокаРеквизиты =  СтрокаРеквизиты + ", Дата, ДатаОтправления";
	Иначе
		Возврат;
	КонецЕсли;
	
	РеквизитыПисьма = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Письмо, СтрокаРеквизиты);
	
	Если ТипЗнч(Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда
		ДатаПисьма = РеквизитыПисьма.ДатаПолучения;
	Иначе
		ДатаПисьма = ?(ЗначениеЗаполнено(РеквизитыПисьма.ДатаОтправления), РеквизитыПисьма.ДатаОтправления, РеквизитыПисьма.Дата);
	КонецЕсли;

	ПредставлениеПисьма = Взаимодействия.ПредставлениеПисьма(РеквизитыПисьма.Тема, ДатаПисьма);
	
	НоваяСтрока = Вложения.Добавить();
	НоваяСтрока.Письмо               = Письмо;
	НоваяСтрока.ИмяФайла             = ПредставлениеПисьма;
	НоваяСтрока.ИндексКартинки       = РаботаСФайламиСлужебныйКлиентСервер.ИндексПиктограммыФайла("eml");
	НоваяСтрока.ИмяФайлаНаКомпьютере = "";
	НоваяСтрока.ПодписанЭП           = Ложь;
	НоваяСтрока.Размер               = РеквизитыПисьма.Размер;
	НоваяСтрока.РазмерПредставление  = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(НоваяСтрока.Размер);
	НоваяСтрока.Расположение         = 5;

КонецПроцедуры

&НаСервере
Процедура ДобавитьПисьмаВложения()

	ТаблицаПисемВложений = Взаимодействия.ДанныеХранимыхВБазеПисемВложений(Объект.Ссылка);
	
	Для Каждого ПисьмоВложение Из ТаблицаПисемВложений Цикл
			
		ПредставлениеПисьма = Взаимодействия.ПредставлениеПисьма(ПисьмоВложение.Тема, ПисьмоВложение.Дата);
		
		НоваяСтрока = Вложения.Добавить();
		НоваяСтрока.Письмо               = ПисьмоВложение.Письмо;
		НоваяСтрока.ИмяФайла             = ПредставлениеПисьма;
		НоваяСтрока.ИндексКартинки       = РаботаСФайламиСлужебныйКлиентСервер.ИндексПиктограммыФайла("eml");
		НоваяСтрока.ИмяФайлаНаКомпьютере = "";
		НоваяСтрока.ПодписанЭП           = Ложь;
		НоваяСтрока.Размер               = ПисьмоВложение.Размер;
		НоваяСтрока.РазмерПредставление  = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(НоваяСтрока.Размер);
		НоваяСтрока.Расположение         = 5;
		
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ДобавитьПисьмо(Команда)
	
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("РежимВыбора", Истина);
	ПараметрыОткрытия.Вставить("ЗакрыватьПриВыборе", Истина);
	ПараметрыОткрытия.Вставить("ТолькоПочта", Истина);
	ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеДобавленияПисьма", ЭтотОбъект);
	ОткрытьФорму("ЖурналДокументов.Взаимодействия.ФормаСписка",
	             ПараметрыОткрытия,
	             ЭтотОбъект,,,,
	             ОписаниеОповещения,
	             РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеДобавленияПисьма(Результат, Параметры) Экспорт
	
	Если ВзаимодействияКлиент.ЯвляетсяЭлектроннымПисьмом(Результат) Тогда
		ДобавитьВложениеПисьмо(Результат);
		Модифицированность = Истина;
	КонецЕсли;
	
КонецПроцедуры 

&НаКлиенте
Процедура ВложенияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	
	Отказ = Истина;
	ДобавитьВложениеВыполнить();

КонецПроцедуры

&НаКлиенте
Процедура ВложенияПередУдалением(Элемент, Отказ)
	
	Если Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик") Тогда
		УдалитьВложениеВыполнить();
	КонецЕсли;
	
	Отказ = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ВложенияПриАктивизацииЯчейки(Элемент)
	
	ТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Элементы.ВложенияКонтекстноеМенюСвойстваВложения.Доступность = (ТекущиеДанные.Расположение <> 5);
	Элементы.СвойстваВложения.Доступность                        = (ТекущиеДанные.Расположение <> 5);
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьВложениеВыполнить()
	
	ОписаниеОповещение = Новый ОписаниеОповещения("ДиалогВыбораФайловПослеВыбора", ЭтотОбъект);
	ФайловаяСистемаКлиент.ЗагрузитьФайлы(ОписаниеОповещение);
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьВложениеВыполнить()

	ДобавитьВложениеВСписокУдаленных();
	
	ТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
	Если ТекущиеДанные <> Неопределено Тогда
		Индекс = Вложения.Индекс(ТекущиеДанные);
		Вложения.Удалить(Индекс);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ДобавитьВложениеВСписокУдаленных()

	ТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
	Если (ТекущиеДанные <> Неопределено) И (ТекущиеДанные.Расположение = 0) Тогда
		УдаленныеВложения.Добавить(ТекущиеДанные.Ссылка);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьВложениеВыполнить()
	
	ТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если (ТекущиеДанные.Расположение = 0) ИЛИ (ТекущиеДанные.Расположение = 1) Тогда
		
		Если ВзаимодействияКлиентСервер.ЭтоФайлПисьмо(ТекущиеДанные.ИмяФайла) Тогда
			ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ТекущиеДанные.Ссылка, ПараметрыПисьмаВложения(), ЭтотОбъект);
		Иначе
			ДляРедактирования = Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик");
			УправлениеЭлектроннойПочтойКлиент.ОткрытьВложение(ТекущиеДанные.Ссылка, ЭтотОбъект, ДляРедактирования);
			Если ДляРедактирования Тогда
				ТекущиеДанные.Редактируется = Истина;
				Модифицированность = Истина;
			КонецЕсли;
		КонецЕсли;
		
	ИначеЕсли ТекущиеДанные.Расположение = 2 Тогда
		
		ПутьКФайлу = ТекущиеДанные.ИмяФайлаНаКомпьютере;
		Если ВзаимодействияКлиентСервер.ЭтоФайлПисьмо(ТекущиеДанные.ИмяФайла) Тогда
			ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ТекущиеДанные.Письмо, ПараметрыПисьмаВложения(), ЭтотОбъект);
		Иначе
			ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу);
		КонецЕсли;
		
	ИначеЕсли ТекущиеДанные.Расположение = 4 Тогда
		
		ФайловаяСистемаКлиент.ОткрытьФайл(ТекущиеДанные.ИмяФайлаНаКомпьютере,, ТекущиеДанные.ИмяФайла);
		
	ИначеЕсли ТекущиеДанные.Расположение = 5 Тогда
		
		ПараметрыВложения = ВзаимодействияКлиент.ПараметрыПисьмаВложения();
		ПараметрыВложения.ДатаПисьмаОснования = ?(ЗначениеЗаполнено(Объект.ДатаОтправления), Объект.ДатаОтправления , Объект.Дата);
		ПараметрыВложения.ПисьмоОснование     = Объект.Ссылка;
		ПараметрыВложения.ТемаПисьмаОснования = Объект.Тема;
		ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ТекущиеДанные.Письмо, ПараметрыВложения, ЭтотОбъект);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВложение(Команда)
	
	ТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
		
	Если НЕ ЗначениеЗаполнено(ТекущиеДанные.Ссылка) Тогда
		Возврат;
	КонецЕсли;
		
	ДанныеФайла = РаботаСФайламиКлиент.ДанныеФайла(ТекущиеДанные.Ссылка, УникальныйИдентификатор);
	РаботаСФайламиКлиент.СохранитьФайлКак(ДанныеФайла);
	
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьВложения(ПереданныеПараметры = Неопределено)
	
	Если Объект.Ссылка.Пустая() И ПереданныеПараметры <> Неопределено Тогда
		Если ПереданныеПараметры.Свойство("Основание") 
			И ТипЗнч(ПереданныеПараметры.Основание) = Тип("Структура") 
			И ПереданныеПараметры.Основание.Свойство("Команда") Тогда 
			
			Если  ПереданныеПараметры.Основание.Команда = "Переслать" Тогда
			
				ТабВложения = УправлениеЭлектроннойПочтой.ПолучитьВложенияЭлектронногоПисьма(ПереданныеПараметры.Основание.Основание, Истина);
				Для Каждого СтрокаТаблицыВложений Из ТабВложения Цикл
					Если ПустаяСтрока(СтрокаТаблицыВложений.ИДФайлаЭлектронногоПисьма) Тогда
						НоваяСтрока = Вложения.Добавить();
						НоваяСтрока.Ссылка              = СтрокаТаблицыВложений.Ссылка;
						НоваяСтрока.ИмяФайла            = СтрокаТаблицыВложений.ИмяФайла;
						НоваяСтрока.ИндексКартинки      = СтрокаТаблицыВложений.ИндексКартинки;
						НоваяСтрока.Размер              = СтрокаТаблицыВложений.Размер;
						НоваяСтрока.РазмерПредставление = СтрокаТаблицыВложений.РазмерПредставление;
						НоваяСтрока.Расположение        = 1;
					КонецЕсли;
				КонецЦикла;
				
				ДанныеХранимыхВБазеПисемВложений = Взаимодействия.ДанныеХранимыхВБазеПисемВложений(ПереданныеПараметры.Основание.Основание);
				Для Каждого СтрокаТаблицы Из ДанныеХранимыхВБазеПисемВложений Цикл
					ДобавитьВложениеПисьмо(СтрокаТаблицы.Письмо);
				КонецЦикла;
				
			ИначеЕсли ПереданныеПараметры.Основание.Команда = "ПереслатьКакВложение"
				И Параметры.Основание.Свойство("Основание")  Тогда

				ДобавитьВложениеПисьмо(Параметры.Основание.Основание);
				
			КонецЕсли;
			
		КонецЕсли;
	Иначе
		
		Вложения.Очистить();
		ТабВложения = УправлениеЭлектроннойПочтой.ПолучитьВложенияЭлектронногоПисьма(Объект.Ссылка, Истина);
		Для Каждого СтрокаТаблицыВложений Из ТабВложения Цикл
			Если ПустаяСтрока(СтрокаТаблицыВложений.ИДФайлаЭлектронногоПисьма) Тогда
				НоваяСтрока = Вложения.Добавить();
				НоваяСтрока.Ссылка              = СтрокаТаблицыВложений.Ссылка;
				НоваяСтрока.ИмяФайла            = СтрокаТаблицыВложений.ИмяФайла;
				НоваяСтрока.ИндексКартинки      = СтрокаТаблицыВложений.ИндексКартинки;
				НоваяСтрока.Размер              = СтрокаТаблицыВложений.Размер;
				НоваяСтрока.РазмерПредставление = СтрокаТаблицыВложений.РазмерПредставление;
				НоваяСтрока.ПодписанЭП          = СтрокаТаблицыВложений.ПодписанЭП;
				НоваяСтрока.Расположение        = 0;
			КонецЕсли;
		КонецЦикла;
		
		ДобавитьПисьмаВложения();
		
	КонецЕсли;
	
	Вложения.Сортировать("ИмяФайла");
	
КонецПроцедуры

&НаСервере
Процедура ПрикрепитьВходящееПисьмоОснованиеКакВложениеЕслиНеобходимо(ТекущийОбъект)
	
	Если ТекущийОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее 
		И Не ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML") 
		И (ТипЗнч(ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") 
		ИЛИ ТипЗнч(ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее")) 
		И ТипТекстаВходящегоПисьма = Перечисления.ТипыТекстовЭлектронныхПисем.HTML Тогда
		
		Если ТипЗнч(ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда
			ТекстHTMLВходящее = Взаимодействия.СформироватьТекстHTMLДляВходящегоПисьма(ВзаимодействиеОснование, Истина, Истина, Ложь);
		Иначе
			ТекстHTMLВходящее = Взаимодействия.СформироватьТекстHTMLДляИсходящегоПисьма(ВзаимодействиеОснование, Истина, Истина, Ложь);
		КонецЕсли;
		
		ИмяФайла = ПолучитьИмяВременногоФайла("html");
		ФайлИсходноеСообщение = Новый ЗаписьТекста(ИмяФайла,КодировкаТекста.UTF16);
		ФайлИсходноеСообщение.Записать(ТекстHTMLВходящее);
		ФайлИсходноеСообщение.Закрыть();
		ДвоичныеДанные       = Новый ДвоичныеДанные(ИмяФайла);
		АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
		
		ФайлНаДиске = Новый Файл(ИмяФайла);
		Если ФайлНаДиске.Существует() Тогда
			УдалитьФайлы(ИмяФайла);
		КонецЕсли;
		
		ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
		ПараметрыФайла.ВладелецФайлов = ТекущийОбъект.Ссылка;
		ПараметрыФайла.ИмяБезРасширения = НСтр("ru = 'Пересылаемое сообщение'");
		ПараметрыФайла.РасширениеБезТочки = "html";
		ПараметрыФайла.ВремяИзмененияУниверсальное = Неопределено;
		
		РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВХранилище);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СвойстваВложения(Команда)
	
	ТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекущийИндексВКоллекции = Вложения.Индекс(ТекущиеДанные);
	
	Если ТекущиеДанные.Ссылка = Неопределено Тогда
		ДополнительныеПараметры = Новый Структура("ТекущийИндексВКоллекции", ТекущийИндексВКоллекции);
		ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВопросОЗаписиФайлаПослеЗакрытия", ЭтотОбъект, ДополнительныеПараметры);
		ТекстВопроса = НСтр("ru = 'Свойства файла доступны только после его записи. Записать?'");
		ПоказатьВопрос(ОбработчикОповещенияОЗакрытии, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
	Иначе
		ОткрытьСвойстваВложения(ТекущийИндексВКоллекции);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВопросОЗаписиФайлаПослеЗакрытия(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		
		ТекущиеДанные = Вложения.Получить(ДополнительныеПараметры.ТекущийИндексВКоллекции);
		Если ТекущиеДанные <> Неопределено Тогда
			ИмяФайла = ТекущиеДанные.ИмяФайла;
		Иначе
			Возврат;
		КонецЕсли;
		Записать();
		
		ПараметрыПоиска = Новый Структура;
		ПараметрыПоиска.Вставить("ИмяФайла", ИмяФайла);
		
		НайденныеСтроки = Вложения.НайтиСтроки(ПараметрыПоиска);
		
		Если НайденныеСтроки.Количество() > 0 Тогда
			ИдентификаторСтроки = Вложения.Индекс(НайденныеСтроки[0]);
			Элементы.Вложения.ТекущаяСтрока = ИдентификаторСтроки;
			ДополнительныеПараметры.ТекущийИндексВКоллекции = ИдентификаторСтроки;
		Иначе
			Возврат;
		КонецЕсли;
		
	Иначе
		Возврат;
	КонецЕсли;
	
	ОткрытьСвойстваВложения(ДополнительныеПараметры.ТекущийИндексВКоллекции);
	
КонецПроцедуры

// Возникает при окончании получения размера файла
// 
// Параметры:
//  Размер - Число - размер файла.
//  ДополнительныеПараметры - Структура:
//    * СтрокаТаблицыВложений - СтрокаТаблицыЗначений:
//      ** Размер - Число - размер файла.
//
&НаКлиенте
Процедура ПолучениеРазмераЗавершение(Размер, ДополнительныеПараметры) Экспорт

	СтрокаТаблицыВложений  = ДополнительныеПараметры.СтрокаТаблицыВложений;
	СтрокаТаблицыВложений.Размер = Размер;
	СтрокаТаблицыВложений.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(Размер); 

КонецПроцедуры

&НаКлиенте
Процедура ДиалогВыбораФайловПослеВыбора(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
	
	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого ВыбранныйФайл Из ВыбранныеФайлы Цикл
		НоваяСтрока = Вложения.Добавить();
		
#Если ВебКлиент Тогда
			НоваяСтрока.Расположение = 4;
			НоваяСтрока.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(ПолучитьИзВременногоХранилища(ВыбранныйФайл.Хранение), 
			                                                                 УникальныйИдентификатор);
#Иначе
			НоваяСтрока.Расположение = 2;
			НоваяСтрока.ИмяФайлаНаКомпьютере = ВыбранныйФайл.ПолноеИмя;
#КонецЕсли
		
		ИмяФайла = ИмяФайлаБезКаталога(ВыбранныйФайл.ПолноеИмя);
		НоваяСтрока.ИмяФайла = ИмяФайла;
		
		Расширение                      = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ИмяФайла);
		НоваяСтрока.ИндексКартинки      = РаботаСФайламиСлужебныйКлиентСервер.ИндексПиктограммыФайла(Расширение);
		ДополнительныеПараметры = Новый Структура("СтрокаТаблицыВложений", НоваяСтрока);
		Файл = Новый Файл(ВыбранныйФайл.ПолноеИмя);
		Файл.НачатьПолучениеРазмера(Новый ОписаниеОповещения("ПолучениеРазмераЗавершение", ЭтотОбъект, ДополнительныеПараметры));
	КонецЦикла;
	
	Если ВыбранныеФайлы.Количество() > 0 Тогда
		Элементы.Вложения.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПроверкаЭтоФайлПослеЗавершения(ЭтоФайл, ДополнительныеПараметры) Экспорт

	Если НЕ ЭтоФайл Тогда
		Возврат;
	КонецЕсли;
	
	ПолноеИмя = ДополнительныеПараметры.ВыбранныйФайл.ПолноеИмя;
	
	НоваяСтрока = Вложения.Добавить();
	НоваяСтрока.Расположение = 2;
	НоваяСтрока.ИмяФайлаНаКомпьютере = ПолноеИмя;
	
	ИмяФайла = ИмяФайлаБезКаталога(ПолноеИмя);
	НоваяСтрока.ИмяФайла = ИмяФайла;
	
	Расширение                      = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ИмяФайла);
	НоваяСтрока.ИндексКартинки      = РаботаСФайламиСлужебныйКлиентСервер.ИндексПиктограммыФайла(Расширение);
	ДополнительныеПараметры         = Новый Структура("СтрокаТаблицыВложений", НоваяСтрока);
	Файл = Новый Файл(ПолноеИмя);
	Файл.НачатьПолучениеРазмера(Новый ОписаниеОповещения("ПолучениеРазмераЗавершение", ЭтотОбъект, ДополнительныеПараметры));

КонецПроцедуры

&НаКлиенте
Функция ИмяФайлаБезКаталога(Знач ПолноеИмяФайла)
	
	ИмяФайла = ПолноеИмяФайла;
	Пока Истина Цикл
		
		Позиция = Макс(СтрНайти(ИмяФайла, "\"), СтрНайти(ИмяФайла, "/"));
		Если Позиция = 0 Тогда
			Возврат ИмяФайла;
		КонецЕсли;
		
		ИмяФайла = Сред(ИмяФайла, Позиция + 1);
		
	КонецЦикла;
	Возврат ИмяФайла;
	
КонецФункции

#КонецОбласти

#Область ФормированиеТелаПисьма

&НаСервере
Функция СформироватьТекстПисьмаВключаяПисьмоОснование(РедактируемыйДокументHTML, ТекущийОбъект)
	
	Выборка = Взаимодействия.ПолучитьДанныеПисьмаОснования(Объект.ВзаимодействиеОснование);
	Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст Тогда
		Возврат СформироватьИсходящееОбычныйТекст(Выборка, ТекущийОбъект);
	Иначе
		Возврат СформироватьИсходящееHTML(Выборка, РедактируемыйДокументHTML, ТекущийОбъект);
	КонецЕсли;
	
КонецФункции

&НаСервере
Функция СформироватьИсходящееHTML(Выборка, РедактируемыйДокументHTML, ТекущийОбъект)
	
	Если Выборка.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст Тогда
		ДокументHTML = Взаимодействия.ПолучитьДокументHTMLИзОбычногоТекста(Выборка.Текст);
	Иначе
		ДокументHTML = Взаимодействия.ПолучитьОбъектДокументHTMLИзТекстаHTML(Выборка.ТекстHTML);
	КонецЕсли;
	
	ЭлементТелоПисьма = ДокументHTML.Тело;
	Если ЭлементТелоПисьма = Неопределено Тогда
		Если РедактируемыйДокументHTML = Неопределено Тогда
			Возврат ТекущийОбъект.ТекстHTML;
		Иначе
			Возврат Взаимодействия.ПолучитьТекстHTMLИзОбъектаДокументHTML(РедактируемыйДокументHTML);
		КонецЕсли
	КонецЕсли;
	
	Если РедактируемыйДокументHTML = Неопределено Тогда
		РедактируемыйДокументHTML = Взаимодействия.ПолучитьОбъектДокументHTMLИзТекстаHTML(ТекущийОбъект.ТекстHTML);
	КонецЕсли;
	
	ДокументHTML = Взаимодействия.ОбъединитьПисьма(РедактируемыйДокументHTML, ДокументHTML, Выборка);
	Возврат Взаимодействия.ПолучитьТекстHTMLИзОбъектаДокументHTML(ДокументHTML);
	
КонецФункции

&НаСервере
Функция СформироватьИсходящееОбычныйТекст(ВыборкаДанныеВходящегоПисьма, ТекущийОбъект)

	СтрокаШапка = НСтр("ru = '-----Пересылаемое сообщение-----'");
	
	СтрокаШапка = СтрокаШапка + Символы.ПС+ НСтр("ru = 'От'") + ": "+ ВыборкаДанныеВходящегоПисьма.ОтправительПредставление
		          + ?(ВыборкаДанныеВходящегоПисьма.ИмяОбъектаМетаданных = "ЭлектронноеПисьмоВходящее",
		          "[" + ВыборкаДанныеВходящегоПисьма.ОтправительАдрес +"]",
		          "");
		
	СтрокаШапка = СтрокаШапка + Символы.ПС+ НСтр("ru = 'Отправлено'") + ": " 
	              + Формат(ВыборкаДанныеВходящегоПисьма.Дата,"ДЛФ=DT");
	
	СтрокаШапка = СтрокаШапка + Символы.ПС+ НСтр("ru = 'Кому'") + ": " 
	    + Взаимодействия.ПолучитьПредставленияПолучателейВходящегоПисьма(ВыборкаДанныеВходящегоПисьма.ПолучателиПисьма.Выгрузить());
		
	ТаблицаПолучателейКопий = ВыборкаДанныеВходящегоПисьма.ПолучателиКопий.Выгрузить();
	
	Если ТаблицаПолучателейКопий.Количество() > 0 Тогда
		СтрокаШапка = СтрокаШапка + Символы.ПС+ НСтр("ru = 'Копии'") + ": "
		+ Взаимодействия.ПолучитьПредставленияПолучателейВходящегоПисьма(ТаблицаПолучателейКопий);
	КонецЕсли;
	
	СтрокаШапка = СтрокаШапка + Символы.ПС+ НСтр("ru = 'Тема'") + ": " + ВыборкаДанныеВходящегоПисьма.Тема;
	
	// Преобразование к обычному тексту текста HTML если это необходимо.
	Если ВыборкаДанныеВходящегоПисьма.ТипТекста <> Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст Тогда
		
		ТекстВходящегоПисьма =  Взаимодействия.ПолучитьОбычныйТекстИзHTML(ВыборкаДанныеВходящегоПисьма.ТекстHTML);
		
	Иначе
		
		ТекстВходящегоПисьма = ВыборкаДанныеВходящегоПисьма.Текст
		
	КонецЕсли;
	
	Возврат ТекущийОбъект.Текст + Символы.ПС + Символы.ПС + СтрокаШапка + Символы.ПС + Символы.ПС + ТекстВходящегоПисьма;

КонецФункции

#Область Прочее

&НаСервере
Процедура ОпределитьСпособРедактированияПисьма()

	Если Объект.ТипТекста.Пустая() Тогда
		
		ФорматСообщения = Взаимодействия.ФорматСообщенияПоУмолчанию(Пользователи.ТекущийПользователь());
		
		// Если тип текста не был заполнен, то может оказаться, что формат выбран некорректно, поэтому:
		// 1) Если текст заполнен, но не заполнен HTML - то формат сообщения исправляем на "текст".
		// 2) Если HTML заполнен, но не заполнен текст - то формат сообщения исправляем на "HTML".
		Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст 
			И СокрЛП(Объект.Текст) = "" И СокрЛП(Объект.ТекстHTML) <> "" Тогда
			ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML;
		ИначеЕсли ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML
			И СокрЛП(Объект.Текст) <> "" И СокрЛП(Объект.ТекстHTML) = "" Тогда
			ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст;
		КонецЕсли;
		
	Иначе
		Если Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст Тогда
			ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст;
		Иначе
			ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML;
		КонецЕсли;
		
	КонецЕсли;
	
	Если Объект.Ссылка.Пустая() Тогда
		
		Если Не ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML") 
			И ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда
			ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст;
		КонецЕсли;
		
		ПараметрыРаботыПользователяПользователя =
			Взаимодействия.ПолучитьПараметрыРаботыПользователяДляИсходящегоЭлектронногоПисьма(
			Объект.УчетнаяЗапись,
			ФорматСообщения,
			?(Объект.ВзаимодействиеОснование = Неопределено, Истина, Ложь));
		
		Объект.УведомитьОДоставке            = ПараметрыРаботыПользователяПользователя.УведомитьОДоставке;
		Объект.УведомитьОПрочтении           = ПараметрыРаботыПользователяПользователя.УведомитьОПрочтении;
		Объект.ВключатьТелоИсходногоПисьма   = ПараметрыРаботыПользователяПользователя.ВключатьТелоИсходногоПисьма;
		Объект.ОтображатьТелоИсходногоПисьма = ПараметрыРаботыПользователяПользователя.ОтображатьТелоИсходногоПисьма;
		
	КонецЕсли;
	
	Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда
		
		Элементы.СтраницыТекстПисьма.ТекущаяСтраница = Элементы.СтраницаФорматированныйДокумент;
		Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML;
		Если Не Объект.Ссылка.Пустая() Или ЗначениеЗаполнено(Объект.ТекстHTML) Тогда
			
			Если ЭтоАдресВременногоХранилища(Объект.ТекстHTML) Тогда
				
				ТелоПисьмаHTML   = ПолучитьИзВременногоХранилища(Объект.ТекстHTML);
				Объект.ТекстHTML = ТелоПисьмаHTML.ТекстHTML;
				ТекстПисьмаФорматированныйДокумент.УстановитьHTML(ТелоПисьмаHTML.ТекстHTML, ТелоПисьмаHTML.СтруктураВложений);
				Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками;
				Объект.Текст     = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст();
				
			Иначе
				
				СтруктураВложений  = Новый Структура;
				ТекстHTML = "";
				ТекстПисьмаФорматированныйДокумент.ПолучитьHTML(ТекстHTML, СтруктураВложений);
				
				// Если ТекстПисьмаФорматированныйДокумент заполнен при создании письма из переданных параметров,
				// то текст HTML не зачитывает из объекта.
				ТекстHTMLДляПроверки = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст();
				Если ПустаяСтрока(ТекстHTMLДляПроверки) И ЗначениеЗаполнено(Объект.ТекстHTML) Тогда
					Объект.ТекстHTML = Взаимодействия.ОбработатьТекстHTMLДляФорматированногоДокумента(
						Объект.Ссылка, Объект.ТекстHTML, СтруктураВложений);
					ТекстПисьмаФорматированныйДокумент.УстановитьHTML(Объект.ТекстHTML, СтруктураВложений);
				КонецЕсли;
			
			КонецЕсли;
			
		КонецЕсли;
		
		Если Объект.Ссылка.Пустая() И ПараметрыРаботыПользователяПользователя.Подпись <> Неопределено Тогда
			ДобавитьФорматированныйДокументКФорматированномуДокументу(ТекстПисьмаФорматированныйДокумент, ПараметрыРаботыПользователяПользователя.Подпись);
		КонецЕсли;
		
	Иначе
		
		Элементы.СтраницыТекстПисьма.ТекущаяСтраница = Элементы.СтраницаОбычныйТекст;
		Элементы.ТекстПисьма.Вид = ВидПоляФормы.ПолеТекстовогоДокумента;
		Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст;
		ТекстПисьма = Объект.Текст;
		Если Объект.Ссылка.Пустая() И ПараметрыРаботыПользователяПользователя.Подпись <> Неопределено Тогда
			ТекстПисьма = ТекстПисьма + ПараметрыРаботыПользователяПользователя.Подпись;
		КонецЕсли;
		Объект.Кодировка = "UTF-8";
		
	КонецЕсли;
	
	Элементы.ФорматСообщения.Видимость = Истина;
	Элементы.ФорматСообщения.Заголовок = ФорматСообщения;
	
КонецПроцедуры

&НаСервере
Процедура ОбработатьПереданныеПараметры(ПереданныеПараметры)
	
	Если НЕ Объект.Ссылка.Пустая() Тогда
		Возврат;
	КонецЕсли;
	
	УстановитьТекстПисьмаПоПереданнымПараметрам(ПереданныеПараметры);
	
	Если ПереданныеПараметры.Свойство("Вложения") И ПереданныеПараметры.Вложения <> Неопределено Тогда
		
		Если ТипЗнч(ПереданныеПараметры.Вложения) = Тип("СписокЗначений") Или ТипЗнч(ПереданныеПараметры.Вложения) = Тип("Массив") Тогда
			Для Каждого Вложение Из ПереданныеПараметры.Вложения Цикл
				ОписаниеВложения = Вложения.Добавить();
				Если ТипЗнч(ПереданныеПараметры.Вложения) = Тип("СписокЗначений") Тогда
					Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда
						ОписаниеВложения.Расположение = 4;
						ОписаниеВложения.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(ПолучитьИзВременногоХранилища(Вложение.Значение), УникальныйИдентификатор);
					ИначеЕсли ТипЗнч(Вложение.Значение) = Тип("ДвоичныеДанные") Тогда
						ОписаниеВложения.Расположение = 4;
						ОписаниеВложения.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(Вложение.Значение, УникальныйИдентификатор);
					Иначе
						ОписаниеВложения.Расположение = 2;
						ОписаниеВложения.ИмяФайлаНаКомпьютере = Вложение.Значение;
					КонецЕсли;
					ОписаниеВложения.ИмяФайла = Вложение.Представление;
				Иначе // ТипЗнч(ПереданныеПараметры.Вложения) = "массив структур"
					Если Не ПустаяСтрока(Вложение.АдресВоВременномХранилище) Тогда
						ОписаниеВложения.Расположение = 4;
						ОписаниеВложения.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(
						ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище), УникальныйИдентификатор);
					Иначе
						ОписаниеВложения.Расположение = 2;
						ОписаниеВложения.ИмяФайлаНаКомпьютере = Вложение.ПутьКФайлу;
					КонецЕсли;
				КонецЕсли;
				ОписаниеВложения.ИмяФайла = Вложение.Представление;
				Расширение = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ОписаниеВложения.ИмяФайла);
				ОписаниеВложения.ИндексКартинки = РаботаСФайламиСлужебныйКлиентСервер.ИндексПиктограммыФайла(Расширение);
			КонецЦикла;
		КонецЕсли;
		
	КонецЕсли;
	
	Если ПереданныеПараметры.Свойство("Тема") И НЕ ПустаяСтрока(ПереданныеПараметры.Тема) Тогда
		Объект.Тема = ПереданныеПараметры.Тема;
	КонецЕсли;
	
	Если ПереданныеПараметры.Свойство("Получатель") И ПереданныеПараметры.Получатель <> Неопределено Тогда
		
		// Если передан параметр "Получатель", то эта табличная часть очищается перед заполнением согласно данным параметра.
		Объект.ПолучателиПисьма.Очистить();
		СписокПолучателей.Очистить();
		
		Если ТипЗнч(ПереданныеПараметры.Получатель) = Тип("Строка") И НЕ ПустаяСтрока(ПереданныеПараметры.Получатель) Тогда
			Объект.СписокПолучателейПисьма = ПереданныеПараметры.Получатель;
			НоваяСтрока = Объект.ПолучателиПисьма.Добавить();
			НоваяСтрока.Адрес = ПереданныеПараметры.Получатель;
			
		ИначеЕсли ТипЗнч(ПереданныеПараметры.Получатель) = Тип("СписокЗначений") Тогда
			
			Для Каждого ЭлементСписка Из ПереданныеПараметры.Получатель Цикл
				НоваяСтрока = Объект.ПолучателиПисьма.Добавить();
				НоваяСтрока.Адрес = ЭлементСписка.Значение;
				НоваяСтрока.Представление = ОбработанноеПредставлениеАдресата(ЭлементСписка.Представление);
				
				НоваяСтрока = СписокПолучателей.Добавить();
				НоваяСтрока.ВариантОтправки = "Кому";
				НоваяСтрока.Адрес = ЭлементСписка.Значение;
				НоваяСтрока.Представление = ОбработанноеПредставлениеАдресата(ЭлементСписка.Представление);
			КонецЦикла;
			
			Объект.СписокПолучателейПисьма = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиПисьма, Ложь);
			
		ИначеЕсли ТипЗнч(ПереданныеПараметры.Получатель) = Тип("Массив") Тогда
			
			Для Каждого ЭлементМассива Из ПереданныеПараметры.Получатель Цикл
				
				МассивАдресов = СтрРазделить(ЭлементМассива.Адрес, ";");
				
				Для Каждого Адрес Из МассивАдресов Цикл
					Если ПустаяСтрока(Адрес) Тогда 
						Продолжить;
					КонецЕсли;
					
					ВариантОтправки = ?(ЭлементМассива.Свойство("ВариантОтправки"), ЭлементМассива.ВариантОтправки, "Кому");
					
					Если Элементы.СписокПолучателейВариантОтправки.СписокВыбора.НайтиПоЗначению(ВариантОтправки) = Неопределено Тогда
						ВариантОтправки = "Кому";
					КонецЕсли;
					
					Если ВариантОтправки = "Копия" Тогда
						НоваяСтрока = Объект.ПолучателиКопий.Добавить();
					ИначеЕсли ВариантОтправки = "СкрытаяКопия" Тогда
						НоваяСтрока = Объект.ПолучателиСкрытыхКопий.Добавить(); 
					ИначеЕсли ВариантОтправки = "ОбратныйАдрес" Тогда
						НоваяСтрока = Объект.ПолучателиОтвета.Добавить();
					Иначе
						НоваяСтрока = Объект.ПолучателиПисьма.Добавить();
					КонецЕсли;
					
					НоваяСтрока.Адрес = СокрЛП(Адрес);
					НоваяСтрока.Представление = ОбработанноеПредставлениеАдресата(ЭлементМассива.Представление);
					НоваяСтрока.Контакт = ЭлементМассива.ИсточникКонтактнойИнформации;
				
				КонецЦикла;
				
			КонецЦикла;
			
			Объект.СписокПолучателейПисьма = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиПисьма, Ложь);
			
		КонецЕсли;
		
	КонецЕсли;
	
	ОчиститьДублиАдресатов(Объект.ПолучателиПисьма);
	
	Если ПереданныеПараметры.Свойство("Отправитель") И ЗначениеЗаполнено(ПереданныеПараметры.Отправитель) Тогда
		
		Объект.УчетнаяЗапись = ПереданныеПараметры.Отправитель;
		РеквизитыОтправителя = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
		ПереданныеПараметры.Отправитель,"Ссылка, ИмяПользователя, АдресЭлектроннойПочты");
		Объект.ОтправительПредставление = ВзаимодействияКлиентСервер.ПолучитьПредставлениеАдресата(
		РеквизитыОтправителя.ИмяПользователя, РеквизитыОтправителя.АдресЭлектроннойПочты, "");
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ОбработанноеПредставлениеАдресата(ПредставлениеАдресата)

	ПредставлениеАдресата = СтрЗаменить(ПредставлениеАдресата, ",", "");
	ПредставлениеАдресата = СтрЗаменить(ПредставлениеАдресата, ";", "");
	
	Возврат ПредставлениеАдресата;

КонецФункции

&НаСервере
Процедура УстановитьТекстПисьмаПоПереданнымПараметрам(ПереданныеПараметры)
	
	Если НЕ ПереданныеПараметры.Свойство("Текст") Тогда
		Возврат;
	КонецЕсли;
	
	Текст = ПереданныеПараметры.Текст;
	
	Если ТипЗнч(Текст) = Тип("Структура") Тогда
		
		ТекстПисьмаФорматированныйДокумент.УстановитьHTML(Текст.ТекстHTML, Текст.СтруктураВложений);
		Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками;
		Объект.Текст = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст();
		
	ИначеЕсли ТипЗнч(Текст) = Тип("Строка") И Не ПустаяСтрока(Текст) Тогда
		
		Если СтрЗаканчиваетсяНа(НРег(СокрП(Текст)), НРег("</html>")) Тогда
			Картинки = Новый Структура;
			Если ТипЗнч(ПереданныеПараметры.Вложения) = Тип("Массив") Тогда
				Для Индекс = -ПереданныеПараметры.Вложения.ВГраница() По 0 Цикл
					Вложение = ПереданныеПараметры.Вложения[-Индекс];
					Если Вложение.Свойство("Идентификатор") И ЗначениеЗаполнено(Вложение.Идентификатор) Тогда
						КартинкаВложение = Новый Картинка(ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище));
						Картинки.Вставить(Вложение.Представление, КартинкаВложение);
						ПереданныеПараметры.Вложения.Удалить(-Индекс);
					КонецЕсли;
				КонецЦикла;
			КонецЕсли;
			
			ТекстПисьмаФорматированныйДокумент.УстановитьHTML(Текст, Картинки);
			
			Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками;
			Объект.Текст = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст();
			Объект.ТекстHTML = Текст;
			
		ИначеЕсли Взаимодействия.ФорматСообщенияПоУмолчанию(Объект.Автор) = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда
			
			ТекстПисьмаФорматированныйДокумент.Добавить(Текст);
			СтрВложения = Новый Структура;
			ТекстПисьмаФорматированныйДокумент.ПолучитьHTML(Объект.ТекстHTML, СтрВложения);
			
		Иначе
			Объект.Текст = Текст;
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОтобразитьПисьмоОснование()
	
	Если Не Объект.ВзаимодействиеОснование = Неопределено И НЕ Объект.ВзаимодействиеОснование.Пустая()
		И Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик 
		И (ТипЗнч(Объект.ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее")
		ИЛИ ТипЗнч(Объект.ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее")) Тогда
		
		ЗначенияРеквизитовВходящегоПисьма = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
			Объект.ВзаимодействиеОснование,"ТипТекста,ТекстHTML,Текст");
		
		ТипТекстаВходящегоПисьма = ?(ЗначенияРеквизитовВходящегоПисьма.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст,
			Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст,
			Перечисления.ТипыТекстовЭлектронныхПисем.HTML);
		
		Если ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML") Тогда
			
			Если ЗначенияРеквизитовВходящегоПисьма.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст Тогда
				
				ТекстВходящегоПисьма = ЗначенияРеквизитовВходящегоПисьма.Текст;
				Элементы.ТекстВходящегоПисьма.Вид = ВидПоляФормы.ПолеТекстовогоДокумента;
				
			Иначе
				
				ПрочитатьТекстВходящегоПисьмаHTML();
				Элементы.ТекстВходящегоПисьма.Вид = ВидПоляФормы.ПолеHTMLДокумента;
				Элементы.ТекстВходящегоПисьма.ТолькоПросмотр = Ложь
				
			КонецЕсли;
			
			Если Не Объект.ОтображатьТелоИсходногоПисьма Тогда
				Элементы.ГруппаВходящее.Видимость = Ложь;
			Иначе
				Элементы.ОтображатьТекстПисьмаОснования.Пометка = Истина;
			КонецЕсли;
			
		Иначе
			
			Элементы.ГруппаВходящее.Видимость = Ложь;
			ТекстПисьма = СформироватьТекстПисьмаВключаяПисьмоОснование(Неопределено, Объект);
			
		КонецЕсли;
		
	Иначе
		
		Элементы.ГруппаВходящее.Видимость = Ложь;
		Элементы.ОтображатьТекстПисьмаОснования.Видимость = Ложь;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Функция РезультатВставкиТекстаВПисьмо(ТекстПисьма, СтрокаНачало, КолонкаНачало, КолонкаКонец, ВыбранноеЗначение)
	
	ТекстовыйДокумент = Новый ТекстовыйДокумент;
	ТекстовыйДокумент.УстановитьТекст(ТекстПисьма);
	СтрокаВставки = ТекстовыйДокумент.ПолучитьСтроку(СтрокаНачало);
	СтрокаВставки = Лев(СтрокаВставки, КолонкаНачало - 1) + ВыбранноеЗначение + Прав(СтрокаВставки,СтрДлина(СтрокаВставки) - КолонкаКонец + 1);
	ТекстовыйДокумент.ЗаменитьСтроку(СтрокаНачало, СтрокаВставки);
	Возврат ТекстовыйДокумент.ПолучитьТекст();
	
КонецФункции

#КонецОбласти

&НаКлиенте
Процедура ОтправитьВыполнить()
	
	ОчиститьСообщения();
	
	НайденныеСтроки = ДоступныеДляОтправкиУчетныеЗаписи.НайтиСтроки(Новый Структура("УчетнаяЗапись", Объект.УчетнаяЗапись));
	Если НайденныеСтроки.Количество() = 0 Тогда
		ОбщегоНазначенияКлиент.СообщитьПользователю(
			НСтр("ru = 'Выбранная почта недоступна для отправки писем.'"),, "ОтправительПредставление", "Объект");
		Возврат;
	КонецЕсли;
	
	Если НайденныеСтроки[0].УдалятьПослеОтправки Тогда
			
		СписокКнопок = Новый СписокЗначений;
		СписокКнопок.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Отправить'"));
		СписокКнопок.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Отправить и сохранить'"));
		СписокКнопок.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'"));
		
		ТекстВопроса = НСтр("ru = 'В настройках почты не предусмотрено сохранение отправленных писем в приложении.
		                    |Продолжить?'");
		ОбработчикОповещенияЗакрытия = Новый ОписаниеОповещения("ВопросОНеСохраненииОтправленногоПисьма", ЭтотОбъект);
		ПоказатьВопрос(ОбработчикОповещенияЗакрытия,ТекстВопроса, СписокКнопок,, КодВозвратаДиалога.Да, НСтр("ru = 'Отправка письма'"));
	Иначе
		ОтправитьПисьмоКлиент();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПереслатьВыполнить()
	
	Основание = Новый Структура("Основание,Команда", Объект.Ссылка, "Переслать");
	ПараметрыОткрытия = Новый Структура("Основание", Основание);
	ОткрытьФорму("Документ.ЭлектронноеПисьмоИсходящее.ФормаОбъекта", ПараметрыОткрытия);

КонецПроцедуры

&НаСервере
Процедура УстановитьЗаголовокКнопкиПоУмолчанию()
	
	Если Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено Тогда
		Элементы.Отправить.Заголовок = НСтр("ru = 'Переслать'");
	ИначеЕсли Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее Тогда
		Элементы.Отправить.Заголовок = НСтр("ru = 'Отправить сейчас'");
	ИначеЕсли Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда
		Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
			НастройкиРаботыСПочтой = Взаимодействия.НастройкиРаботыСПочтой();
			Если НастройкиРаботыСПочтой.Свойство("ОтправлятьСообщенияСразу") И НастройкиРаботыСПочтой.ОтправлятьСообщенияСразу Тогда
				ОтправлятьСообщенияСразу = Истина;
			КонецЕсли;
		КонецЕсли;
		
		Элементы.Отправить.Заголовок = НСтр("ru = 'Отправить'");
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ФорматСообщенияПриИзменении()
	
	Если Объект.ТипТекста <> ПредопределенноеЗначение("Перечисление.ТипыТекстовЭлектронныхПисем.ПростойТекст") 
		И ФорматСообщения = ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст") Тогда
		
		ВзаимодействияКлиент.ВопросПриИзмененииФорматаСообщенияНаОбычныйТекст(ЭтотОбъект);
		
	Иначе
		
		ПриИзмененииФорматаПодписиНаHTMLНаСервере(Объект.УчетнаяЗапись);
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ПриСозданииИПриЧтенииНаСервере()
	
	ИнформационнаяБазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая();
	Взаимодействия.УстановитьЗаголовокФормыЭлектронногоПисьма(ЭтотОбъект);
	УстановитьЗаголовокКнопкиПоУмолчанию();
	ОбработатьПереданныеПараметры(Параметры);
	
	ЗаполнитьВложения(Параметры);
	
	Для Каждого ПолучательПисьма Из Объект.ПолучателиПисьма Цикл
		Если ЗначениеЗаполнено(ПолучательПисьма.Контакт) Тогда
			СоответствияАдресовИКонтактов.Добавить(ПолучательПисьма.Контакт, ПолучательПисьма.Адрес);
		КонецЕсли;
	КонецЦикла;
	
	ОпределитьВидимостьДоступностьЭлементовВЗависимостиОтСтатусаПисьма();
	ОтобразитьПисьмоОснование();
	
	Если Не Объект.Ссылка.Пустая() Тогда
		Взаимодействия.УстановитьРеквизитыФормыВзаимодействияПоДаннымРегистра(ЭтотОбъект);
		ТекущийСтатусПисьма = Объект.СтатусПисьма;
	КонецЕсли;
	
	НаКонтроле = НЕ Рассмотрено;
	
	ВзаимодействияКлиентСервер.ПроверитьЗаполнениеКонтактов(Объект, ЭтотОбъект, "ЭлектронноеПисьмоИсходящее");
	
	Если Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено Тогда
		Элементы.Тема.РедактированиеТекста                  = Ложь;
	КонецЕсли;
	
	Элементы.СтраницаКомментарий.Картинка = ОбщегоНазначенияКлиентСервер.КартинкаКомментария(Объект.Комментарий);
	
	СформироватьСпискиПолучателейПисьма();  
	ОтобразитьВажность();
	
КонецПроцедуры 

&НаСервереБезКонтекста
Функция НайтиКонтакты(Знач СтрокаПоиска)
	
	Результат = Новый СписокЗначений;
	ТаблицаКонтактов = Взаимодействия.НайтиКонтактыСАдресами(СтрокаПоиска);
	Для каждого Выборка Из ТаблицаКонтактов Цикл
		ЗначениеВыбора = Новый Структура;
		ЗначениеВыбора.Вставить("Контакт", Выборка.Контакт);
		ЗначениеВыбора.Вставить("Адрес", Выборка.Представление);
		ЗначениеВыбора.Вставить("Представление", Выборка.Наименование);
		ЗначениеВыбора.Вставить("ИндексВСпискеПолучателей", 0);
		Результат.Добавить(ЗначениеВыбора, 
			ВзаимодействияКлиентСервер.ПолучитьПредставлениеАдресата(Выборка.Наименование, Выборка.Представление, ""));
	КонецЦикла;
	Возврат Результат;
	
КонецФункции 

&НаКлиенте
Функция ПолучитьПредставлениеИдентификаторовОснований(Знач Идентификаторы)

	Идентификаторы = СтрЗаменить(Идентификаторы, "<",  " ");
	Идентификаторы = СтрЗаменить(Идентификаторы, ">",  " ");
	Идентификаторы = СтрЗаменить(Идентификаторы, "  ", " ");
	Идентификаторы = СокрЛП(СтрЗаменить(Идентификаторы, "  ", " "));
	Идентификаторы = СтрЗаменить(Идентификаторы, " ", Символы.ПС + "                          ");
	
	Возврат Идентификаторы;

КонецФункции

&НаКлиенте
Процедура РедактироватьСписокПолучателей(ДляПодбора, ГруппаПодбора = "")
	
	Объект.ПолучателиПисьма.Очистить();
	Объект.ПолучателиКопий.Очистить();
	Объект.ПолучателиСкрытыхКопий.Очистить();
	Объект.ПолучателиОтвета.Очистить();
	Для каждого Получатель Из СписокПолучателей Цикл
		Если Получатель.ВариантОтправки = "ОбратныйАдрес" Тогда
			НоваяСтрока = Объект.ПолучателиОтвета.Добавить();
		ИначеЕсли Получатель.ВариантОтправки = "Копия" Тогда
			НоваяСтрока = Объект.ПолучателиКопий.Добавить();
		ИначеЕсли Получатель.ВариантОтправки = "СкрытаяКопия" Тогда
			НоваяСтрока = Объект.ПолучателиСкрытыхКопий.Добавить();
		Иначе
			НоваяСтрока = Объект.ПолучателиПисьма.Добавить();
		КонецЕсли;
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Получатель);
	КонецЦикла;
	
	// Получим список адресатов
	СоответствиеТабличныхЧастей = Новый Соответствие;
	СоответствиеТабличныхЧастей.Вставить("Кому", Объект.ПолучателиПисьма);
	СоответствиеТабличныхЧастей.Вставить("Копии", Объект.ПолучателиКопий);
	СоответствиеТабличныхЧастей.Вставить("Скрытые", Объект.ПолучателиСкрытыхКопий);
	СоответствиеТабличныхЧастей.Вставить("Ответ", Объект.ПолучателиОтвета);
	
	СписокВыбранных = Новый СписокЗначений;
	Для Каждого ТабличнаяЧасть Из СоответствиеТабличныхЧастей Цикл
		СписокВыбранных.Добавить(
			УправлениеЭлектроннойПочтойКлиент.ТаблицуКонтактовВМассив(ТабличнаяЧасть.Значение), ТабличнаяЧасть.Ключ);
	КонецЦикла;

	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("УчетнаяЗапись", Объект.УчетнаяЗапись);
	ПараметрыОткрытия.Вставить("СписокВыбранных", СписокВыбранных);
	ПараметрыОткрытия.Вставить("Предмет", Предмет);
	ПараметрыОткрытия.Вставить("Письмо", Объект.Ссылка);
	ПараметрыОткрытия.Вставить("ГруппаПоУмолчанию", ?(ПустаяСтрока(ГруппаПодбора), "Кому", ГруппаПодбора));
	
	ОповещениеПослеЗакрытия = Новый ОписаниеОповещения("ПослеЗаполненияАдреснойКниги", ЭтотОбъект);
	ИмяОбщейФормы = ?(ДляПодбора, "ОбщаяФорма.АдреснаяКнига", "ОбщаяФорма.УточнениеКонтактов");
	
	ОткрытьФорму(ИмяОбщейФормы, ПараметрыОткрытия, ЭтотОбъект,,,, ОповещениеПослеЗакрытия);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаполненияАдреснойКниги(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт
	
	ЗаполнитьПодобранныхПолучателейПослеВыбора(ВыбранноеЗначение);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПодобранныхПолучателейПослеВыбора(ВыбранноеЗначение)
	
	Если ТипЗнч(ВыбранноеЗначение) <> Тип("Массив") И ТипЗнч(ВыбранноеЗначение) <> Тип("Соответствие") Тогда
		Возврат;
	КонецЕсли;
	
	// Получим список адресатов
	СоответствиеТабличныхЧастей = Новый Соответствие;
	СоответствиеТабличныхЧастей.Вставить("Кому", Объект.ПолучателиПисьма);
	СоответствиеТабличныхЧастей.Вставить("Копии", Объект.ПолучателиКопий);
	СоответствиеТабличныхЧастей.Вставить("Скрытые", Объект.ПолучателиСкрытыхКопий);
	СоответствиеТабличныхЧастей.Вставить("Получатели", Объект.ПолучателиОтвета);
	
	ДляПодбора = (Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено"));
	
	Если ДляПодбора Тогда
		ЗаполнитьПодобранныхПолучателей(СоответствиеТабличныхЧастей, ВыбранноеЗначение);
	Иначе
		ЗаполнитьУточненныеКонтакты(ВыбранноеЗначение);
	КонецЕсли;
	
	ВзаимодействияКлиентСервер.ПроверитьЗаполнениеКонтактов(Объект, ЭтотОбъект, "ЭлектронноеПисьмоИсходящее");
	ИзменилисьКонтакты = Истина;
	Модифицированность = Истина;

КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПодобранныхПолучателей(СоответствиеТабличныхЧастей, Результат)

	Для Каждого ТабличнаяЧасть Из СоответствиеТабличныхЧастей Цикл
		ТабличнаяЧасть.Значение.Очистить();
	КонецЦикла;
	
	МассивРанееДобавленныхАдресов = Новый Массив;
	
	Для Каждого Элемент Из Результат Цикл
		
		ТабличнаяЧасть = СоответствиеТабличныхЧастей.Получить(Элемент.Группа);
		Если ТабличнаяЧасть = Неопределено Тогда
			ТабличнаяЧасть = Объект.ПолучателиПисьма;
		КонецЕсли;
		
		Если МассивРанееДобавленныхАдресов.Найти(Элемент.Адрес) <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		НоваяСтрока = ТабличнаяЧасть.Добавить();
		НоваяСтрока.Адрес         = Элемент.Адрес;
		НоваяСтрока.Представление = ОбработанноеПредставлениеАдресата(Элемент.Представление);
		НоваяСтрока.Контакт       = Элемент.Контакт;
		
		МассивРанееДобавленныхАдресов.Добавить(НоваяСтрока.Адрес);
		
	КонецЦикла;
	
	ОчиститьДублиАдресатов(Объект.ПолучателиПисьма);
	
	СформироватьСпискиПолучателей();
	
КонецПроцедуры

&НаКлиенте
Процедура СформироватьСпискиПолучателей()

	Объект.СписокПолучателейПисьма =
		ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиПисьма, Ложь);
	Объект.СписокПолучателейКопий =
		ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиКопий, Ложь);
	Объект.СписокПолучателейСкрытыхКопий = 
		ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиСкрытыхКопий, Ложь);

	СформироватьСпискиПолучателейПисьма();
	
КонецПроцедуры

&НаСервере
Процедура СформироватьСпискиПолучателейПисьма()
	
	СписокПолучателей.Очистить();
	
	ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиПисьма, "Кому");
	ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиКопий, "Копия");
	ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиСкрытыхКопий, "СкрытаяКопия");
	ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиОтвета, "ОбратныйАдрес");
	
	Если СписокПолучателей.Количество() = 0 Тогда
		НоваяСтрока = СписокПолучателей.Добавить();
		НоваяСтрока.ВариантОтправки = "Кому";
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьАдресВСписокПолучателей(СписокПолучателей, ПолучателиПисьма, Кому)

	Для каждого СтрокаПолучатель Из ПолучателиПисьма Цикл
		НоваяСтрока = СписокПолучателей.Добавить();
		НоваяСтрока.ВариантОтправки = Кому;
		НоваяСтрока.Адрес           = СтрокаПолучатель.Адрес;
		НоваяСтрока.Контакт         = СтрокаПолучатель.Контакт;
		НоваяСтрока.Представление   = ВзаимодействияКлиентСервер.ПолучитьПредставлениеАдресата(СтрокаПолучатель.Представление, 
			СтрокаПолучатель.Адрес, "");
	КонецЦикла;
		
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьУточненныеКонтакты(Результат)
	
	Объект.ПолучателиКопий.Очистить();
	Объект.ПолучателиОтвета.Очистить();
	Объект.ПолучателиПисьма.Очистить();
	Объект.ПолучателиСкрытыхКопий.Очистить();
	
	Для каждого ЭлементМассива Из Результат Цикл
	
		Если ЭлементМассива.Группа = "Кому" Тогда
			ТаблицаПолучателей = Объект.ПолучателиПисьма;
		ИначеЕсли ЭлементМассива.Группа = "Копии" Тогда
			ТаблицаПолучателей = Объект.ПолучателиКопий;
		ИначеЕсли ЭлементМассива.Группа = "Скрытые" Тогда
			ТаблицаПолучателей = Объект.ПолучателиСкрытыхКопий;
		Иначе
			ТаблицаПолучателей = Объект.ПолучателиОтвета;
		КонецЕсли;
		
		СтрокаПолучатели = ТаблицаПолучателей.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаПолучатели, ЭлементМассива);
	
	КонецЦикла;
	
	СформироватьСпискиПолучателей();

КонецПроцедуры

&НаКлиенте
Процедура ПоказатьПредупреждениеОНеобходимостиВвестиАдресЭлектроннойПочты()
	ПоказатьПредупреждение(, НСтр("ru = 'Введите адрес электронной почты'"));
КонецПроцедуры

&НаСервере
Функция ВыполнитьОтправкуНаСервере()
	
	ПисьмоОбъект = РеквизитФормыВЗначение("Объект");
	
	Результат = Новый Структура;
	Результат.Вставить("ТекстСообщения", "");
	Результат.Вставить("ПисьмоОтправлено", Ложь);
	Результат.Вставить("ОшибкаПодключения", Ложь);
	
	ПараметрыПисьма = Взаимодействия.ПараметрыПисьмаДляОтправки(ПисьмоОбъект);
	Письмо = РаботаСПочтовымиСообщениями.ПодготовитьПисьмо(ПисьмоОбъект.УчетнаяЗапись, ПараметрыПисьма);
	Попытка
		РезультатОтправки = РаботаСПочтовымиСообщениями.ОтправитьПисьмо(ПисьмоОбъект.УчетнаяЗапись, Письмо);
	Исключение
		
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		
		Если Не РаботаСПочтовымиСообщениямиСлужебныйКлиентСервер.ЭтоОшибкаРаботыИнтернетПочты(ИнформацияОбОшибке) Тогда
			ВызватьИсключение;
		КонецЕсли;
		
		ТекстОшибки = РаботаСПочтовымиСообщениями.РасширенноеПредставлениеОшибки(
			ИнформацияОбОшибке, ОбщегоНазначения.КодОсновногоЯзыка());
		ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(),
			УровеньЖурналаРегистрации.Ошибка, , ПисьмоОбъект.Ссылка, ТекстОшибки);
		
		Результат.ТекстСообщения = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
		Результат.ОшибкаПодключения = Истина;
		Возврат Результат;
	КонецПопытки;
	
	ПараметрыОбработкиОшибки = УправлениеЭлектроннойПочтой.ПараметрыОбработкиОшибкиОтправки();
	ПараметрыОбработкиОшибки.ПисьмоОбъект                      = ПисьмоОбъект;
	ПараметрыОбработкиОшибки.Ссылка                            = ПисьмоОбъект.Ссылка;
	ПараметрыОбработкиОшибки.ПредставлениеПисьма               = Взаимодействия.ПредставлениеПисьма(ПисьмоОбъект.Тема, ПисьмоОбъект.Дата);
	ПараметрыОбработкиОшибки.КоличествоПопыток                 = 0;
	ПараметрыОбработкиОшибки.ИнкрементироватьКоличествоПопыток = Ложь;
	ПараметрыОбработкиОшибки.СообщатьПользователю              = Истина;
	
	Если ЗначениеЗаполнено(РезультатОтправки.ОшибочныеПолучатели) Тогда
		ЗаполнитьЗначенияСвойств(Результат, УправлениеЭлектроннойПочтой.ОбработатьОшибкуОтправкиПисьма(
			ПараметрыОбработкиОшибки, РезультатОтправки.ОшибочныеПолучатели));
			
		Если Не Результат.ПисьмоОтправлено Тогда
			ЗначениеВРеквизитФормы(ПисьмоОбъект, "Объект");
			Возврат Результат;
		КонецЕсли;
	КонецЕсли;
	
	Результат.ПисьмоОтправлено = Истина;
	
	НачатьТранзакцию();
	Попытка
		Блокировка = Новый БлокировкаДанных;
		ЭлементБлокировки = Блокировка.Добавить("Документ.ЭлектронноеПисьмоИсходящее");
		ЭлементБлокировки.УстановитьЗначение("Ссылка", Объект.Ссылка);
		РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаблокироватьПредметыПапокВзаимодействий(Блокировка, Объект.Ссылка);
		Блокировка.Заблокировать();
		
		Если НЕ ПисьмоОбъект.УдалятьПослеОтправки Тогда
			
			ПисьмоОбъект.СтатусПисьма                       = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено;
			ПисьмоОбъект.ДатаОтправления                    = ТекущаяДатаСеанса();
			ПисьмоОбъект.ИдентификаторСообщения             = РезультатОтправки.ИдентификаторПисьмаSMTP;
			ПисьмоОбъект.ИдентификаторСообщенияОтправкаIMAP = РезультатОтправки.ИдентификаторПисьмаIMAP;
			ПисьмоОбъект.Записать(РежимЗаписиДокумента.Запись);
			ЗначениеВРеквизитФормы(ПисьмоОбъект, "Объект");
			
			Взаимодействия.УстановитьПапкуЭлектронногоПисьма(Объект.Ссылка, Взаимодействия.ОпределитьПапкуДляПисьма(Объект.Ссылка));
			ТекущийСтатусПисьма = Объект.СтатусПисьма;
		Иначе
			ПисьмоОбъект.Прочитать();
			ПисьмоОбъект.Удалить();
		КонецЕсли;
		ЗафиксироватьТранзакцию();
	Исключение
		ОтменитьТранзакцию();
		ВызватьИсключение;
	КонецПопытки;	
	Возврат Результат;
	
КонецФункции

&НаСервере
Функция ОценитьРазмерПисьма()

	Размер = СтрДлина(Объект.Тема)*2;
	Размер = Размер + ?(Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML,
	                    СтрДлина(Объект.ТекстHTML),
	                    СтрДлина(Объект.Текст)) * 2;
	
	Для каждого Вложение Из Вложения Цикл
		Размер = Размер + Вложение.Размер * 1.5;
	КонецЦикла;
	
	Для каждого СтрокаТаблицыСоответствий Из ТаблицаСоответствийИменВложенийИдентификаторам Цикл
		Размер = Размер + СтрокаТаблицыСоответствий.Картинка.ПолучитьДвоичныеДанные().Размер()*1.5;
	КонецЦикла;
	
	Возврат Размер;

КонецФункции

&НаСервере
Функция РеквизитыФайла(Файл)
	
	ТребуемыеРеквизиты = "Наименование, Расширение, ИндексКартинки, Размер";
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
		ТребуемыеРеквизиты = ТребуемыеРеквизиты + ", ПодписанЭП";
	КонецЕсли;
	
	Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Файл, ТребуемыеРеквизиты);
	
КонецФункции

&НаКлиенте
Процедура ОтправитьПисьмоКлиент()
	
	Если Не ОтправлятьСообщенияСразу Тогда
		ОтправлятьСообщенияСразу = (
			Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Исходящее"));
	КонецЕсли;
	
	ВыполняетсяОтправка = Истина;
	
	Если Объект.Ссылка.Пустая() 
		Или Модифицированность 
		Или Объект.ВключатьТелоИсходногоПисьма 
		Или (Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик")) Тогда
		Записать();
	КонецЕсли;
	
	ВыполняетсяОтправка = Ложь;
	
	Если Модифицированность Тогда
		Возврат;
	КонецЕсли;
	
	Если ОтправлятьСообщенияСразу Тогда
		Результат = ВыполнитьОтправкуНаСервере();
	Иначе
		Закрыть();
		Возврат;
	КонецЕсли;
	
	Если Результат.ПисьмоОтправлено И Результат.ТекстСообщения = "" Тогда
		Закрыть();
		Возврат;
	КонецЕсли;
	
	Если Результат.ПисьмоОтправлено  Тогда
		Прочитать();
	КонецЕсли;
	
	Если Результат.ОшибкаПодключения Тогда
		РаботаСПочтовымиСообщениямиКлиент.СообщитьОбОшибкеПодключения(Объект.УчетнаяЗапись, 
			НСтр("ru = 'Письмо не отправлено'"), Результат.ТекстСообщения);
	Иначе
		ПоказатьПредупреждение(, Результат.ТекстСообщения);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ВопросОНеСохраненииОтправленногоПисьма(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
		Объект.УдалятьПослеОтправки = Истина;
	ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Нет Тогда
		Объект.УдалятьПослеОтправки = Ложь;
	ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
		Возврат;
	КонецЕсли;
	
	ОтправитьПисьмоКлиент();
	
КонецПроцедуры

&НаКлиенте
Процедура ВопросПриИзмененииФорматаПриЗакрытии(РезультатВопроса, ДополнительныеПараметры) Экспорт
	
	Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
		ФорматСообщения = ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.HTML");
	Иначе
		ТекстПисьма = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст();
		Объект.ТипТекста = ПредопределенноеЗначение("Перечисление.ТипыТекстовЭлектронныхПисем.ПростойТекст");
		ТекстПисьмаФорматированныйДокумент.Удалить();
		Элементы.ТекстПисьма.Вид = ВидПоляФормы.ПолеТекстовогоДокумента;
		Объект.ТекстHTML = "";
		Объект.Кодировка = "UTF-8";
		Элементы.СтраницыТекстПисьма.ТекущаяСтраница = Элементы.СтраницаОбычныйТекст;
	КонецЕсли;
		
	Элементы.ФорматСообщения.Заголовок = ФорматСообщения;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьСвойстваВложения(ТекущийИндексВКоллекции)
	
	ТекущиеДанные = Вложения.Получить(ТекущийИндексВКоллекции);
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Элементы.Вложения.ТекущаяСтрока = ТекущиеДанные.ПолучитьИдентификатор();

	ФайлДоступенДляРедактирования = 
		(Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик"));
	ПараметрыФормы = Новый Структура("ТолькоПросмотр", НЕ ФайлДоступенДляРедактирования);
	РаботаСФайламиКлиент.ОткрытьФормуФайла(ТекущиеДанные.Ссылка,, ПараметрыФормы);
	
КонецПроцедуры

&НаСервере
Процедура ИзменитьПодпись(ПредыдущаяУчетнаяЗапись, НоваяУчетнаяЗапись)

	ПараметрыПредыдущаяУЗ =
			Взаимодействия.ПолучитьПараметрыРаботыПользователяДляИсходящегоЭлектронногоПисьма(
			ПредыдущаяУчетнаяЗапись,
			ФорматСообщения,
			?(Объект.ВзаимодействиеОснование = Неопределено, Истина, Ложь));
			
	ПараметрыНоваяУЗ =
			Взаимодействия.ПолучитьПараметрыРаботыПользователяДляИсходящегоЭлектронногоПисьма(
			НоваяУчетнаяЗапись,
			ФорматСообщения,
			?(Объект.ВзаимодействиеОснование = Неопределено, Истина, Ложь));
	
	Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст Тогда
		Если ПустаяСтрока(ТекстПисьма) Тогда
			ТекстПисьма = ПараметрыНоваяУЗ.Подпись;
		Иначе
			Если СтрЧислоВхождений(ТекстПисьма, ПараметрыПредыдущаяУЗ.Подпись) > 0 Тогда
				ТекстПисьма = СтрЗаменить(ТекстПисьма, ПараметрыПредыдущаяУЗ.Подпись, ПараметрыНоваяУЗ.Подпись);
			Иначе
				ТекстПисьма = ТекстПисьма + ПараметрыНоваяУЗ.Подпись;
			КонецЕсли;
		КонецЕсли;
	Иначе
		
		
		ТекстПисьмо = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст();
		Если ПустаяСтрока(ТекстПисьмо) Тогда
			
			ТекстПисьмаФорматированныйДокумент = ПараметрыНоваяУЗ.Подпись;
			
		Иначе
			
			Если ТипЗнч(ПараметрыПредыдущаяУЗ.Подпись) = Тип("ФорматированныйДокумент") Тогда
				
				ТекстПредыдущаяУЗ = ПараметрыПредыдущаяУЗ.Подпись.ПолучитьТекст();
				
				Если СтрЧислоВхождений(ТекстПисьмо, ТекстПредыдущаяУЗ) > 0 Тогда
					
					УдалитьЭлементыСтаройПодписи(ТекстПисьмаФорматированныйДокумент,ПараметрыПредыдущаяУЗ.Подпись);
					
				КонецЕсли;
				
				Если ТипЗнч(ПараметрыНоваяУЗ.Подпись) = Тип("ФорматированныйДокумент") Тогда
					ДобавитьФорматированныйДокументКФорматированномуДокументу(ТекстПисьмаФорматированныйДокумент, ПараметрыНоваяУЗ.Подпись);
				КонецЕсли;
			
			КонецЕсли;
			
		КонецЕсли;
		
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ПриИзмененииФорматаПодписиНаHTMLНаСервере(УчетнаяЗапись)
	
	ПараметрыУЗ =
			Взаимодействия.ПолучитьПараметрыРаботыПользователяДляИсходящегоЭлектронногоПисьма(
			УчетнаяЗапись,
			ФорматСообщения,
			?(Объект.ВзаимодействиеОснование = Неопределено, Истина, Ложь));
		
	Если ПараметрыУЗ.Подпись <> Неопределено Тогда
		
		ТекстПодпись = ПараметрыУЗ.Подпись.ПолучитьТекст();
	
		Если СтрЧислоВхождений(ТекстПисьма, ТекстПодпись) > 0 Тогда
			ТекстПисьма = СтрЗаменить(ТекстПисьма, ТекстПодпись, "");
		КонецЕсли;
	
		ТекстПисьмаФорматированныйДокумент.Добавить(ТекстПисьма);
	
		ДобавитьФорматированныйДокументКФорматированномуДокументу(ТекстПисьмаФорматированныйДокумент, ПараметрыУЗ.Подпись);
		
	Иначе
		
		ТекстПисьмаФорматированныйДокумент.Добавить(ТекстПисьма);
		
	КонецЕсли;
	
	Объект.Текст = "";
	Объект.ТипТекста =  ПредопределенноеЗначение("Перечисление.ТипыТекстовЭлектронныхПисем.HTML");
	Элементы.СтраницыТекстПисьма.ТекущаяСтраница = Элементы.СтраницаФорматированныйДокумент;
	Элементы.ФорматСообщения.Заголовок = ФорматСообщения;
	
КонецПроцедуры

&НаСервере
Процедура УдалитьЭлементыСтаройПодписи(ТекстПисьмаФорматированныйДокумент, СтараяПодпись)

	ТекстHTMLФорматированныйДокумент = "";
	ВложенияФорматированныйДокумент = Новый Структура;
	
	ТекстПисьмаФорматированныйДокумент.ПолучитьHTML(ТекстHTMLФорматированныйДокумент, ВложенияФорматированныйДокумент);
	
	СтараяПодписьДобавлением = Новый ФорматированныйДокумент;
	ДобавитьФорматированныйДокументКФорматированномуДокументу(СтараяПодписьДобавлением, СтараяПодпись);
	ТекстHTMLСтараяПодпись = "";
	ВложенияСтараяПодпись = Новый Структура;
	
	СтараяПодписьДобавлением.ПолучитьHTML(ТекстHTMLСтараяПодпись, ВложенияСтараяПодпись);

	ТекстHTMLСтараяПодпись = Взаимодействия.СодержимоеТегаHTML(ТекстHTMLСтараяПодпись,"body");
	ТекстHTMLФорматированныйДокумент = СтрЗаменить(ТекстHTMLФорматированныйДокумент, ТекстHTMLСтараяПодпись, "");
	ТекстПисьмаФорматированныйДокумент.УстановитьHTML(ТекстHTMLФорматированныйДокумент, ВложенияФорматированныйДокумент);
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьФорматированныйДокументКФорматированномуДокументу(ПриемникДокумент, ДобавляемыйДокумент)

	Для Инд = 0 По ДобавляемыйДокумент.Элементы.Количество() -1 Цикл
		ДобавляемыйЭлемент = ДобавляемыйДокумент.Элементы[Инд];
		Если ТипЗнч(ДобавляемыйЭлемент) = Тип("ПараграфФорматированногоДокумента") Тогда
			НовыйПараграф = ПриемникДокумент.Элементы.Добавить();
			ЗаполнитьЗначенияСвойств(НовыйПараграф, ДобавляемыйЭлемент, "ТипПараграфа, ГоризонтальноеПоложение, МеждустрочныйИнтервал,Отступ");
			ДобавитьФорматированныйДокументКФорматированномуДокументу(НовыйПараграф, ДобавляемыйЭлемент);
		Иначе
			Если ТипЗнч(ДобавляемыйЭлемент) = Тип("ТекстФорматированногоДокумента")
				И Не ДобавляемыйЭлемент.Текст = "" Тогда
				НовыйЭлемент = ПриемникДокумент.Элементы.Добавить(ДобавляемыйЭлемент.Текст, Тип("ТекстФорматированногоДокумента"));
				ЗаполнитьЗначенияСвойств(НовыйЭлемент,ДобавляемыйЭлемент,,"ЗакладкаКонца, ЗакладкаНачала, Родитель");
			ИначеЕсли ТипЗнч(ДобавляемыйЭлемент) = Тип("КартинкаФорматированногоДокумента") Тогда
				НовыйЭлемент = ПриемникДокумент.Элементы.Добавить(ДобавляемыйЭлемент.Картинка, Тип("КартинкаФорматированногоДокумента"));
				ЗаполнитьЗначенияСвойств(НовыйЭлемент,ДобавляемыйЭлемент,,"ЗакладкаКонца, ЗакладкаНачала, Родитель");
			ИначеЕсли ТипЗнч(ДобавляемыйЭлемент) = Тип("ПереводСтрокиФорматированногоДокумента") Тогда
				Если ТипЗнч(ДобавляемыйДокумент) = Тип("ПараграфФорматированногоДокумента") 
					И (ДобавляемыйДокумент.ТипПараграфа = ТипПараграфа.МаркированныйСписок
					Или ДобавляемыйДокумент.ТипПараграфа = ТипПараграфа.НумерованныйСписок) Тогда
					Продолжить;
				КонецЕсли;
				НовыйЭлемент = ПриемникДокумент.Элементы.Добавить( , Тип("ПереводСтрокиФорматированногоДокумента"));
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ОчиститьДублиАдресатов(ТаблицаПолучателей)
	
	СоответствиеАдресовСтрокКУдалению = Новый Соответствие;
	
	Для Каждого СтрокаПолучатель Из ТаблицаПолучателей Цикл
		Если СоответствиеАдресовСтрокКУдалению.Получить(СтрокаПолучатель.Адрес) <> Неопределено Тогда
			Продолжить;
		КонецЕсли;
		НайденныеСтроки =  ТаблицаПолучателей.НайтиСтроки(Новый Структура("Адрес", СтрокаПолучатель.Адрес));
		Если НайденныеСтроки.Количество() > 1 Тогда
			МассивКУдалению = Новый Массив;
			Для Инд = 0 По НайденныеСтроки.Количество() - 1 Цикл
				Если Инд = 0 Тогда
					Если НЕ ЗначениеЗаполнено(НайденныеСтроки[Инд].Контакт) Тогда
						МассивКУдалению.Добавить(НайденныеСтроки[Инд]);
					КонецЕсли;
				Иначе
					Если МассивКУдалению.Количество() = 0 ИЛИ (НЕ ЗначениеЗаполнено(НайденныеСтроки[Инд].Контакт)) Тогда
						МассивКУдалению.Добавить(НайденныеСтроки[Инд]);
					ИначеЕсли ЗначениеЗаполнено(НайденныеСтроки[Инд].Контакт) И НЕ (Инд = МассивКУдалению.Количество()) Тогда
						МассивКУдалению.Добавить(НайденныеСтроки[Инд]);
					КонецЕсли;
				КонецЕсли;
				
			КонецЦикла;
			
			Если НайденныеСтроки.Количество() = МассивКУдалению.Количество() Тогда
				МассивКУдалению.Удалить(0);
			КонецЕсли;
			
			СоответствиеАдресовСтрокКУдалению.Вставить(СтрокаПолучатель.Адрес,МассивКУдалению);
			
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого СтрокаСоответствия Из СоответствиеАдресовСтрокКУдалению Цикл
		Для Каждого СтрокаКУдалению Из СтрокаСоответствия.Значение Цикл
			ТаблицаПолучателей.Удалить(СтрокаКУдалению);
		КонецЦикла;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Функция ПараметрыПисьмаВложения()
	
	ПараметрыВложения = ВзаимодействияКлиент.ПараметрыПисьмаВложения();
	ПараметрыВложения.ДатаПисьмаОснования = ?(ЗначениеЗаполнено(Объект.ДатаОтправления), Объект.ДатаОтправления, Объект.Дата);
	ПараметрыВложения.ПисьмоОснование     = Объект.Ссылка;
	ПараметрыВложения.ТемаПисьмаОснования = Объект.Тема;
	
	Возврат ПараметрыВложения;
	
КонецФункции

&НаКлиенте
Процедура ПослеПомещенияФайла(Результат, ДополнительныеПараметры) Экспорт
	
	Если Результат <> Неопределено Тогда
		Если Не ПустаяСтрока(Результат.ОписаниеОшибки) Тогда
			ВызватьИсключение Результат.ОписаниеОшибки;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеИзмененияОтправителя()

	ИзменитьПодпись(УчетнаяЗаписьДоИзменения, Объект.УчетнаяЗапись);

КонецПроцедуры

&НаКлиенте
Процедура ПослеВопросаПриЗакрытии(Результат, ДополнительныеПараметры) Экспорт

	Если Результат = КодВозвратаДиалога.Да Тогда
		ЗаписаноУспешно = Записать();
		Если ЗаписаноУспешно Тогда
			Закрыть();
		КонецЕсли;
	ИначеЕсли Результат = КодВозвратаДиалога.Нет 
		И ДополнительныеПараметры.МассивРедактируемыхФайлов.Количество() > 0 Тогда
		
		РаботаСФайламиСлужебныйВызовСервера.ОсвободитьФайлы(ДополнительныеПараметры.МассивРедактируемыхФайлов);
		Модифицированность = Ложь;
		Закрыть();
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьТабличныеЧастиПоСпискуПолучателей()
	
	Объект.ПолучателиПисьма.Очистить();
	Объект.ПолучателиКопий.Очистить();
	Объект.ПолучателиСкрытыхКопий.Очистить();
	Объект.ПолучателиОтвета.Очистить();
	Для каждого Получатель Из СписокПолучателей Цикл
		
		Если ПустаяСтрока(Получатель.Представление) Тогда
			Получатель.Адрес = "";
			Получатель.Контакт = Неопределено;
			Продолжить;
		КонецЕсли;
				
		ПочтовыеАдреса = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(Получатель.Представление);
		
		Для каждого ПочтовыйАдрес Из ПочтовыеАдреса Цикл
			
			Если Получатель.ВариантОтправки = "ОбратныйАдрес" Тогда
				НоваяСтрока = Объект.ПолучателиОтвета.Добавить();
			ИначеЕсли Получатель.ВариантОтправки = "Копия" Тогда
				НоваяСтрока = Объект.ПолучателиКопий.Добавить();
			ИначеЕсли Получатель.ВариантОтправки = "СкрытаяКопия" Тогда
				НоваяСтрока = Объект.ПолучателиСкрытыхКопий.Добавить();
			Иначе
				НоваяСтрока = Объект.ПолучателиПисьма.Добавить();
			КонецЕсли;
			
			НоваяСтрока.Адрес = ПочтовыйАдрес.Адрес;
			НоваяСтрока.Представление = ПочтовыйАдрес.Псевдоним;
			НоваяСтрока.Контакт = Получатель.Контакт;
		КонецЦикла;
		
	КонецЦикла;
	
КонецПроцедуры

// СтандартныеПодсистемы.Свойства

&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
		МодульУправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
		МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
		МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
	КонецЕсли;
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.Свойства

// СтандартныеПодсистемы.ШаблоныСообщений

&НаКлиенте
Процедура ЗаполнитьПоШаблонуПослеВыбораШаблона(Результат, ДополнительныеПараметры) Экспорт
	Если Результат <> Неопределено И ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("Шаблон") Тогда
		ЗаполнитьШаблонПослеВыбора(Результат);
	КонецЕсли;
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьШаблонПослеВыбора(ПараметрыПисьма)
	
	ОбработатьПереданныеПараметры(ПараметрыПисьма);
	СформироватьСпискиПолучателейПисьма();
	ОпределитьВидимостьДоступностьЭлементовВЗависимостиОтСтатусаПисьма();
	
КонецПроцедуры

&НаСервере
Процедура ОпределитьВозможностьЗаполненияПисьмаПоШаблону()
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда
		Если Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда
			МодульШаблоныСообщенийСлужебный = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщенийСлужебный");
			Элементы.ФормаСформироватьПоШаблону.Видимость = МодульШаблоныСообщенийСлужебный.ИспользуютсяШаблоныСообщений();
		КонецЕсли;
	Иначе
		Элементы.ФормаСформироватьПоШаблону.Видимость = Ложь;
	КонецЕсли;
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.ШаблоныСообщений

&НаСервере
Процедура УстановитьВидимостьПредупрежденияБезопасности()
	ЗапрещеноОтображениеНебезопасногоСодержимогоВПисьмах = Взаимодействия.ЗапрещеноОтображениеНебезопасногоСодержимогоВПисьмах();
	Элементы.ПредупреждениеБезопасности.Видимость = Не ЗапрещеноОтображениеНебезопасногоСодержимогоВПисьмах
		И ЕстьНебезопасноеСодержимое И Не ВключитьНебезопасноеСодержимое;
КонецПроцедуры

&НаСервере
Процедура ПрочитатьТекстВходящегоПисьмаHTML()
	ТекстВходящегоПисьма = Взаимодействия.ОбработатьТекстHTML(Объект.ВзаимодействиеОснование,
		Не ВключитьНебезопасноеСодержимое, ЕстьНебезопасноеСодержимое);
	УстановитьВидимостьПредупрежденияБезопасности();
КонецПроцедуры

#КонецОбласти

// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
	МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
	МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
	ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры

&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
	МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
	МодульПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
	МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
	МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды

&НаКлиенте
Процедура ПроверитьСостояниеОтправкиПисем()
	
	СостояниеОтправкиПисем = СостояниеОтправкиПисем();
	Если Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость <> СостояниеОтправкиПисем.ОтправкаПриостановлена Тогда
		Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость = СостояниеОтправкиПисем.ОтправкаПриостановлена;
		Элементы.ПредупреждениеОНеотправленныхПисьмахНадпись.Заголовок = СостояниеОтправкиПисем.ТекстПредупреждения;
	КонецЕсли;
	
	Интервал = ?(Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость, 60, 600);
	ПодключитьОбработчикОжидания("ПроверитьСостояниеОтправкиПисем", Интервал, Истина);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция СостояниеОтправкиПисем()
	
	Результат = Новый Структура;
	Результат.Вставить("ОтправкаПриостановлена", Взаимодействия.ОтправкаПисемПриостановлена());
	Результат.Вставить("ТекстПредупреждения", Взаимодействия.ТекстПредупрежденияОПриостановкеОтправкиПисем());
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти

Связанные материалы