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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура Сформировать(Команда)
	
	СформироватьСообщениеПоВыбранномШаблону();
	
КонецПроцедуры

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

&НаКлиенте
Процедура Создать(Команда)
	СоздатьНовыйШаблон();
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура СформироватьСообщениеПоВыбранномШаблону()

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

	Результат.УпаковатьВАрхив = УпаковатьВАрхив;
	Результат.ПереводитьИменаФайловВТранслит = ПереводитьИменаФайловВТранслит;
	Результат.ПодписьИПечать = ПодписьИПечать;
	
	Возврат Результат;
	
КонецФункции

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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