Шаблоны сообщений / Форма элемента / Модуль формы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	УстановитьВыборФормата();
	СформироватьПредставлениеВыбранныхФорматов();
	
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура ВнешняяОбработкаПриИзменении(Элемент)
	ОтображениеЭлементовФормы();
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ТелоСообщенияОбычныйТекстSMSПриИзменении(Элемент)
	Объект.ТекстШаблонаSMS = ТелоСообщенияОбычныйТекст.ПолучитьТекст();
	ТелоСообщенияОбычныйТекст.УстановитьТекст(Объект.ТекстШаблонаSMS); // Тех. ограничение SMS 1024 символа.
КонецПроцедуры

&НаКлиенте
Процедура АвторПриИзменении(Элемент)
	Объект.ТолькоДляАвтора = ЗначениеЗаполнено(Объект.Автор);
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

// Возвращаемое значение:
//  Структура:
//   * Добавление - Булево
//
&НаКлиенте
Функция ДополнительныеПараметрыДобавленияРеквизитов()
	
	ДополнительныеПараметры = Новый Структура;
	ДополнительныеПараметры.Вставить("Добавление", Истина);
	Возврат ДополнительныеПараметры;
	
КонецФункции

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

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

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

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

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

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

&НаКлиенте
Процедура ЭлектронноеПисьмоОбычныйТекст(Команда)
	Если Не Элементы.ФормаЭлектронноеПисьмоОбычныйТекст.Пометка Тогда
		УстановитьЭлектронноеПисьмоОбычныйТекст(Истина);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЭлектронноеПисьмоHTML(Команда)
	Если Не Элементы.ФормаЭлектронноеПисьмоHTML.Пометка Тогда
		УстановитьЭлектронноеПисьмоHTML(Истина);
	КонецЕсли;
КонецПроцедуры

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

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

&НаКлиенте
Процедура ПоШаблону(Команда)
	
	Элементы.Страницы.ТекущаяСтраница         = Элементы.СообщениеЭлектронноеПисьмоHTML;
	
	Элементы.ГруппаВнешняяОбработка.Видимость = Ложь;
	Элементы.ГруппаПараметры.Видимость        = Истина;
	Элементы.ФормаПоШаблону.Пометка           = Истина;
	Элементы.ФормаВнешнейОбработкой.Пометка   = Ложь;
	Элементы.ТемаПисьма.ТолькоПросмотр        = Ложь;
	Объект.ШаблонПоВнешнейОбработке           = Ложь;
	Объект.ВнешняяОбработка                   = Неопределено;
	ОтображениеЭлементовФормы();
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ДобавитьПараметрВТекстСообщения(Команда)
	
	ДобавитьВТекстСообщенияПараметр();
	
КонецПроцедуры

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

&НаКлиенте
Процедура ДобавитьПараметрВТему(Команда)
	
	ТекущиеДанные = Элементы.Реквизиты.ТекущиеДанные;
	Если ТекущиеДанные <> Неопределено Тогда
		ФорматВывода = ?(ПустаяСтрока(ТекущиеДанные.Формат), "", "{" + ТекущиеДанные.Формат +"}");
		НачалоПараметра = ?(Прав(Объект.ТемаПисьма, 1) = " ", "[", " [");
		Объект.ТемаПисьма = Объект.ТемаПисьма + НачалоПараметра + ТекущиеДанные.ПолноеПредставление + ФорматВывода + "]";
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// бизнес-логика

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

&НаСервере
Процедура ОпределитьВозможностьПрисоединятьФайлы ()

	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
		Возврат;
	КонецЕсли;
	
	МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами");

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

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

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

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

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

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

// Вынужденная установка свойств на сервере

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

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

// Вложения

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

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

// Получает расширение для переданного имени файла.
//
// Параметры:
//  ИмяФайла  - Строка - имя файла, для которого необходимо получить расширение.
//
// Возвращаемое значение:
//   Строка   - расширение, полученное из переданного имени файла.
//
&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьРасширениеФайла(Знач ИмяФайла)
	
	РасширениеФайла = "";
	МассивСтрок = СтрРазделить(ИмяФайла, ".", Ложь);
	Если МассивСтрок.Количество() > 1 Тогда
		РасширениеФайла = МассивСтрок[МассивСтрок.Количество() - 1];
	КонецЕсли;
	
	Возврат РасширениеФайла;
	
