/////////////////////////////////////////////////////////////////////////////////////////////////////// // 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СКартинками; Объект.Текст = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст(); ИначеЕсли ТипЗнч(Текст) = Тип("Строка") И Не ПустаяСтрока(Текст) Тогда Если СтрЗаканчиваетсяНа(НРег(СокрП(Текст)), НРег("")) Тогда Картинки = Новый Структура; Если ТипЗнч(ПереданныеПараметры.Вложения) = Тип("Массив") Тогда Для Индекс = -ПереданныеПараметры.Вложения.ВГраница() По 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); ПодключитьОбработчикОжидания("ПроверитьСостояниеОтправкиПисем", Интервал, Истина); КонецПроцедуры &НаСервере Процедура ПроверитьСостояниеОтправкиПисемНаСервере() Элементы.ПредупреждениеОНеотправленныхПисьмах.Видимость = Взаимодействия.ОтправкаПисемПриостановлена(); Элементы.ПредупреждениеОНеотправленныхПисьмахНадпись.Заголовок = Взаимодействия.ТекстПредупрежденияОПриостановкеОтправкиПисем(); КонецПроцедуры #КонецОбласти