#Область ОписаниеПеременных
&НаКлиенте
Перем КонтекстВыбора;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
Объект.ТекстHTML = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Объект.ТекстHTML);
Если Объект.Ссылка.Пустая() Тогда
Рассмотрено = Истина;
ПриСозданииИПриЧтенииНаСервере();
Взаимодействия.УстановитьПредметПоДаннымЗаполнения(Параметры, Предмет);
ИзменилисьКонтакты = Истина;
КонецЕсли;
Взаимодействия.ЗаполнитьСписокВыбораДляРассмотретьПосле(Элементы.РассмотретьПосле.СписокВыбора);
ЗапрещенныеРасширения = РаботаСФайламиСлужебный.СписокЗапрещенныхРасширений();
Взаимодействия.ПодготовитьОповещения(ЭтотОбъект,Параметры);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "СтраницаДополнительныеРеквизиты");
ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
КонецЕсли;
ОпределитьВозможностьЗаполненияПисьмаПоШаблону();
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
КонецЕсли;
СостояниеОтправкиПисем = СостояниеОтправкиПисем();
Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость = СостояниеОтправкиПисем.ОтправкаПриостановлена;
Элементы.ПредупреждениеОНеотправленныхПисьмахНадпись.Заголовок = СостояниеОтправкиПисем.ТекстПредупреждения;
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
Элементы.УточнитьКонтакты.Заголовок = НСтр("ru = 'Сохранить адреса в контакты'");
Элементы.УточнитьКонтакты.Отображение = ОтображениеКнопки.Текст;
Элементы.ГруппаЛево.ВыравниваниеЭлементовИЗаголовков = ВариантВыравниванияЭлементовИЗаголовков.ЭлементыПравоЗаголовкиЛево;
Элементы.Тема.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх;
Элементы.ГруппаВложения.ОтображатьЗаголовок = Истина;
Элементы.ГруппаПолучатели.ОтображатьЗаголовок = Истина;
Элементы.СохранитьВложение.Отображение = ОтображениеКнопки.Картинка;
Элементы.УдалитьВложение.Отображение = ОтображениеКнопки.Картинка;
Элементы.УдалитьВложение.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели;
КонецЕсли;
ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
КонецЕсли;
УправлениеДоступностью();
Интервал = ?(Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость, 60, 600);
ПодключитьОбработчикОжидания("ПроверитьСостояниеОтправкиПисем", Интервал, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
Если МодульУправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
ОбновитьЭлементыДополнительныхРеквизитов();
МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
КонецЕсли;
ВзаимодействияКлиент.ОтработатьОповещение(ЭтотОбъект, ИмяСобытия, Параметр, Источник);
Если ИмяСобытия = "Запись_ПрисоединенныйФайл" Тогда
Если ТипЗнч(Источник) = Тип("СправочникСсылка.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы") Тогда
ВложенияТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
Если ВложенияТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
РеквизитыФайла = РеквизитыФайла(Источник);
ЗаполнитьЗначенияСвойств(ВложенияТекущиеДанные, РеквизитыФайла);
ВложенияТекущиеДанные.РазмерПредставление =
ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(РеквизитыФайла.Размер);
ВложенияТекущиеДанные.ИмяФайла = ?(ПустаяСтрока(РеквизитыФайла.Расширение),
РеквизитыФайла.Наименование,
РеквизитыФайла.Наименование + "." + РеквизитыФайла.Расширение);
КонецЕсли;
КонецЕсли;
Если ИмяСобытия = "Запись_ШаблоныСообщений" Тогда
ОпределитьВозможностьЗаполненияПисьмаПоШаблону();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Перем СтрокаНачало, СтрокаКонец, КолонкаНачало, КолонкаКонец;
Перем НачалоВыделения, КонецВыделения;
Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Документ.ЭлектронноеПисьмоИсходящее.Форма.ФормированиеВнешнейСсылкиНаОбъект") Тогда
Если ФорматСообщения = ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст") Тогда
Элементы.ТекстПисьма.ПолучитьГраницыВыделения(СтрокаНачало, КолонкаНачало, СтрокаКонец, КолонкаКонец);
ТекстПисьма = РезультатВставкиТекстаВПисьмо(ТекстПисьма, СтрокаНачало, КолонкаНачало, КолонкаКонец, ВыбранноеЗначение);
Иначе
Элементы.ТекстПисьмаФорматированныйДокумент.ПолучитьГраницыВыделения(НачалоВыделения, КонецВыделения);
ТекстПисьмаФорматированныйДокумент.Вставить(НачалоВыделения, ВыбранноеЗначение);
КонецЕсли;
ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ЖурналДокументов.Взаимодействия.Форма.ПараметрыЭлектронногоПисьма") Тогда
Если ВыбранноеЗначение <> Неопределено И Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено") Тогда
Объект.УведомитьОДоставке = ВыбранноеЗначение.УведомитьОДоставке;
Объект.УведомитьОПрочтении = ВыбранноеЗначение.УведомитьОПрочтении;
Объект.ВключатьТелоИсходногоПисьма = ВыбранноеЗначение.ВключатьТелоИсходногоПисьма;
Модифицированность = Истина;
КонецЕсли;
ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.АдреснаяКнига")
ИЛИ ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.УточнениеКонтактов") Тогда
ЗаполнитьПодобранныхПолучателейПослеВыбора(ВыбранноеЗначение);
Иначе
ВзаимодействияКлиент.ФормаОбработкаВыбора(ЭтотОбъект, ВыбранноеЗначение, ИсточникВыбора, КонтекстВыбора);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
ВключитьНебезопасноеСодержимое = Ложь;
Взаимодействия.УстановитьРеквизитыФормыВзаимодействияПоДаннымРегистра(ЭтотОбъект);
ПриСозданииИПриЧтенииНаСервере();
Объект.ТекстHTML = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыXML(Объект.ТекстHTML);
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
МодульУправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
ОчиститьСообщения();
Если Не ВыполняетсяОтправка Тогда
Если ПроверитьЗаполнениеСписковАдресатов() Тогда
Отказ = Истина;
КонецЕсли;
Если Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик")
ИЛИ Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено") Тогда
ВзаимодействияКлиент.ПроверкаЗаполненностиРеквизитовОтложеннойОтправки(Объект, Отказ);
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
КонецЕсли;
#Если Не ВебКлиент Тогда
Для Каждого СтрокаТаблицыВложений Из Вложения Цикл
Если СтрокаТаблицыВложений.Расположение = 2 Тогда
Попытка
Данные = Новый ДвоичныеДанные(СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере);
СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(Данные, "");
СтрокаТаблицыВложений.Расположение = 4;
Исключение
ОбщегоНазначенияКлиент.СообщитьПользователю(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),,"Вложения",, Отказ);
КонецПопытки;
КонецЕсли;
КонецЦикла;
#КонецЕсли
Объект.ЕстьВложения = (Вложения.Количество() <> 0);
ЗаполнитьТабличныеЧастиПоСпискуПолучателей();
Объект.СписокПолучателейПисьма =
ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиПисьма, Ложь);
Объект.СписокПолучателейКопий =
ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиКопий, Ложь);
Объект.СписокПолучателейСкрытыхКопий =
ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиСкрытыхКопий, Ложь);
Для Каждого Вложение Из Вложения Цикл
Если Вложение.Расположение = 0
И Вложение.Редактируется Тогда
ОписаниеОповещенияПомещенияФайла = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
РаботаСФайламиКлиент.ПоместитьПрисоединенныйФайл(ОписаниеОповещенияПомещенияФайла, Вложение.Ссылка, УникальныйИдентификатор);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если Не ЗавершениеРаботы
И Модифицированность
И Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик") Тогда
ЕстьРедактируемыеФайлы = Ложь;
МассивРедактируемыхФайлов = Новый Массив;
Для Каждого Вложение Из Вложения Цикл
Если Вложение.Редактируется Тогда
ЕстьРедактируемыеФайлы = Истина;
МассивРедактируемыхФайлов.Добавить(Вложение.Ссылка);
КонецЕсли;
КонецЦикла;
Если ЕстьРедактируемыеФайлы Тогда
Отказ = Истина;
СтандартнаяОбработка = Ложь;
ТекстВопроса = НСтр("ru = 'Данные были изменены, Записать?'");
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("МассивРедактируемыхФайлов", МассивРедактируемыхФайлов);
ОповещениеПослеВопросаОЗакрытии = Новый ОписаниеОповещения("ПослеВопросаПриЗакрытии", ЭтотОбъект, ДополнительныеПараметры);
ПоказатьВопрос(ОповещениеПослеВопросаОЗакрытии, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, РежимЗаписи, РежимПроведения)
Документ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) И Объект.ДатаАктуальностиОтправки < ОбщегоНазначенияКлиент.ДатаСеанса())) Тогда
Элементы.Отправить.Видимость = Ложь;
Иначе
Элементы.Отправить.Видимость = Истина;
КонецЕсли;
Элементы.ФормаЗаписатьИЗакрыть.Видимость = Не Элементы.Отправить.Видимость;
Если Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Исходящее") Тогда
Элементы.ДатаОтправления.Заголовок = НСтр("ru = 'Передано на отправку'");
Иначе
Элементы.ДатаОтправления.Заголовок = НСтр("ru = 'Отправлено'");
КонецЕсли;
Элементы.ГруппаДатаОтправкиАктуальность.Доступность = (Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено"));
КонецПроцедуры
&НаСервере
Процедура ОпределитьВидимостьДоступностьЭлементовВЗависимостиОтСтатусаПисьма()
Если Объект.СтатусПисьма <> Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено Тогда
УправлениеЭлектроннойПочтой.ПолучитьДоступныеУчетныеЗаписиДляОтправки(
Элементы.ОтправительПредставление.СписокВыбора,ДоступныеДляОтправкиУчетныеЗаписи);
Если Объект.УчетнаяЗапись.Пустая()
И ДоступныеДляОтправкиУчетныеЗаписи.Количество() > 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) <> "" Тогда
ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.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);
ПодключитьОбработчикОжидания("ПроверитьСостояниеОтправкиПисем", Интервал, Истина);
КонецПроцедуры
&НаСервереБезКонтекста
Функция СостояниеОтправкиПисем()
Результат = Новый Структура;
Результат.Вставить("ОтправкаПриостановлена", Взаимодействия.ОтправкаПисемПриостановлена());
Результат.Вставить("ТекстПредупреждения", Взаимодействия.ТекстПредупрежденияОПриостановкеОтправкиПисем());
Возврат Результат;
КонецФункции
#КонецОбласти