КонецФункции

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

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

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

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

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

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

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

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

	Вложение = Элементы.Вложения.ТекущиеДанные;
	Если Вложение <> Неопределено Тогда
		Если Вложение.Статус = "ВнешнийПрисоединенный" ИЛИ Вложение.Статус = "ВнешнийНовый" Тогда
			Вложение.Статус = "ВнешнийУдаляемый";
			Вложение.ИндексКартинки = Вложение.ИндексКартинки + 1;
			Модифицированность = Истина;
		ИначеЕсли Вложение.Статус = "ВнешнийУдаляемый" Тогда
			Вложение.ИндексКартинки = Вложение.ИндексКартинки - 1;
			Вложение.Статус = ?(ЗначениеЗаполнено(Вложение.Ссылка), "ВнешнийПрисоединенный", "ВнешнийНовый");
		КонецЕсли;
		Модифицированность = Истина;
	КонецЕсли;
	
КонецПроцедуры

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

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

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

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

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

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

&НаСервере
Процедура ЗаписатьОшибкуВЖурналРегистрации(ИмяСобытия, ИнформацияОбОшибке, ТекстСобытия)
	
	Комментарий = ТекстСобытия + Символы.ПС + ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
	ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, Метаданные.Справочники.ШаблоныСообщений,, Комментарий);
	
КонецПроцедуры

&НаСервере
Функция ИмяСобытияШаблоныСообщений()
	
	Возврат НСтр("ru = 'Шаблоны сообщений'", ОбщегоНазначения.КодОсновногоЯзыка());
	
КонецФункции

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

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

// Внешняя обработка

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

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

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

&НаКлиентеНаСервереБезКонтекста
Процедура ОчиститьШаблон(Форма)
	
	Форма.Объект.Параметры.Очистить();
	Форма.Объект.ПредназначенДляЭлектронныхПисем        = Истина;
	Форма.Объект.ПредназначенДляSMS                     = Ложь;
	Форма.Объект.ПредназначенДляВводаНаОсновании        = Ложь;
	Форма.Объект.ПолноеИмяТипаПараметраВводаНаОсновании = "";
	Форма.Объект.ТемаПисьма                             = "";
	Форма.Объект.ТекстШаблонаSMS                        = "";
	Форма.Объект.ТекстШаблонаПисьма                     = "";
	Форма.Объект.ТекстШаблонаПисьмаHTML                 = "<html></html>";
	Форма.Объект.ТипТекстаПисьма                        = ПредопределенноеЗначение("Перечисление.СпособыРедактированияЭлектронныхПисем.ОбычныйТекст");
	
КонецПроцедуры

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

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

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

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

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

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

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

&НаКлиентеНаСервереБезКонтекста
Функция СоответствиеКартинкиВидуВложения(ВидыВложений)
	
	КартинкиВидаВложения = Новый Соответствие;
	КартинкиВидаВложения.Вставить(ВидыВложений[0], БиблиотекаКартинок.Печать);
	КартинкиВидаВложения.Вставить(ВидыВложений[1], БиблиотекаКартинок.СохранитьФайлКак);
	КартинкиВидаВложения.Вставить(ВидыВложений[2], БиблиотекаКартинок.Скрепка);
	
	Возврат КартинкиВидаВложения;
	
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция СоответствиеИндексаВидуВложения(ВидыВложений)
	
	ИндексыВидаВложения = Новый Соответствие;
	
	Для Сч = 0 По ВидыВложений.Количество() - 1 Цикл
		
		ИндексыВидаВложения.Вставить(ВидыВложений[Сч], Сч);
	
	КонецЦикла;
	
	Возврат ИндексыВидаВложения;
	
КонецФункции

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

&НаКлиенте
Процедура УстановитьПометкиПодчиненных(ТекСтрока, ИмяФлажка)
	
	Подчиненные = ТекСтрока.ПолучитьЭлементы();
	
	Если Подчиненные.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Для Каждого Строка Из Подчиненные Цикл
		
		Строка[ИмяФлажка] = ТекСтрока[ИмяФлажка];
		
		УстановитьПометкиПодчиненных(Строка, ИмяФлажка);
		
	КонецЦикла;
	
КонецПроцедуры

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

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

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