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