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