Files
2020-08-25 12:45:00 +03:00

3005 lines
196 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2020, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область ОписаниеПеременных
&НаКлиенте
Перем КонтекстВыбора;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
УстановитьУсловноеОформление();
ОбновлениеИнформационнойБазы.ПроверитьОбъектОбработан(Объект, ЭтотОбъект);
Если Объект.Ссылка.Пустая() Тогда
Рассмотрено = Истина;
ПриСозданииИПриЧтенииНаСервере();
Взаимодействия.УстановитьПредметПоДаннымЗаполнения(Параметры, Предмет);
ИзменилисьКонтакты = Истина;
КонецЕсли;
Взаимодействия.ЗаполнитьСписокВыбораДляРассмотретьПосле(Элементы.РассмотретьПосле.СписокВыбора);
ЗапрещенныеРасширения = РаботаСФайламиСлужебный.СписокЗапрещенныхРасширений();
// Подготовить оповещения взаимодействий.
Взаимодействия.ПодготовитьОповещения(ЭтотОбъект,Параметры);
// СтандартныеПодсистемы.Свойства
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "СтраницаДополнительныеРеквизиты");
ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
МодульУправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
КонецЕсли;
// Конец СтандартныеПодсистемы.Свойства
// СтандартныеПодсистемы.ШаблоныСообщений
ОпределитьВозможностьЗаполненияПисьмаПоШаблону();
// Конец СтандартныеПодсистемы.ШаблоныСообщений
// СтандартныеПодсистемы.ПодключаемыеКоманды
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
МодульПодключаемыеКоманды.ПриСозданииНаСервере(ЭтотОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
ПроверитьСостояниеОтправкиПисемНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// СтандартныеПодсистемы.Свойства
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.Свойства
// СтандартныеПодсистемы.ПодключаемыеКоманды
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.НачатьОбновлениеКоманд(ЭтотОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
УправлениеДоступностью();
ПодключитьОбработчикОжидания("ПроверитьСостояниеОтправкиПисем", 60, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// СтандартныеПодсистемы.Свойства
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
Если МодульУправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
ОбновитьЭлементыДополнительныхРеквизитов();
МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
КонецЕсли;
// Конец СтандартныеПодсистемы.Свойства
ВзаимодействияКлиент.ОтработатьОповещение(ЭтотОбъект, ИмяСобытия, Параметр, Источник);
Если ИмяСобытия = "Запись_ПрисоединенныйФайл" Тогда
Если ТипЗнч(Источник) = Тип("СправочникСсылка.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы") Тогда
ВложенияТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
Если ВложенияТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
РеквизитыФайла = РеквизитыФайла(Источник);
ЗаполнитьЗначенияСвойств(ВложенияТекущиеДанные, РеквизитыФайла);
ВложенияТекущиеДанные.РазмерПредставление =
ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(РеквизитыФайла.Размер);
ВложенияТекущиеДанные.ИмяФайла = ?(ПустаяСтрока(РеквизитыФайла.Расширение),
РеквизитыФайла.Наименование,
РеквизитыФайла.Наименование + "." + РеквизитыФайла.Расширение);
КонецЕсли;
КонецЕсли;
// СтандартныеПодсистемы.ШаблоныСообщений
Если ИмяСобытия = "Запись_ШаблоныСообщений" Тогда
ОпределитьВозможностьЗаполненияПисьмаПоШаблону();
КонецЕсли;
// Конец СтандартныеПодсистемы.ШаблоныСообщений
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Перем СтрокаНачало, СтрокаКонец, КолонкаНачало, КолонкаКонец;
Перем НачалоВыделения, КонецВыделения;
Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Документ.ЭлектронноеПисьмоИсходящее.Форма.ФормированиеВнешнейСсылкиНаОбъект") Тогда
Если ФорматСообщения = ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст") Тогда
Элементы.ТекстПисьма.ПолучитьГраницыВыделения(СтрокаНачало, КолонкаНачало, СтрокаКонец, КолонкаКонец);
ТекстПисьма = РезультатВставкиТекстаВПисьмо(ТекстПисьма, СтрокаНачало, КолонкаНачало, КолонкаКонец, ВыбранноеЗначение);
Иначе
Элементы.ТекстПисьмаФорматированныйДокумент.ПолучитьГраницыВыделения(НачалоВыделения, КонецВыделения);
ТекстПисьмаФорматированныйДокумент.Вставить(НачалоВыделения, ВыбранноеЗначение);
КонецЕсли;
ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ЖурналДокументов.Взаимодействия.Форма.ПараметрыЭлектронногоПисьма") Тогда
Если ВыбранноеЗначение <> Неопределено И Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено") Тогда
Объект.УведомитьОДоставке = ВыбранноеЗначение.УведомитьОДоставке;
Объект.УведомитьОПрочтении = ВыбранноеЗначение.УведомитьОПрочтении;
Объект.ВключатьТелоИсходногоПисьма = ВыбранноеЗначение.ВключатьТелоИсходногоПисьма;
Модифицированность = Истина;
КонецЕсли;
ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.АдреснаяКнига")
ИЛИ ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.УточнениеКонтактов") Тогда
ЗаполнитьПодобранныхПолучателейПослеВыбора(ВыбранноеЗначение);
Иначе
ВзаимодействияКлиент.ФормаОбработкаВыбора(ЭтотОбъект, ВыбранноеЗначение, ИсточникВыбора, КонтекстВыбора);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
ВключитьНебезопасноеСодержимое = Ложь;
Взаимодействия.УстановитьРеквизитыФормыВзаимодействияПоДаннымРегистра(ЭтотОбъект);
ПриСозданииИПриЧтенииНаСервере();
// СтандартныеПодсистемы.Свойства
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
МодульУправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.Свойства
// СтандартныеПодсистемы.УправлениеДоступом
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
МодульУправлениеДоступом.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.УправлениеДоступом
// СтандартныеПодсистемы.ПодключаемыеКоманды
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПодключаемыеКоманды") Тогда
МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецЕсли;
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
ОчиститьСообщения();
Если Не ВыполняетсяОтправка Тогда
Если ПроверитьЗаполнениеСписковАдресатов() Тогда
Отказ = Истина;
КонецЕсли;
Если Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик")
ИЛИ Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено") Тогда
ВзаимодействияКлиент.ПроверкаЗаполненностиРеквизитовОтложеннойОтправки(Объект, Отказ);
КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;
КонецЕсли;
#Если Не ВебКлиент Тогда
Для Каждого СтрокаТаблицыВложений Из Вложения Цикл
Если СтрокаТаблицыВложений.Расположение = 2 Тогда
Попытка
Данные = Новый ДвоичныеДанные(СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере);
СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(Данные, "");
СтрокаТаблицыВложений.Расположение = 4;
Исключение
ОбщегоНазначенияКлиент.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()),,"Вложения",, Отказ);
КонецПопытки;
КонецЕсли;
КонецЦикла;
#КонецЕсли
Объект.ЕстьВложения = (Вложения.Количество() <> 0);
ЗаполнитьТабличныеЧастиПоСпискуПолучателей();
Объект.СписокПолучателейПисьма =
ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиПисьма, Ложь);
Объект.СписокПолучателейКопий =
ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиКопий, Ложь);
Объект.СписокПолучателейСкрытыхКопий =
ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиСкрытыхКопий, Ложь);
Для Каждого Вложение Из Вложения Цикл
Если Вложение.Расположение = 0
И Вложение.Редактируется Тогда
ОписаниеОповещенияПомещенияФайла = Новый ОписаниеОповещения("ПослеПомещенияФайла", ЭтотОбъект);
РаботаСФайламиКлиент.ПоместитьПрисоединенныйФайл(ОписаниеОповещенияПомещенияФайла, Вложение.Ссылка, УникальныйИдентификатор);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если Не ЗавершениеРаботы
И Модифицированность
И Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик") Тогда
ЕстьРедактируемыеФайлы = Ложь;
МассивРедактируемыхФайлов = Новый Массив;
Для Каждого Вложение Из Вложения Цикл
Если Вложение.Редактируется Тогда
ЕстьРедактируемыеФайлы = Истина;
МассивРедактируемыхФайлов.Добавить(Вложение.Ссылка);
КонецЕсли;
КонецЦикла;
Если ЕстьРедактируемыеФайлы Тогда
Отказ = Истина;
СтандартнаяОбработка = Ложь;
ТекстВопроса = НСтр("ru = 'Данные были изменены, Записать?'");
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("МассивРедактируемыхФайлов", МассивРедактируемыхФайлов);
ОповещениеПослеВопросаОЗакрытии = Новый ОписаниеОповещения("ПослеВопросаПриЗакрытии", ЭтотОбъект, ДополнительныеПараметры);
ПоказатьВопрос(ОповещениеПослеВопросаОЗакрытии, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, РежимЗаписи, РежимПроведения)
ДокументHTMLТекущегоПисьмаПодготовлен = Ложь;
// Подготовим документ HTML из содержимого форматированного документа.
Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML
И ТекущийОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда
ТаблицаСоответствийИменВложенийИдентификаторам.Очистить();
СтруктураВложений = Новый Структура;
ТекстПисьмаФорматированныйДокумент.ПолучитьHTML(ТекущийОбъект.ТекстHTML, СтруктураВложений);
Для каждого Вложение Из СтруктураВложений Цикл
НоваяСтрока = ТаблицаСоответствийИменВложенийИдентификаторам.Добавить();
НоваяСтрока.ИмяФайла = Вложение.Ключ;
НоваяСтрока.ИдентификаторФайлаДляHTML = Новый УникальныйИдентификатор;
НоваяСтрока.Картинка = Вложение.Значение;
КонецЦикла;
Если ТаблицаСоответствийИменВложенийИдентификаторам.Количество() > 0 Тогда
ДокументHTML = Взаимодействия.ПолучитьОбъектДокументHTMLИзТекстаHTML(ТекущийОбъект.ТекстHTML);
Взаимодействия.ЗаменитьИменаКартинокНаИдентификаторыПочтовыхВложенийВHTML(
ДокументHTML, ТаблицаСоответствийИменВложенийИдентификаторам.Выгрузить());
ДокументHTMLТекущегоПисьмаПодготовлен = Истина;
КонецЕсли;
Иначе
ТекущийОбъект.Текст = ТекстПисьма;
КонецЕсли;
Если НеобходимаОбработкаПисьмаОснования() Тогда
Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда
ТекущийОбъект.ТекстHTML = СформироватьТекстПисьмаВключаяПисьмоОснование(
?(ДокументHTMLТекущегоПисьмаПодготовлен,ДокументHTML,Неопределено), ТекущийОбъект);
ТекущийОбъект.Текст = Взаимодействия.ПолучитьОбычныйТекстИзHTML(ТекущийОбъект.ТекстHTML);
Иначе
ТекущийОбъект.Текст = СформироватьТекстПисьмаВключаяПисьмоОснование(Неопределено, ТекущийОбъект);
КонецЕсли;
Иначе
Если ДокументHTMLТекущегоПисьмаПодготовлен Тогда
ТекущийОбъект.ТекстHTML = Взаимодействия.ПолучитьТекстHTMLИзОбъектаДокументHTML(ДокументHTML);
ТекущийОбъект.Текст = Взаимодействия.ПолучитьОбычныйТекстИзHTML(ТекущийОбъект.ТекстHTML);
КонецЕсли;
КонецЕсли;
Если Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда
ТекущийОбъект.ПисьмаВложения.Очистить();
ИндексСтроки = 1;
Для Каждого Вложение Из Вложения Цикл
Если Вложение.Расположение = 5 И ЗначениеЗаполнено(Вложение.Письмо) Тогда
НоваяСтрока = ТекущийОбъект.ПисьмаВложения.Добавить();
НоваяСтрока.Письмо = Вложение.Письмо;
НоваяСтрока.ПорядковыйНомерВоВложениях = ИндексСтроки;
КонецЕсли;
ИндексСтроки = ИндексСтроки + 1;
КонецЦикла;
КонецЕсли;
Если ВыполняетсяОтправка И Не ОтправлятьСообщенияСразу Тогда
ТекущийОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее;
КонецЕсли;
Если Объект.СтатусПисьма <> ТекущийСтатусПисьма
И ТекущийОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее
И Не ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML")
И (ТипЗнч(ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее")
ИЛИ ТипЗнч(ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее"))
И ТипТекстаВходящегоПисьма = Перечисления.ТипыТекстовЭлектронныхПисем.HTML Тогда
ТекущийОбъект.ЕстьВложения = Истина;
КонецЕсли;
ТекущийОбъект.Размер = ОценитьРазмерПисьма();
// СтандартныеПодсистемы.Свойства
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
МодульУправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.Свойства
Взаимодействия.ПередЗаписьюВзаимодействияИзФормы(ЭтотОбъект, ТекущийОбъект, ИзменилисьКонтакты);
КонецПроцедуры
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Взаимодействия.ПриЗаписиВзаимодействияИзФормы(ТекущийОбъект, ЭтотОбъект);
Если Объект.СтатусПисьма <> Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Письмо = ТекущийОбъект.Ссылка;
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировкиДанных = Блокировка.Добавить("Справочник.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы");
ЭлементБлокировкиДанных.УстановитьЗначение("ВладелецФайла", Письмо);
РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаблокироватьПредметыПапокВзаимодействий(Блокировка, Письмо);
Блокировка.Заблокировать();
// Добавим в список удаленных вложений ранее сохраненные картинки, отображаемые в теле форматированного документа.
ТаблицаВложенийКартинокФорматированногоДокумента = Взаимодействия.ПолучитьВложенияПисьмаСНеПустымИД(Письмо);
Для каждого Вложение Из ТаблицаВложенийКартинокФорматированногоДокумента Цикл
УдаленныеВложения.Добавить(Вложение.Ссылка);
КонецЦикла;
// Удалим удаленные вложения
Для Каждого УдаленноеВложение Из УдаленныеВложения Цикл
ОбъектВложение = УдаленноеВложение.Значение.ПолучитьОбъект();
ОбъектВложение.Удалить();
КонецЦикла;
УдаленныеВложения.Очистить();
Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда
Для каждого Вложение Из ТаблицаСоответствийИменВложенийИдентификаторам Цикл
ДвоичныеДанныеКартинки = Вложение.Картинка.ПолучитьДвоичныеДанные();
АдресКартинкиВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
ПараметрыВложения = Новый Структура;
ПараметрыВложения.Вставить("ИмяФайла", "_" + СтрЗаменить(Вложение.ИдентификаторФайлаДляHTML, "-", "_"));
ПараметрыВложения.Вставить("Размер", ДвоичныеДанныеКартинки.Размер());
ПараметрыВложения.Вставить("ИДФайлаЭлектронногоПисьма", Вложение.ИдентификаторФайлаДляHTML);
ПрисоединенныйФайл = УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(
Письмо, АдресКартинкиВоВременномХранилище, ПараметрыВложения);
КонецЦикла;
КонецЕсли;
Если НеобходимаОбработкаПисьмаОснования() Тогда
ВложенияПисьмаОснования = Взаимодействия.ПолучитьВложенияПисьмаСНеПустымИД(Объект.ВзаимодействиеОснование);
Для Каждого Вложение Из ВложенияПисьмаОснования Цикл
ДвоичныеДанныеКартинки = РаботаСФайлами.ДвоичныеДанныеФайла(Вложение.Ссылка);
АдресКартинкиВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанныеКартинки, УникальныйИдентификатор);
ПараметрыВложения = Новый Структура;
ПараметрыВложения.Вставить("ИмяФайла", Вложение.Наименование);
ПараметрыВложения.Вставить("Размер", Вложение.Размер);
ПараметрыВложения.Вставить("ИДФайлаЭлектронногоПисьма", Вложение.ИДФайлаЭлектронногоПисьма);
ПрисоединенныйФайл = УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(
Письмо, АдресКартинкиВоВременномХранилище, ПараметрыВложения);
КонецЦикла;
КонецЕсли;
Для Каждого СтрокаТаблицыВложений Из Вложения Цикл
Размер = 0;
ИмяФайла = СтрокаТаблицыВложений.ИмяФайла;
Если СтрокаТаблицыВложений.Расположение = 4 Тогда
// из временного хранилища
ПараметрыВложения = Новый Структура;
ПараметрыВложения.Вставить("ИмяФайла", ИмяФайла);
ПараметрыВложения.Вставить("Размер", Размер);
УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(
Письмо, СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере, ПараметрыВложения);
ИначеЕсли СтрокаТаблицыВложений.Расположение = 3 Тогда
// из файла на сервере
ИначеЕсли СтрокаТаблицыВложений.Расположение = 2 Тогда
// из файла на компьютере
ДвоичныеДанные = Новый ДвоичныеДанные(СтрокаТаблицыВложений.ИмяФайлаНаКомпьютере);
АдресВременногоХранилищаФайла = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
ПараметрыВложения = Новый Структура;
ПараметрыВложения.Вставить("ИмяФайла", ИмяФайла);
ПараметрыВложения.Вставить("Размер", Размер);
УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаИзВременногоХранилища(
Письмо, АдресВременногоХранилищаФайла, ПараметрыВложения);
ИначеЕсли СтрокаТаблицыВложений.Расположение = 1 Тогда
УправлениеЭлектроннойПочтой.ЗаписатьВложениеЭлектронногоПисьмаСкопировавВложениеДругогоПисьма(
Письмо, СтрокаТаблицыВложений.Ссылка, УникальныйИдентификатор);
ИначеЕсли СтрокаТаблицыВложений.Расположение = 0 Тогда
// перезаписать вложение
КонецЕсли;
СтрокаТаблицыВложений.Расположение = 0;
КонецЦикла;
Если Объект.СтатусПисьма <> ТекущийСтатусПисьма Тогда
ПрикрепитьВходящееПисьмоОснованиеКакВложениеЕслиНеобходимо(ТекущийОбъект);
Взаимодействия.УстановитьПапкуЭлектронногоПисьма(Письмо,
Взаимодействия.ОпределитьПапкуДляПисьмаПоУмолчанию(Письмо, Истина));
ТекущийСтатусПисьма = Объект.СтатусПисьма;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
// СтандартныеПодсистемы.УправлениеДоступом
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда
МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом");
МодульУправлениеДоступом.ПослеЗаписиНаСервере(ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи);
КонецЕсли;
// Конец СтандартныеПодсистемы.УправлениеДоступом
ЗаполнитьВложения();
Взаимодействия.УстановитьЗаголовокФормыЭлектронногоПисьма(ЭтотОбъект);
УстановитьЗаголовокКнопкиПоУмолчанию();
Элементы.СтраницаКомментарий.Картинка = ОбщегоНазначенияКлиентСервер.КартинкаКомментария(Объект.Комментарий);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
ВзаимодействияКлиент.ВзаимодействиеПредметПослеЗаписи(ЭтотОбъект, Объект,
ПараметрыЗаписи, "ЭлектронноеПисьмоИсходящее");
КонецПроцедуры
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
// СтандартныеПодсистемы.Свойства
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
МодульУправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты);
КонецЕсли;
// Конец СтандартныеПодсистемы.Свойства
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура СтраницыОписаниеДополнительноПриСменеСтраницы(Элемент, ТекущаяСтраница)
// СтандартныеПодсистемы.Свойства
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства")
И ТекущаяСтраница.Имя = "СтраницаДополнительныеРеквизиты"
И Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда
СвойстваВыполнитьОтложеннуюИнициализацию();
МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
МодульУправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.Свойства
КонецПроцедуры
&НаКлиенте
Процедура РассмотретьПослеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
ВзаимодействияКлиент.ОбработатьВыборВПолеРассмотретьПосле(
РассмотретьПосле, ВыбранноеЗначение, СтандартнаяОбработка, Модифицированность);
КонецПроцедуры
&НаКлиенте
Процедура ПредставлениеОтправителяОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если Объект.УчетнаяЗапись <> ВыбранноеЗначение Тогда
ИзменитьПодпись(Объект.УчетнаяЗапись, ВыбранноеЗначение);
Объект.УчетнаяЗапись = ВыбранноеЗначение;
ЭлементСписка = Элемент.СписокВыбора.НайтиПоЗначению(ВыбранноеЗначение);
Если ЭлементСписка <> Неопределено Тогда
СтандартнаяОбработка = Ложь;
Объект.ОтправительПредставление = ЭлементСписка.Представление;
КонецЕсли;
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТекстПисьмаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
ВзаимодействияКлиент.ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура ТекстВходящегоПисьмаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
ВзаимодействияКлиент.ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура ПредметНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ВзаимодействияКлиент.ПредметНачалоВыбора(ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка);
КонецПроцедуры
&НаКлиенте
Процедура ПредупреждениеОНебезопасномСодержимомОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
Если НавигационнаяСсылкаФорматированнойСтроки = "ВключитьНебезопасноеСодержимое" Тогда
СтандартнаяОбработка = Ложь;
ВключитьНебезопасноеСодержимое = Истина;
ПрочитатьТекстВходящегоПисьмаHTML();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПредупреждениеОНеотправленныхПисьмахНадписьОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
ВзаимодействияКлиент.ОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыВложения
&НаКлиенте
Процедура ВложенияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ОткрытьВложениеВыполнить();
КонецПроцедуры
&НаКлиенте
Процедура ВложенияПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь;
Если Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик") Тогда
ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВложенияПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь;
МассивФайлов = Новый Массив;
Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") Тогда
МассивФайлов.Добавить(ПараметрыПеретаскивания.Значение);
ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда
Если ПараметрыПеретаскивания.Значение.Количество() >= 1
И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда
Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл
Если ТипЗнч(ФайлПринятый) = Тип("Файл") Тогда
МассивФайлов.Добавить(ФайлПринятый);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Для Каждого ВыбранныйФайл Из МассивФайлов Цикл
ДополнительныеПараметры = Новый Структура("ВыбранныйФайл", ВыбранныйФайл);
ОписаниеОповещение = Новый ОписаниеОповещения("ПроверкаЭтоФайлПослеЗавершения", ЭтотОбъект, ДополнительныеПараметры);
ВыбранныйФайл.НачатьПроверкуЭтоФайл(ОписаниеОповещение);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокПолучателей
&НаКлиенте
Процедура СписокПолучателейПредставлениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ОчиститьСообщения();
Если Элементы.СписокПолучателей.ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено") Тогда
ВариантОтправки = Элементы.СписокПолучателей.ТекущиеДанные.ВариантОтправки;
Если ВариантОтправки = "Кому:" Тогда
ГруппаПодбора = НСтр("ru = 'Кому'");
ИначеЕсли ВариантОтправки = "Копия:" Тогда
ГруппаПодбора = НСтр("ru = 'Копии'");
ИначеЕсли ВариантОтправки = "СкрытаяКопия:" Тогда
ГруппаПодбора = НСтр("ru = 'Скрытые'");
КонецЕсли;
РедактироватьСписокПолучателей(Истина, ГруппаПодбора);
Иначе
РедактироватьСписокПолучателей(Ложь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СписокПолучателейПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ)
Если ОтменаРедактирования Тогда
Возврат;
КонецЕсли;
ДанныеСтроки = Элемент.ТекущиеДанные;
Если ДанныеСтроки = Неопределено Тогда
Возврат;
КонецЕсли;
Адрес = "";
ПозицияНачало = СтрНайти(ДанныеСтроки.Представление, "<");
Если ПозицияНачало > 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 = 'Адрес %1 уже есть в списке.'");
Для каждого СтрокаАдреса Из СписокПолучателей Цикл
Результат = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(СтрокаАдреса.Представление);
Для Каждого СтруктураАдреса Из Результат Цикл
Если Не ПустаяСтрока(СтруктураАдреса.ОписаниеОшибки) Тогда
Отказ = Истина;
ОбщегоНазначенияКлиент.СообщитьПользователю(СтруктураАдреса.ОписаниеОшибки,,
"СписокПолучателей[" + Формат(СписокПолучателей.Индекс(СтрокаАдреса), "ЧГ=0") + "].Представление");
КонецЕсли;
Если АдресаПоПредставлению.Получить(СтруктураАдреса.Адрес) <> Неопределено Тогда
Отказ = Истина;
ОбщегоНазначенияКлиент.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки,
СтруктураАдреса.Адрес),, "СписокПолучателей[" + Формат(СписокПолучателей.Индекс(СтрокаАдреса), "ЧГ=0") + "].Представление");
Иначе
АдресаПоПредставлению.Вставить(СтруктураАдреса.Адрес, СтрокаАдреса.ПолучитьИдентификатор());
КонецЕсли;
КонецЦикла;
Если НЕ Отказ Тогда
Результат = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(СтрокаАдреса.Адрес);
Для Каждого СтруктураАдреса Из Результат Цикл
Если Не ПустаяСтрока(СтруктураАдреса.ОписаниеОшибки) Тогда
Отказ = Истина;
ОбщегоНазначенияКлиент.СообщитьПользователю(СтруктураАдреса.ОписаниеОшибки,,
"СписокПолучателей[" + Формат(СписокПолучателей.Индекс(СтрокаАдреса), "ЧГ=0") + "].Представление");
КонецЕсли;
Если АдресаПоЗначению.Получить(СтруктураАдреса.Адрес) <> Неопределено Тогда
Отказ = Истина;
ОбщегоНазначенияКлиент.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки,
СтруктураАдреса.Адрес),, "СписокПолучателей[" + Формат(СписокПолучателей.Индекс(СтрокаАдреса), "ЧГ=0") + "].Представление");
Иначе
АдресаПоЗначению.Вставить(СтруктураАдреса.Адрес, СтрокаАдреса.ПолучитьИдентификатор());
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Если НЕ Отказ Тогда
Для каждого АдресПоЗначению Из АдресаПоЗначению Цикл
Если АдресаПоПредставлению[АдресПоЗначению.Ключ] <> Неопределено
И АдресаПоПредставлению[АдресПоЗначению.Ключ] <> АдресПоЗначению.Значение Тогда
Отказ = Истина;
Индекс = СписокПолучателей.Индекс(СписокПолучателей.НайтиПоИдентификатору(АдресПоЗначению.Значение));
ОбщегоНазначенияКлиент.СообщитьПользователю(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаОшибки,
АдресПоЗначению.Ключ),, "СписокПолучателей[" + Формат(Индекс, "ЧГ=0") + "].Представление");
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Отказ;
КонецФункции
&НаСервере
Функция НеобходимаОбработкаПисьмаОснования()
Возврат ВыполняетсяОтправка И Объект.ВключатьТелоИсходногоПисьма И ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML")
И (Не Объект.ВзаимодействиеОснование = Неопределено) И (Не Объект.ВзаимодействиеОснование.Пустая())
И Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик;
КонецФункции
/////////////////////////////////////////////////////////////////////////////////
// Управление доступностью элементов формы.
&НаКлиенте
Процедура УправлениеДоступностью()
Элементы.РассмотретьПосле.Доступность = НаКонтроле;
Если Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Исходящее")
И (НЕ ИнформационнаяБазаФайловая
ИЛИ (Объект.ДатаКогдаОтправить <> Дата(1,1,1) И Объект.ДатаКогдаОтправить > ОбщегоНазначенияКлиент.ДатаСеанса())
ИЛИ (Объект.ДатаАктуальностиОтправки <> Дата(1,1,1) И Объект.ДатаАктуальностиОтправки < ОбщегоНазначенияКлиент.ДатаСеанса())) Тогда
Элементы.Отправить.Видимость = Ложь;
Иначе
Элементы.Отправить.Видимость = Истина;
КонецЕсли;
Элементы.ФормаЗаписатьИЗакрыть.Видимость = Не Элементы.Отправить.Видимость;
Элементы.ГруппаДатаОтправкиАктуальность.Доступность = (Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено"));
КонецПроцедуры
&НаСервере
Процедура ОпределитьВидимостьДоступностьЭлементовВЗависимостиОтСтатусаПисьма()
Если Объект.СтатусПисьма <> Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено Тогда
УправлениеЭлектроннойПочтой.ПолучитьДоступныеУчетныеЗаписиДляОтправки(
Элементы.ОтправительПредставление.СписокВыбора,ДоступныеДляОтправкиУчетныеЗаписи);
Если Объект.УчетнаяЗапись.Пустая()
И ДоступныеДляОтправкиУчетныеЗаписи.Количество() > 0
И Объект.Ссылка.Пустая() Тогда
Объект.УчетнаяЗапись = ДоступныеДляОтправкиУчетныеЗаписи[0].УчетнаяЗапись;
КонецЕсли;
ЭлементСписка = Элементы.ОтправительПредставление.СписокВыбора.НайтиПоЗначению(Объект.УчетнаяЗапись);
Если ЭлементСписка <> Неопределено Тогда
Объект.ОтправительПредставление = ЭлементСписка.Представление;
КонецЕсли;
Иначе
Элементы.ОтправительПредставление.ТолькоПросмотр = Истина;
Элементы.СписокПолучателейВариантОтправки.ТолькоПросмотр = Истина;
Элементы.СписокПолучателейПредставление.РедактированиеТекста = Ложь;
Элементы.СписокПолучателей.ТолькоПросмотр = Истина;
КонецЕсли;
Если Объект.СтатусПисьма <> Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда
Если Вложения.Количество() > 0 Тогда
Элементы.ДобавитьВложение.Доступность = Ложь;
Элементы.УдалитьВложение.Доступность = Ложь;
Элементы.ДобавитьПисьмо.Доступность = Ложь;
Иначе
Элементы.Вложения.Видимость = Ложь;
КонецЕсли;
Если Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML Тогда
ТекстПисьма = Объект.ТекстHTML;
ТекстПисьма = Взаимодействия.ОбработатьТекстHTML(Объект.Ссылка);
Элементы.ТекстПисьма.Вид = ВидПоляФормы.ПолеHTMLДокумента;
Элементы.ТекстПисьма.ТолькоПросмотр = Ложь;
Иначе
ТекстПисьма = Объект.Текст;
Элементы.ТекстПисьма.Вид = ВидПоляФормы.ПолеТекстовогоДокумента;
Элементы.ТекстПисьма.ТолькоПросмотр = Истина;
КонецЕсли;
Если Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее
И (НЕ ИнформационнаяБазаФайловая
ИЛИ (Объект.ДатаКогдаОтправить <> Дата(1,1,1) И Объект.ДатаКогдаОтправить > ТекущаяДатаСеанса())
ИЛИ (Объект.ДатаАктуальностиОтправки <> Дата(1,1,1) И Объект.ДатаАктуальностиОтправки < ТекущаяДатаСеанса())) Тогда
Элементы.Отправить.Доступность = Ложь;
КонецЕсли;
Иначе
ОпределитьСпособРедактированияПисьма();
КонецЕсли;
КонецПроцедуры
#Область РаботаСВложениями
&НаСервере
Процедура ДобавитьВложениеПисьмо(Письмо)
Если Вложения.НайтиСтроки(Новый Структура("Письмо", Письмо)).Количество() > 0 Тогда
Возврат;
КонецЕсли;
СтрокаРеквизиты = "Размер, Тема";
Если ТипЗнч(Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда
СтрокаРеквизиты = СтрокаРеквизиты + ", ДатаПолучения";
ИначеЕсли ТипЗнч(Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее") Тогда
СтрокаРеквизиты = СтрокаРеквизиты + ", Дата, ДатаОтправления";
Иначе
Возврат;
КонецЕсли;
РеквизитыПисьма = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Письмо, СтрокаРеквизиты);
Если ТипЗнч(Письмо) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда
ДатаПисьма = РеквизитыПисьма.ДатаПолучения;
Иначе
ДатаПисьма = ?(ЗначениеЗаполнено(РеквизитыПисьма.ДатаОтправления), РеквизитыПисьма.ДатаОтправления, РеквизитыПисьма.Дата);
КонецЕсли;
ПредставлениеПисьма = Взаимодействия.ПредставлениеПисьма(РеквизитыПисьма.Тема, ДатаПисьма);
НоваяСтрока = Вложения.Добавить();
НоваяСтрока.Письмо = Письмо;
НоваяСтрока.ИмяФайла = ПредставлениеПисьма;
НоваяСтрока.ИндексКартинки = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла("eml");
НоваяСтрока.ИмяФайлаНаКомпьютере = "";
НоваяСтрока.ПодписанЭП = Ложь;
НоваяСтрока.Размер = РеквизитыПисьма.Размер;
НоваяСтрока.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(НоваяСтрока.Размер);
НоваяСтрока.Расположение = 5;
КонецПроцедуры
&НаСервере
Процедура ДобавитьПисьмаВложения()
ТаблицаПисемВложений = Взаимодействия.ДанныеХранимыхВБазеПисемВложений(Объект.Ссылка);
Для Каждого ПисьмоВложение Из ТаблицаПисемВложений Цикл
ПредставлениеПисьма = Взаимодействия.ПредставлениеПисьма(ПисьмоВложение.Тема, ПисьмоВложение.Дата);
НоваяСтрока = Вложения.Добавить();
НоваяСтрока.Письмо = ПисьмоВложение.Письмо;
НоваяСтрока.ИмяФайла = ПредставлениеПисьма;
НоваяСтрока.ИндексКартинки = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла("eml");
НоваяСтрока.ИмяФайлаНаКомпьютере = "";
НоваяСтрока.ПодписанЭП = Ложь;
НоваяСтрока.Размер = ПисьмоВложение.Размер;
НоваяСтрока.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(НоваяСтрока.Размер);
НоваяСтрока.Расположение = 5;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьПисьмо(Команда)
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("РежимВыбора", Истина);
ПараметрыОткрытия.Вставить("ЗакрыватьПриВыборе", Истина);
ПараметрыОткрытия.Вставить("ТолькоПочта", Истина);
ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеДобавленияПисьма", ЭтотОбъект);
ОткрытьФорму("ЖурналДокументов.Взаимодействия.ФормаСписка",
ПараметрыОткрытия,
ЭтотОбъект,,,,
ОписаниеОповещения,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершениеДобавленияПисьма(Результат, Параметры) Экспорт
Если ВзаимодействияКлиент.ЯвляетсяЭлектроннымПисьмом(Результат) Тогда
ДобавитьВложениеПисьмо(Результат);
Модифицированность = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВложенияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
Отказ = Истина;
ДобавитьВложениеВыполнить();
КонецПроцедуры
&НаКлиенте
Процедура ВложенияПередУдалением(Элемент, Отказ)
Если Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик") Тогда
УдалитьВложениеВыполнить();
КонецЕсли;
Отказ = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ВложенияПриАктивизацииЯчейки(Элемент)
ТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Элементы.ВложенияКонтекстноеМенюСвойстваВложения.Доступность = (ТекущиеДанные.Расположение <> 5);
Элементы.СвойстваВложения.Доступность = (ТекущиеДанные.Расположение <> 5);
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВложениеВыполнить()
ОписаниеОповещение = Новый ОписаниеОповещения("ДиалогВыбораФайловПослеВыбора", ЭтотОбъект);
ФайловаяСистемаКлиент.ЗагрузитьФайлы(ОписаниеОповещение);
КонецПроцедуры
&НаКлиенте
Процедура УдалитьВложениеВыполнить()
ДобавитьВложениеВСписокУдаленных();
ТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
Индекс = Вложения.Индекс(ТекущиеДанные);
Вложения.Удалить(Индекс);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВложениеВСписокУдаленных()
ТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
Если (ТекущиеДанные <> Неопределено) И (ТекущиеДанные.Расположение = 0) Тогда
УдаленныеВложения.Добавить(ТекущиеДанные.Ссылка);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьВложениеВыполнить()
ТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
Если (ТекущиеДанные.Расположение = 0) ИЛИ (ТекущиеДанные.Расположение = 1) Тогда
Если ВзаимодействияКлиентСервер.ЭтоФайлПисьмо(ТекущиеДанные.ИмяФайла) Тогда
ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ТекущиеДанные.Ссылка, ПараметрыПисьмаВложения(), ЭтотОбъект);
Иначе
ДляРедактирования = Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик");
УправлениеЭлектроннойПочтойКлиент.ОткрытьВложение(ТекущиеДанные.Ссылка,
ЭтотОбъект,
ДляРедактирования);
Если ДляРедактирования Тогда
ТекущиеДанные.Редактируется = Истина;
Модифицированность = Истина;
КонецЕсли;
КонецЕсли;
ИначеЕсли ТекущиеДанные.Расположение = 2 Тогда
ПутьКФайлу = ТекущиеДанные.ИмяФайлаНаКомпьютере;
Если ВзаимодействияКлиентСервер.ЭтоФайлПисьмо(ТекущиеДанные.ИмяФайла) Тогда
Попытка
Данные = Новый ДвоичныеДанные(ТекущиеДанные.ИмяФайлаНаКомпьютере);
ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор),
ПараметрыПисьмаВложения(),
ЭтотОбъект);
Исключение
ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу);
КонецПопытки;
Иначе
ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу);
КонецЕсли;
ИначеЕсли ТекущиеДанные.Расположение = 4 Тогда
ФайловаяСистемаКлиент.ОткрытьФайл(ТекущиеДанные.ИмяФайлаНаКомпьютере,, ТекущиеДанные.ИмяФайла);
ИначеЕсли ТекущиеДанные.Расположение = 5 Тогда
ПараметрыВложения = ВзаимодействияКлиент.ПустаяСтруктураПараметровПисьмаВложения();
ПараметрыВложения.ДатаПисьмаОснования = ?(ЗначениеЗаполнено(Объект.ДатаОтправления), Объект.ДатаОтправления , Объект.Дата);
ПараметрыВложения.ПисьмоОснование = Объект.Ссылка;
ПараметрыВложения.ТемаПисьмаОснования = Объект.Тема;
ВзаимодействияКлиент.ОткрытьВложениеПисьмо(ТекущиеДанные.Письмо,
ПараметрыПисьмаВложения(),
ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьВложения(ПереданныеПараметры = Неопределено)
Если Объект.Ссылка.Пустая() И ПереданныеПараметры <> Неопределено Тогда
Если ПереданныеПараметры.Свойство("Основание")
И ТипЗнч(ПереданныеПараметры.Основание) = Тип("Структура")
И ПереданныеПараметры.Основание.Свойство("Команда") Тогда
Если ПереданныеПараметры.Основание.Команда = "Переслать" Тогда
ТабВложения = УправлениеЭлектроннойПочтой.ПолучитьВложенияЭлектронногоПисьма(ПереданныеПараметры.Основание.Основание, Истина);
Для Каждого СтрокаТаблицыВложений Из ТабВложения Цикл
Если ПустаяСтрока(СтрокаТаблицыВложений.ИДФайлаЭлектронногоПисьма) Тогда
НоваяСтрока = Вложения.Добавить();
НоваяСтрока.Ссылка = СтрокаТаблицыВложений.Ссылка;
НоваяСтрока.ИмяФайла = СтрокаТаблицыВложений.ИмяФайла;
НоваяСтрока.ИндексКартинки = СтрокаТаблицыВложений.ИндексКартинки;
НоваяСтрока.Размер = СтрокаТаблицыВложений.Размер;
НоваяСтрока.РазмерПредставление = СтрокаТаблицыВложений.РазмерПредставление;
НоваяСтрока.Расположение = 1;
КонецЕсли;
КонецЦикла;
ДанныеХранимыхВБазеПисемВложений = Взаимодействия.ДанныеХранимыхВБазеПисемВложений(ПереданныеПараметры.Основание.Основание);
Для Каждого СтрокаТаблицы Из ДанныеХранимыхВБазеПисемВложений Цикл
ДобавитьВложениеПисьмо(СтрокаТаблицы.Письмо);
КонецЦикла;
ИначеЕсли ПереданныеПараметры.Основание.Команда = "ПереслатьКакВложение"
И Параметры.Основание.Свойство("Основание") Тогда
ДобавитьВложениеПисьмо(Параметры.Основание.Основание);
КонецЕсли;
КонецЕсли;
Иначе
Вложения.Очистить();
ТабВложения = УправлениеЭлектроннойПочтой.ПолучитьВложенияЭлектронногоПисьма(Объект.Ссылка, Истина);
Для Каждого СтрокаТаблицыВложений Из ТабВложения Цикл
Если ПустаяСтрока(СтрокаТаблицыВложений.ИДФайлаЭлектронногоПисьма) Тогда
НоваяСтрока = Вложения.Добавить();
НоваяСтрока.Ссылка = СтрокаТаблицыВложений.Ссылка;
НоваяСтрока.ИмяФайла = СтрокаТаблицыВложений.ИмяФайла;
НоваяСтрока.ИндексКартинки = СтрокаТаблицыВложений.ИндексКартинки;
НоваяСтрока.Размер = СтрокаТаблицыВложений.Размер;
НоваяСтрока.РазмерПредставление = СтрокаТаблицыВложений.РазмерПредставление;
НоваяСтрока.ПодписанЭП = СтрокаТаблицыВложений.ПодписанЭП;
НоваяСтрока.Расположение = 0;
КонецЕсли;
КонецЦикла;
ДобавитьПисьмаВложения();
КонецЕсли;
Вложения.Сортировать("ИмяФайла");
КонецПроцедуры
&НаСервере
Процедура ПрикрепитьВходящееПисьмоОснованиеКакВложениеЕслиНеобходимо(ТекущийОбъект)
Если ТекущийОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Исходящее
И Не ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML")
И (ТипЗнч(ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее")
ИЛИ ТипЗнч(ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее"))
И ТипТекстаВходящегоПисьма = Перечисления.ТипыТекстовЭлектронныхПисем.HTML Тогда
Если ТипЗнч(ВзаимодействиеОснование) = Тип("ДокументСсылка.ЭлектронноеПисьмоВходящее") Тогда
ТекстHTMLВходящее = Взаимодействия.СформироватьТекстHTMLДляВходящегоПисьма(ВзаимодействиеОснование, Истина, Истина, Ложь);
Иначе
ТекстHTMLВходящее = Взаимодействия.СформироватьТекстHTMLДляИсходящегоПисьма(ВзаимодействиеОснование, Истина, Истина, Ложь);
КонецЕсли;
ИмяФайла = ПолучитьИмяВременногоФайла("html");
ФайлИсходноеСообщение = Новый ЗаписьТекста(ИмяФайла,КодировкаТекста.UTF16);
ФайлИсходноеСообщение.Записать(ТекстHTMLВходящее);
ФайлИсходноеСообщение.Закрыть();
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
АдресФайлаВХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
ФайлНаДиске = Новый Файл(ИмяФайла);
Если ФайлНаДиске.Существует() Тогда
УдалитьФайлы(ИмяФайла);
КонецЕсли;
ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
ПараметрыФайла.ВладелецФайлов = ТекущийОбъект.Ссылка;
ПараметрыФайла.ИмяБезРасширения = НСтр("ru = 'Пересылаемое сообщение'");
ПараметрыФайла.РасширениеБезТочки = "html";
ПараметрыФайла.ВремяИзмененияУниверсальное = Неопределено;
РаботаСФайлами.ДобавитьФайл(ПараметрыФайла, АдресФайлаВХранилище);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СвойстваВложения(Команда)
ТекущиеДанные = Элементы.Вложения.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущийИндексВКоллекции = Вложения.Индекс(ТекущиеДанные);
Если ТекущиеДанные.Ссылка = Неопределено Тогда
ДополнительныеПараметры = Новый Структура("ТекущийИндексВКоллекции", ТекущийИндексВКоллекции);
ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВопросОЗаписиФайлаПослеЗакрытия", ЭтотОбъект, ДополнительныеПараметры);
ТекстВопроса = НСтр("ru = 'Свойства файла доступны только после его записи. Записать?'");
ПоказатьВопрос(ОбработчикОповещенияОЗакрытии, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
Иначе
ОткрытьСвойстваВложения(ТекущийИндексВКоллекции);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВопросОЗаписиФайлаПослеЗакрытия(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
Записать();
Иначе
Возврат;
КонецЕсли;
ОткрытьСвойстваВложения(ДополнительныеПараметры.ТекущийИндексВКоллекции);
КонецПроцедуры
// Возникает при окончании получения размера файла
//
// Параметры:
// Размер - Число - размер файла.
// ДополнительныеПараметры - Структура:
// * СтрокаТаблицыВложений - СтрокаТаблицыЗначений - содержит:
// ** Размер - Число - размер файла.
//
&НаКлиенте
Процедура ПолучениеРазмераЗавершение(Размер, ДополнительныеПараметры) Экспорт
СтрокаТаблицыВложений = ДополнительныеПараметры.СтрокаТаблицыВложений;
СтрокаТаблицыВложений.Размер = Размер;
СтрокаТаблицыВложений.РазмерПредставление = ВзаимодействияКлиентСервер.ПолучитьСтроковоеПредставлениеРазмераФайла(Размер);
КонецПроцедуры
&НаКлиенте
Процедура ДиалогВыбораФайловПослеВыбора(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;
Для Каждого ВыбранныйФайл Из ВыбранныеФайлы Цикл
НоваяСтрока = Вложения.Добавить();
НоваяСтрока.Расположение = 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(ДокументHTML);
КонецФункции
&НаСервере
Функция СформироватьИсходящееОбычныйТекст(ВыборкаДанныеВходящегоПисьма, ТекущийОбъект)
// Формирование шапки входящего письма.
СтрокаШапка = НСтр("ru = '-----Пересылаемое сообщение-----'");
СтрокаШапка = СтрокаШапка + Символы.ПС+ НСтр("ru = 'От'") + ": "+ ВыборкаДанныеВходящегоПисьма.ОтправительПредставление
+ ?(ВыборкаДанныеВходящегоПисьма.ИмяОбъектаМетаданных = "ЭлектронноеПисьмоВходящее",
"[" + ВыборкаДанныеВходящегоПисьма.ОтправительАдрес +"]",
"");
СтрокаШапка = СтрокаШапка + Символы.ПС+ НСтр("ru = 'Отправлено'") + ": "
+ Формат(ВыборкаДанныеВходящегоПисьма.Дата,"ДЛФ=DT");
СтрокаШапка = СтрокаШапка + Символы.ПС+ НСтр("ru = 'Кому'") + ": "
+ Взаимодействия.ПолучитьПредставленияПолучателейВходящегоПисьма(ВыборкаДанныеВходящегоПисьма.ПолучателиПисьма.Выгрузить());
ТаблицаПолучателейКопий = ВыборкаДанныеВходящегоПисьма.ПолучателиКопий.Выгрузить();
Если ТаблицаПолучателейКопий.Количество() > 0 Тогда
СтрокаШапка = СтрокаШапка + Символы.ПС+ НСтр("ru = 'Копии'") + ": "
+ Взаимодействия.ПолучитьПредставленияПолучателейВходящегоПисьма(ТаблицаПолучателейКопий);
КонецЕсли;
СтрокаШапка = СтрокаШапка + Символы.ПС+ НСтр("ru = 'Тема'") + ": " + ВыборкаДанныеВходящегоПисьма.Тема;
// Преобразование к обычному тексту текста HTML если это необходимо.
Если ВыборкаДанныеВходящегоПисьма.ТипТекста <> Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст Тогда
ТекстВходящегоПисьма = Взаимодействия.ПолучитьОбычныйТекстИзHTML(ВыборкаДанныеВходящегоПисьма.ТекстHTML);
Иначе
ТекстВходящегоПисьма = ВыборкаДанныеВходящегоПисьма.Текст
КонецЕсли;
Возврат ТекущийОбъект.Текст + Символы.ПС + Символы.ПС + СтрокаШапка + Символы.ПС + Символы.ПС + ТекстВходящегоПисьма;
КонецФункции
#Область Прочее
// Определяет способ редактирования письма и
// отображает текст письма согласно способу редактирования.
//
&НаСервере
Процедура ОпределитьСпособРедактированияПисьма()
Если Объект.ТипТекста.Пустая() Тогда
ФорматСообщения = Взаимодействия.ФорматСообщенияПоУмолчанию(Пользователи.ТекущийПользователь());
// Если тип текста не был заполнен, то может оказаться, что формат выбран некорректно, поэтому:
// 1) Если текст заполнен, но не заполнен HTML - то формат сообщения исправляем на "текст".
// 2) Если HTML заполнен, но не заполнен текст - то формат сообщения исправляем на "HTML".
Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст
И СокрЛП(Объект.Текст) = "" И СокрЛП(Объект.ТекстHTML) <> "" Тогда
ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML;
ИначеЕсли ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML
И СокрЛП(Объект.Текст) <> "" И СокрЛП(Объект.ТекстHTML) = "" Тогда
ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст;
КонецЕсли;
Иначе
Если Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст Тогда
ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст;
Иначе
ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML;
КонецЕсли;
КонецЕсли;
Если Объект.Ссылка.Пустая() Тогда
Если Не ПолучитьФункциональнуюОпцию("ОтправлятьПисьмаВФорматеHTML")
И ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда
ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст;
КонецЕсли;
ПараметрыРаботыПользователяПользователя =
Взаимодействия.ПолучитьПараметрыРаботыПользователяДляИсходящегоЭлектронногоПисьма(
Объект.УчетнаяЗапись,
ФорматСообщения,
?(Объект.ВзаимодействиеОснование = Неопределено, Истина, Ложь));
Объект.УведомитьОДоставке = ПараметрыРаботыПользователяПользователя.УведомитьОДоставке;
Объект.УведомитьОПрочтении = ПараметрыРаботыПользователяПользователя.УведомитьОПрочтении;
Объект.ВключатьТелоИсходногоПисьма = ПараметрыРаботыПользователяПользователя.ВключатьТелоИсходногоПисьма;
Объект.ОтображатьТелоИсходногоПисьма = ПараметрыРаботыПользователяПользователя.ОтображатьТелоИсходногоПисьма;
КонецЕсли;
Если ФорматСообщения = Перечисления.СпособыРедактированияЭлектронныхПисем.HTML Тогда
Элементы.СтраницыТекстПисьма.ТекущаяСтраница = Элементы.СтраницаФорматированныйДокумент;
Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML;
Если Не Объект.Ссылка.Пустая() Или ЗначениеЗаполнено(Объект.ТекстHTML) Тогда
Если ЭтоАдресВременногоХранилища(Объект.ТекстHTML) Тогда
ТелоПисьмаHTML = ПолучитьИзВременногоХранилища(Объект.ТекстHTML);
Объект.ТекстHTML = ТелоПисьмаHTML.ТекстHTML;
ТекстПисьмаФорматированныйДокумент.УстановитьHTML(ТелоПисьмаHTML.ТекстHTML, ТелоПисьмаHTML.СтруктураВложений);
Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками;
Объект.Текст = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст();
Иначе
СтруктураВложений = Новый Структура;
Объект.ТекстHTML = Взаимодействия.ОбработатьТекстHTMLДляФорматированногоДокумента(
Объект.Ссылка, Объект.ТекстHTML, СтруктураВложений);
ТекстПисьмаФорматированныйДокумент.УстановитьHTML(Объект.ТекстHTML, СтруктураВложений);
КонецЕсли;
КонецЕсли;
Если Объект.Ссылка.Пустая() И ПараметрыРаботыПользователяПользователя.Подпись <> Неопределено Тогда
ДобавитьФорматированныйДокументКФорматированномуДокументу(ТекстПисьмаФорматированныйДокумент, ПараметрыРаботыПользователяПользователя.Подпись);
КонецЕсли;
Иначе
Элементы.СтраницыТекстПисьма.ТекущаяСтраница = Элементы.СтраницаОбычныйТекст;
Элементы.ТекстПисьма.Вид = ВидПоляФормы.ПолеТекстовогоДокумента;
Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст;
ТекстПисьма = Объект.Текст;
Если Объект.Ссылка.Пустая() И ПараметрыРаботыПользователяПользователя.Подпись <> Неопределено Тогда
ТекстПисьма = ТекстПисьма + ПараметрыРаботыПользователяПользователя.Подпись;
КонецЕсли;
Объект.Кодировка = "UTF-8";
КонецЕсли;
Элементы.ФорматСообщения.Видимость = Истина;
Элементы.ФорматСообщения.Заголовок = ФорматСообщения;
КонецПроцедуры
// Обрабатывает переданные параметры при создании письма.
&НаСервере
Процедура ОбработатьПереданныеПараметры(ПереданныеПараметры)
Если НЕ Объект.Ссылка.Пустая() Тогда
Возврат;
КонецЕсли;
УстановитьТекстПисьмаПоПереданнымПараметрам(ПереданныеПараметры);
Если ПереданныеПараметры.Свойство("Вложения") И ПереданныеПараметры.Вложения <> Неопределено Тогда
Вложения.Очистить();
Если ТипЗнч(ПереданныеПараметры.Вложения) = Тип("СписокЗначений") Или ТипЗнч(ПереданныеПараметры.Вложения) = Тип("Массив") Тогда
Для Каждого Вложение Из ПереданныеПараметры.Вложения Цикл
ОписаниеВложения = Вложения.Добавить();
Если ТипЗнч(ПереданныеПараметры.Вложения) = Тип("СписокЗначений") Тогда
Если ЭтоАдресВременногоХранилища(Вложение.Значение) Тогда
ОписаниеВложения.Расположение = 4;
ОписаниеВложения.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(ПолучитьИзВременногоХранилища(Вложение.Значение), УникальныйИдентификатор);
ИначеЕсли ТипЗнч(Вложение.Значение) = Тип("ДвоичныеДанные") Тогда
ОписаниеВложения.Расположение = 4;
ОписаниеВложения.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(Вложение.Значение, УникальныйИдентификатор);
Иначе
ОписаниеВложения.Расположение = 2;
ОписаниеВложения.ИмяФайлаНаКомпьютере = Вложение.Значение;
КонецЕсли;
ОписаниеВложения.ИмяФайла = Вложение.Представление;
Иначе // ТипЗнч(ПереданныеПараметры.Вложения) = "массив структур"
Если Не ПустаяСтрока(Вложение.АдресВоВременномХранилище) Тогда
ОписаниеВложения.Расположение = 4;
ОписаниеВложения.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(
ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище), УникальныйИдентификатор);
Иначе
ОписаниеВложения.Расположение = 2;
ОписаниеВложения.ИмяФайлаНаКомпьютере = Вложение.ПутьКФайлу;
КонецЕсли;
КонецЕсли;
ОписаниеВложения.ИмяФайла = Вложение.Представление;
Расширение = ОбщегоНазначенияКлиентСервер.ПолучитьРасширениеИмениФайла(ОписаниеВложения.ИмяФайла);
ОписаниеВложения.ИндексКартинки = РаботаСФайламиСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(Расширение);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если ПереданныеПараметры.Свойство("Тема") И НЕ ПустаяСтрока(ПереданныеПараметры.Тема) Тогда
Объект.Тема = ПереданныеПараметры.Тема;
КонецЕсли;
Если ПереданныеПараметры.Свойство("Получатель") И ПереданныеПараметры.Получатель <> Неопределено Тогда
// Если передан параметр "Получатель", то эта табличная часть очищается перед заполнением согласно данным параметра.
Объект.ПолучателиПисьма.Очистить();
СписокПолучателей.Очистить();
Если ТипЗнч(ПереданныеПараметры.Получатель) = Тип("Строка") И НЕ ПустаяСтрока(ПереданныеПараметры.Получатель) Тогда
Объект.СписокПолучателейПисьма = ПереданныеПараметры.Получатель;
НоваяСтрока = Объект.ПолучателиПисьма.Добавить();
НоваяСтрока.Адрес = ПереданныеПараметры.Получатель;
ИначеЕсли ТипЗнч(ПереданныеПараметры.Получатель) = Тип("СписокЗначений") Тогда
Для Каждого ЭлементСписка Из ПереданныеПараметры.Получатель Цикл
НоваяСтрока = Объект.ПолучателиПисьма.Добавить();
НоваяСтрока.Адрес = ЭлементСписка.Значение;
НоваяСтрока.Представление = ОбработанноеПредставлениеАдресата(ЭлементСписка.Представление);
НоваяСтрока = СписокПолучателей.Добавить();
НоваяСтрока.ВариантОтправки = НСтр("ru = 'Кому:'");
НоваяСтрока.Адрес = ЭлементСписка.Значение;
НоваяСтрока.Представление = ОбработанноеПредставлениеАдресата(ЭлементСписка.Представление);
КонецЦикла;
Объект.СписокПолучателейПисьма = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиПисьма, Ложь);
ИначеЕсли ТипЗнч(ПереданныеПараметры.Получатель) = Тип("Массив") Тогда
Для Каждого ЭлементМассива Из ПереданныеПараметры.Получатель Цикл
МассивАдресов = СтрРазделить(ЭлементМассива.Адрес, ";");
Для Каждого Адрес Из МассивАдресов Цикл
Если ПустаяСтрока(Адрес) Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = Объект.ПолучателиПисьма.Добавить();
НоваяСтрока.Адрес = СокрЛП(Адрес);
НоваяСтрока.Представление = ОбработанноеПредставлениеАдресата(ЭлементМассива.Представление);
НоваяСтрока.Контакт = ЭлементМассива.ИсточникКонтактнойИнформации;
КонецЦикла;
КонецЦикла;
Объект.СписокПолучателейПисьма = ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиПисьма, Ложь);
КонецЕсли;
КонецЕсли;
ОчиститьДублиАдресатов(Объект.ПолучателиПисьма);
Если ПереданныеПараметры.Свойство("Отправитель") И ЗначениеЗаполнено(ПереданныеПараметры.Отправитель) Тогда
Объект.УчетнаяЗапись = ПереданныеПараметры.Отправитель;
РеквизитыОтправителя = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(
ПереданныеПараметры.Отправитель,"Ссылка, ИмяПользователя, АдресЭлектроннойПочты");
Объект.ОтправительПредставление = ВзаимодействияКлиентСервер.ПолучитьПредставлениеАдресата(
РеквизитыОтправителя.ИмяПользователя, РеквизитыОтправителя.АдресЭлектроннойПочты, "");
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ОбработанноеПредставлениеАдресата(ПредставлениеАдресата)
ПредставлениеАдресата = СтрЗаменить(ПредставлениеАдресата, ",", "");
ПредставлениеАдресата = СтрЗаменить(ПредставлениеАдресата, ";", "");
Возврат ПредставлениеАдресата;
КонецФункции
&НаСервере
Процедура УстановитьТекстПисьмаПоПереданнымПараметрам(ПереданныеПараметры)
Если НЕ ПереданныеПараметры.Свойство("Текст") Тогда
Возврат;
КонецЕсли;
Текст = ПереданныеПараметры.Текст;
Если ТипЗнч(Текст) = Тип("Структура") Тогда
ТекстПисьмаФорматированныйДокумент.УстановитьHTML(Текст.ТекстHTML, Текст.СтруктураВложений);
Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками;
Объект.Текст = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст();
ИначеЕсли ТипЗнч(Текст) = Тип("Строка") И Не ПустаяСтрока(Текст) Тогда
Если СтрЗаканчиваетсяНа(НРег(СокрП(Текст)), НРег("</html>")) Тогда
Картинки = Новый Структура;
Если ТипЗнч(ПереданныеПараметры.Вложения) = Тип("Массив") Тогда
Для Индекс = -ПереданныеПараметры.Вложения.ВГраница() По 0 Цикл
Вложение = ПереданныеПараметры.Вложения[-Индекс];
Если Вложение.Свойство("Идентификатор") И ЗначениеЗаполнено(Вложение.Идентификатор) Тогда
КартинкаВложение = Новый Картинка(ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище));
Картинки.Вставить(Вложение.Представление, КартинкаВложение);
ПереданныеПараметры.Вложения.Удалить(-Индекс);
КонецЕсли;
КонецЦикла;
КонецЕсли;
ТекстПисьмаФорматированныйДокумент.Установить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);
Результат.Добавить(ЗначениеВыбора,
ВзаимодействияКлиентСервер.ПолучитьПредставлениеАдресата(Выборка.Наименование, Выборка.Представление, ""));
КонецЦикла;
Возврат Результат;
КонецФункции
&НаКлиенте
Функция ПолучитьПредставлениеИдентификаторовОснований(Знач Идентификаторы)
Идентификаторы = СтрЗаменить(Идентификаторы, "<", " ");
Идентификаторы = СтрЗаменить(Идентификаторы, ">", " ");
Идентификаторы = СтрЗаменить(Идентификаторы, " ", " ");
Идентификаторы = СокрЛП(СтрЗаменить(Идентификаторы, " ", " "));
Идентификаторы = СтрЗаменить(Идентификаторы, " ", Символы.ПС + " ");
Возврат Идентификаторы;
КонецФункции
&НаКлиенте
Процедура РедактироватьСписокПолучателей(ДляПодбора, ГруппаПодбора = "")
Объект.ПолучателиПисьма.Очистить();
Объект.ПолучателиКопий.Очистить();
Объект.ПолучателиСкрытыхКопий.Очистить();
Объект.ПолучателиОтвета.Очистить();
Для каждого Получатель Из СписокПолучателей Цикл
Если Получатель.ВариантОтправки = НСтр("ru = 'Обратный адрес:'") Тогда
НоваяСтрока = Объект.ПолучателиОтвета.Добавить();
ИначеЕсли Получатель.ВариантОтправки = НСтр("ru = 'Копия:'") Тогда
НоваяСтрока = Объект.ПолучателиКопий.Добавить();
ИначеЕсли Получатель.ВариантОтправки = НСтр("ru = 'Скрытая копия:'") Тогда
НоваяСтрока = Объект.ПолучателиСкрытыхКопий.Добавить();
Иначе
НоваяСтрока = Объект.ПолучателиПисьма.Добавить();
КонецЕсли;
ЗаполнитьЗначенияСвойств(НоваяСтрока, Получатель);
КонецЦикла;
// Получим список адресатов
СоответствиеТабличныхЧастей = Новый Соответствие;
СоответствиеТабличныхЧастей.Вставить("Кому", Объект.ПолучателиПисьма);
СоответствиеТабличныхЧастей.Вставить("Копии", Объект.ПолучателиКопий);
СоответствиеТабличныхЧастей.Вставить("Скрытые", Объект.ПолучателиСкрытыхКопий);
СоответствиеТабличныхЧастей.Вставить("Ответ", Объект.ПолучателиОтвета);
СписокВыбранных = Новый СписокЗначений;
Для Каждого ТабличнаяЧасть Из СоответствиеТабличныхЧастей Цикл
СписокВыбранных.Добавить(
УправлениеЭлектроннойПочтойКлиент.ТаблицуКонтактовВМассив(ТабличнаяЧасть.Значение), ТабличнаяЧасть.Ключ);
КонецЦикла;
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("УчетнаяЗапись", Объект.УчетнаяЗапись);
ПараметрыОткрытия.Вставить("СписокВыбранных", СписокВыбранных);
ПараметрыОткрытия.Вставить("Предмет", Предмет);
ПараметрыОткрытия.Вставить("Письмо", Объект.Ссылка);
ПараметрыОткрытия.Вставить("ГруппаПоУмолчанию", ?(ПустаяСтрока(ГруппаПодбора), НСтр("ru = 'Кому'"), ГруппаПодбора));
// Откроем форму для редактирования списка адресатов.
ОповещениеПослеЗакрытия = Новый ОписаниеОповещения("ПослеЗаполненияАдреснойКниги", ЭтотОбъект);
ИмяОбщейФормы = ?(ДляПодбора, "ОбщаяФорма.АдреснаяКнига", "ОбщаяФорма.УточнениеКонтактов");
ОткрытьФорму(ИмяОбщейФормы, ПараметрыОткрытия, ЭтотОбъект,,,, ОповещениеПослеЗакрытия);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаполненияАдреснойКниги(ВыбранноеЗначение, ДополнительныеПараметры) Экспорт
ЗаполнитьПодобранныхПолучателейПослеВыбора(ВыбранноеЗначение);
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПодобранныхПолучателейПослеВыбора(ВыбранноеЗначение)
Если ТипЗнч(ВыбранноеЗначение) <> Тип("Массив") И ТипЗнч(ВыбранноеЗначение) <> Тип("Соответствие") Тогда
Возврат;
КонецЕсли;
// Получим список адресатов
СоответствиеТабличныхЧастей = Новый Соответствие;
СоответствиеТабличныхЧастей.Вставить("Кому", Объект.ПолучателиПисьма);
СоответствиеТабличныхЧастей.Вставить("Копии", Объект.ПолучателиКопий);
СоответствиеТабличныхЧастей.Вставить("Скрытые", Объект.ПолучателиСкрытыхКопий);
СоответствиеТабличныхЧастей.Вставить("Получатели", Объект.ПолучателиОтвета);
ДляПодбора = (Объект.СтатусПисьма <> ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Отправлено"));
// Заполним адресатов
Если ДляПодбора Тогда
ЗаполнитьПодобранныхПолучателей(СоответствиеТабличныхЧастей, ВыбранноеЗначение);
Иначе
ЗаполнитьУточненныеКонтакты(ВыбранноеЗначение);
КонецЕсли;
// Установим признак модифицированности.
ВзаимодействияКлиентСервер.ПроверитьЗаполнениеКонтактов(Объект, ЭтотОбъект, "ЭлектронноеПисьмоИсходящее");
ИзменилисьКонтакты = Истина;
Модифицированность = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьПодобранныхПолучателей(СоответствиеТабличныхЧастей, Результат)
Для Каждого ТабличнаяЧасть Из СоответствиеТабличныхЧастей Цикл
ТабличнаяЧасть.Значение.Очистить();
КонецЦикла;
МассивРанееДобавленныхАдресов = Новый Массив;
Для Каждого Элемент Из Результат Цикл
ТабличнаяЧасть = СоответствиеТабличныхЧастей.Получить(Элемент.Группа);
Если ТабличнаяЧасть = Неопределено Тогда
ТабличнаяЧасть = Объект.ПолучателиПисьма;
КонецЕсли;
Если МассивРанееДобавленныхАдресов.Найти(Элемент.Адрес) <> Неопределено Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = ТабличнаяЧасть.Добавить();
НоваяСтрока.Адрес = Элемент.Адрес;
НоваяСтрока.Представление = ОбработанноеПредставлениеАдресата(Элемент.Представление);
НоваяСтрока.Контакт = Элемент.Контакт;
МассивРанееДобавленныхАдресов.Добавить(НоваяСтрока.Адрес);
КонецЦикла;
ОчиститьДублиАдресатов(Объект.ПолучателиПисьма);
СформироватьСпискиПолучателей();
КонецПроцедуры
&НаКлиенте
Процедура СформироватьСпискиПолучателей()
Объект.СписокПолучателейПисьма =
ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиПисьма, Ложь);
Объект.СписокПолучателейКопий =
ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиКопий, Ложь);
Объект.СписокПолучателейСкрытыхКопий =
ВзаимодействияКлиентСервер.ПолучитьПредставлениеСпискаАдресатов(Объект.ПолучателиСкрытыхКопий, Ложь);
СформироватьСпискиПолучателейПисьма();
КонецПроцедуры
&НаСервере
Процедура СформироватьСпискиПолучателейПисьма()
СписокПолучателей.Очистить();
ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиПисьма, НСтр("ru = 'Кому:'"));
ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиКопий, НСтр("ru = 'Копия:'"));
ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиСкрытыхКопий, НСтр("ru = 'Скрытая копия:'"));
ДобавитьАдресВСписокПолучателей(СписокПолучателей, Объект.ПолучателиОтвета, НСтр("ru = 'Обратный адрес:'"));
Если СписокПолучателей.Количество() = 0 Тогда
НоваяСтрока = СписокПолучателей.Добавить();
НоваяСтрока.ВариантОтправки = "Кому:";
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ДобавитьАдресВСписокПолучателей(СписокПолучателей, ПолучателиПисьма, Кому)
Для каждого СтрокаПолучатель Из ПолучателиПисьма Цикл
НоваяСтрока = СписокПолучателей.Добавить();
НоваяСтрока.ВариантОтправки = Кому;
НоваяСтрока.Адрес = СтрокаПолучатель.Адрес;
НоваяСтрока.Контакт = СтрокаПолучатель.Контакт;
НоваяСтрока.Представление = ВзаимодействияКлиентСервер.ПолучитьПредставлениеАдресата(СтрокаПолучатель.Представление,
СтрокаПолучатель.Адрес, "");
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьУточненныеКонтакты(Результат)
Объект.ПолучателиКопий.Очистить();
Объект.ПолучателиОтвета.Очистить();
Объект.ПолучателиПисьма.Очистить();
Объект.ПолучателиСкрытыхКопий.Очистить();
Для каждого ЭлементМассива Из Результат Цикл
Если ЭлементМассива.Группа = "Кому" Тогда
ТаблицаПолучателей = Объект.ПолучателиПисьма;
ИначеЕсли ЭлементМассива.Группа = "Копии" Тогда
ТаблицаПолучателей = Объект.ПолучателиКопий;
ИначеЕсли ЭлементМассива.Группа = "Скрытые" Тогда
ТаблицаПолучателей = Объект.ПолучателиСкрытыхКопий;
Иначе
ТаблицаПолучателей = Объект.ПолучателиОтвета;
КонецЕсли;
СтрокаПолучатели = ТаблицаПолучателей.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаПолучатели, ЭлементМассива);
КонецЦикла;
СформироватьСпискиПолучателей();
КонецПроцедуры
&НаКлиенте
Процедура ПоказатьПредупреждениеОНеобходимостиВвестиАдресЭлектроннойПочты()
ПоказатьПредупреждение(, НСтр("ru = 'Необходимо ввести адрес электронной почты'"));
КонецПроцедуры
&НаСервере
Функция ВыполнитьОтправкуНаСервере()
ПисьмоОбъект = РеквизитФормыВЗначение("Объект");
Результат = Новый Структура;
Результат.Вставить("ТекстСообщения", "");
Результат.Вставить("ПисьмоОтправлено", Ложь);
ПараметрыПисьма = Взаимодействия.ПараметрыПисьмаДляОтправки(ПисьмоОбъект);
Письмо = РаботаСПочтовымиСообщениями.ПодготовитьПисьмо(ПисьмоОбъект.УчетнаяЗапись, ПараметрыПисьма);
РезультатОтправки = РаботаСПочтовымиСообщениями.ОтправитьПисьмо(ПисьмоОбъект.УчетнаяЗапись, Письмо);
ПараметрыОбработкиОшибки = УправлениеЭлектроннойПочтой.ПараметрыОбработкиОшибкиОтправки();
ПараметрыОбработкиОшибки.ПисьмоОбъект = ПисьмоОбъект;
ПараметрыОбработкиОшибки.Ссылка = ПисьмоОбъект.Ссылка;
ПараметрыОбработкиОшибки.ПредставлениеПисьма = Взаимодействия.ПредставлениеПисьма(ПисьмоОбъект.Тема, ПисьмоОбъект.Дата);
ПараметрыОбработкиОшибки.КоличествоПопыток = 0;
ПараметрыОбработкиОшибки.ИнкрементироватьКоличествоПопыток = Ложь;
ПараметрыОбработкиОшибки.СообщатьПользователю = Истина;
Если ЗначениеЗаполнено(РезультатОтправки.ОшибочныеПолучатели) Тогда
Результат = УправлениеЭлектроннойПочтой.ОбработатьОшибкуОтправкиПисьма(ПараметрыОбработкиОшибки, РезультатОтправки.ОшибочныеПолучатели);
Если Не Результат.ПисьмоОтправлено Тогда
ЗначениеВРеквизитФормы(ПисьмоОбъект, "Объект");
Возврат Результат;
КонецЕсли;
КонецЕсли;
ИдентификаторПисьма = РезультатОтправки.ИдентификаторПисьмаSMTP;
Результат.ПисьмоОтправлено = Истина;
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Документ.ЭлектронноеПисьмоИсходящее");
ЭлементБлокировки.УстановитьЗначение("Ссылка", Объект.Ссылка);
РегистрыСведений.ПредметыПапкиВзаимодействий.ЗаблокироватьПредметыПапокВзаимодействий(Блокировка, Объект.Ссылка);
Блокировка.Заблокировать();
Если НЕ ПисьмоОбъект.УдалятьПослеОтправки Тогда
ПисьмоОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено;
ПисьмоОбъект.ДатаОтправления = ТекущаяДатаСеанса();
ПисьмоОбъект.Записать(РежимЗаписиДокумента.Запись);
ЗначениеВРеквизитФормы(ПисьмоОбъект, "Объект");
Взаимодействия.УстановитьПапкуЭлектронногоПисьма(Объект.Ссылка, Взаимодействия.ОпределитьПапкуДляПисьма(Объект.Ссылка));
ТекущийСтатусПисьма = Объект.СтатусПисьма;
Иначе
ПисьмоОбъект.Прочитать();
ПисьмоОбъект.Удалить();
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
Возврат Результат;
КонецФункции
&НаСервере
Функция ОценитьРазмерПисьма()
Размер = СтрДлина(Объект.Тема)*2;
Размер = Размер + ?(Объект.ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML,
СтрДлина(Объект.ТекстHTML),
СтрДлина(Объект.Текст)) * 2;
Для каждого Вложение Из Вложения Цикл
Размер = Размер + Вложение.Размер * 1.5;
КонецЦикла;
Для каждого СтрокаТаблицыСоответствий Из ТаблицаСоответствийИменВложенийИдентификаторам Цикл
Размер = Размер + СтрокаТаблицыСоответствий.Картинка.ПолучитьДвоичныеДанные().Размер()*1.5;
КонецЦикла;
Возврат Размер;
КонецФункции
&НаСервере
Функция РеквизитыФайла(Файл)
ТребуемыеРеквизиты = "Наименование, Расширение, ИндексКартинки, Размер";
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
ТребуемыеРеквизиты = ТребуемыеРеквизиты + ", ПодписанЭП";
КонецЕсли;
Возврат ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Файл, ТребуемыеРеквизиты);
КонецФункции
&НаКлиенте
Процедура ОтправитьПисьмоКлиент()
Если Не ОтправлятьСообщенияСразу Тогда
ОтправлятьСообщенияСразу = (
Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Исходящее"));
КонецЕсли;
ВыполняетсяОтправка = Истина;
Если Объект.Ссылка.Пустая()
Или Модифицированность
Или Объект.ВключатьТелоИсходногоПисьма
Или (Объект.СтатусПисьма = ПредопределенноеЗначение("Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик")) Тогда
Записать();
КонецЕсли;
ВыполняетсяОтправка = Ложь;
Если Модифицированность Тогда
Возврат;
КонецЕсли;
Если ОтправлятьСообщенияСразу Тогда
Результат = ВыполнитьОтправкуНаСервере();
Иначе
Закрыть();
Возврат;
КонецЕсли;
Если Результат.ПисьмоОтправлено
И Результат.ТекстСообщения = "" Тогда
Закрыть();
ИначеЕсли Результат.ПисьмоОтправлено
И Результат.ТекстСообщения <> "" Тогда
Прочитать();
ПоказатьПредупреждение(, Результат.ТекстСообщения);
ИначеЕсли Результат.ТекстСообщения <> "" Тогда
ПоказатьПредупреждение(, Результат.ТекстСообщения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВопросОНеСохраненииОтправленногоПисьма(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
Объект.УдалятьПослеОтправки = Истина;
ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Нет Тогда
Объект.УдалятьПослеОтправки = Ложь;
ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Отмена Тогда
Возврат;
КонецЕсли;
ОтправитьПисьмоКлиент();
КонецПроцедуры
&НаКлиенте
Процедура ВопросПриИзмененииФорматаПриЗакрытии(РезультатВопроса, ДополнительныеПараметры) Экспорт
Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда
ФорматСообщения = ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.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 Тогда
РаботаСФайламиСлужебныйВызовСервера.ОсвободитьФайлы(ДополнительныеПараметры.МассивРедактируемыхФайлов);
Модифицированность = Ложь;
Закрыть();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьТабличныеЧастиПоСпискуПолучателей()
Объект.ПолучателиПисьма.Очистить();
Объект.ПолучателиКопий.Очистить();
Объект.ПолучателиСкрытыхКопий.Очистить();
Объект.ПолучателиОтвета.Очистить();
Для каждого Получатель Из СписокПолучателей Цикл
ПочтовыеАдреса = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(Получатель.Представление);
Для каждого ПочтовыйАдрес Из ПочтовыеАдреса Цикл
Если Получатель.ВариантОтправки = НСтр("ru = 'Обратный адрес:'") Тогда
НоваяСтрока = Объект.ПолучателиОтвета.Добавить();
ИначеЕсли Получатель.ВариантОтправки = НСтр("ru = 'Копия:'") Тогда
НоваяСтрока = Объект.ПолучателиКопий.Добавить();
ИначеЕсли Получатель.ВариантОтправки = НСтр("ru = 'Скрытая копия:'") Тогда
НоваяСтрока = Объект.ПолучателиСкрытыхКопий.Добавить();
Иначе
НоваяСтрока = Объект.ПолучателиПисьма.Добавить();
КонецЕсли;
НоваяСтрока.Адрес = ПочтовыйАдрес.Адрес;
НоваяСтрока.Представление = ПочтовыйАдрес.Псевдоним;
НоваяСтрока.Контакт = Получатель.Контакт;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
// СтандартныеПодсистемы.Свойства
&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию()
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
МодульУправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент)
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ОбновитьЭлементыДополнительныхРеквизитов()
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствами = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствами");
МодульУправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов()
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда
МодульУправлениеСвойствамиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеСвойствамиКлиент");
МодульУправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства
// СтандартныеПодсистемы.ШаблоныСообщений
&НаКлиенте
Процедура ЗаполнитьПоШаблонуПослеВыбораШаблона(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено И ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("Шаблон") Тогда
ЗаполнитьШаблонПослеВыбора(Результат);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьШаблонПослеВыбора(ПараметрыПисьма)
ОбработатьПереданныеПараметры(ПараметрыПисьма);
СформироватьСпискиПолучателейПисьма();
ОпределитьВидимостьДоступностьЭлементовВЗависимостиОтСтатусаПисьма();
КонецПроцедуры
&НаСервере
Процедура ОпределитьВозможностьЗаполненияПисьмаПоШаблону()
Если Объект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Черновик Тогда
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ШаблоныСообщений") Тогда
МодульШаблоныСообщенийСлужебный = ОбщегоНазначения.ОбщийМодуль("ШаблоныСообщенийСлужебный");
Элементы.ФормаСформироватьПоШаблону.Видимость = МодульШаблоныСообщенийСлужебный.ИспользуютсяШаблоныСообщений();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Конец СтандартныеПодсистемы.ШаблоныСообщений
&НаСервере
Процедура УстановитьВидимостьПредупрежденияБезопасности()
ЗапрещеноОтображениеНебезопасногоСодержимогоВПисьмах = Взаимодействия.ЗапрещеноОтображениеНебезопасногоСодержимогоВПисьмах();
Элементы.ПредупреждениеБезопасности.Видимость = Не ЗапрещеноОтображениеНебезопасногоСодержимогоВПисьмах
И ЕстьНебезопасноеСодержимое И Не ВключитьНебезопасноеСодержимое;
КонецПроцедуры
&НаСервере
Процедура ПрочитатьТекстВходящегоПисьмаHTML()
ТекстВходящегоПисьма = Взаимодействия.ОбработатьТекстHTML(Объект.ВзаимодействиеОснование,
Не ВключитьНебезопасноеСодержимое, ЕстьНебезопасноеСодержимое);
УстановитьВидимостьПредупрежденияБезопасности();
КонецПроцедуры
#КонецОбласти
// СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
МодульПодключаемыеКомандыКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиент");
МодульПодключаемыеКомандыКлиент.НачатьВыполнениеКоманды(ЭтотОбъект, Команда, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПродолжитьВыполнениеКомандыНаСервере(ПараметрыВыполнения, ДополнительныеПараметры) Экспорт
ВыполнитьКомандуНаСервере(ПараметрыВыполнения);
КонецПроцедуры
&НаСервере
Процедура ВыполнитьКомандуНаСервере(ПараметрыВыполнения)
МодульПодключаемыеКоманды = ОбщегоНазначения.ОбщийМодуль("ПодключаемыеКоманды");
МодульПодключаемыеКоманды.ВыполнитьКоманду(ЭтотОбъект, ПараметрыВыполнения, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбновитьКоманды()
МодульПодключаемыеКомандыКлиентСервер = ОбщегоНазначенияКлиент.ОбщийМодуль("ПодключаемыеКомандыКлиентСервер");
МодульПодключаемыеКомандыКлиентСервер.ОбновитьКоманды(ЭтотОбъект, Объект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.ПодключаемыеКоманды
&НаКлиенте
Процедура ПроверитьСостояниеОтправкиПисем()
ПроверитьСостояниеОтправкиПисемНаСервере();
Интервал = ?(Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость, 60, 600);
ПодключитьОбработчикОжидания("ПроверитьСостояниеОтправкиПисем", Интервал, Истина);
КонецПроцедуры
&НаСервере
Процедура ПроверитьСостояниеОтправкиПисемНаСервере()
Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость = Взаимодействия.ОтправкаПисемПриостановлена();
Элементы.ПредупреждениеОНеотправленныхПисьмахНадпись.Заголовок = Взаимодействия.ТекстПредупрежденияОПриостановкеОтправкиПисем();
КонецПроцедуры
#КонецОбласти