Имя: Пароль:
1C
1С v8
Почтовый менеджер, заполнение текста письма по шаблону
0 nlv-lara
 
28.08.15
10:45
Приветствую.
Используем 1С CRM 2.0. В почтовом менеджере при создании (ответе и пересылке) письма, текст и вложения можно заполнить по шаблону. Проблема: при заполнении из шаблона очищается история переписки и вложения исходного письма (при ответе и пересылке). Проблему с очищением вложений решили. Но с текстом что-то не выходит. Кто-то может помочь?

&НаСервере
Процедура ЗаполнитьПоШаблону()
ТекстШаблона = "";
СтруктураВложенийШаблона = Новый Структура;

// вложения HTML текста — картинки
табВложения = ПолучитьФайлыШаблонаРассылки(Шаблон);

// я так понимаю, эта часть кода удаляет все вложения от письма исходника!!! После того, как закомментировала, вложения не удаляются.

//мВложений = Новый Массив;
//Для каждого СтрокаВложения Из Вложения Цикл
// ИДВложения = СтрокаВложения.CRM_ИдентификаторПочтовогоВложения;
// Если ЗначениеЗаполнено(ИДВложения) И Лев(ИДВложения,СтрДлина(«image»)) = «image»
// И ТипЗнч(СтрокаВложения.Ссылка) = Тип("СправочникСсылка.CRM_ШаблоныРассылкиПрисоединенныеФайлы")
// Тогда
// мВложений.Добавить(СтрокаВложения.ПолучитьИдентификатор());
// КонецЕсли;
//КонецЦикла;
//
//Для каждого иВложения Из мВложений Цикл
// Вложения.Удалить(иВложения);
//КонецЦикла;

Если табВложения.Количество() > 0 Тогда

Для Каждого Стр Из табВложения Цикл

ДвоичныеДанныеВложения = ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(Стр.Ссылка,Ложь);
Если ДвоичныеДанныеВложения <> Неопределено Тогда

СтруктураВложенийШаблона.Вставить(Стр.CRM_ИдентификаторПочтовогоВложения+"_1", Новый Картинка(ДвоичныеДанныеВложения));

КонецЕсли;

КонецЦикла;

Иначе
СтруктураВложенийШаблона.Вставить("Пусто");
КонецЕсли;

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

новСтр = Вложения.Добавить();
новСтр.Расположение = 4;
новСтр.ИмяФайла = Стр.ИмяФайла;
новСтр.ИмяФайлаНаКомпьютере = АдресВХранилище;
новСтр.ИндексКартинки = Стр.ИндексКартинки;
новСтр.CRM_ИдентификаторПочтовогоВложения = "*";
КонецЕсли;
КонецЦикла;
КонецЕсли;


ТекстШаблона = Шаблон.Текст; // думаю рыть надо здесь, чтобы сохранялся исходный текст письма!!!

// заполним автотекст

СтруктураЗаполненияАвтотекста = Новый Структура;
СтруктураЗаполненияАвтотекста.Вставить("Партнер", Справочники.Партнеры.ПустаяСсылка());
СтруктураЗаполненияАвтотекста.Вставить("КонтактноеЛицо", Справочники.КонтактныеЛицаПартнеров.ПустаяСсылка());

Если ПолучателиПисьма.Количество() > 0 Тогда

Клиент = ПолучателиПисьма[0].Контакт;

Если ЗначениеЗаполнено(Клиент) Тогда

Если ТипЗнч(Клиент) = Тип("СправочникСсылка.КонтактныеЛицаПартнеров") Тогда

СтруктураЗаполненияАвтотекста.КонтактноеЛицо = Клиент;

ИначеЕсли ТипЗнч(Клиент) = Тип("СправочникСсылка.Партнеры") Тогда

СтруктураЗаполненияАвтотекста.Партнер = Клиент;

ИначеЕсли ТипЗнч(Клиент) = Тип("СправочникСсылка.Пользователи") Тогда

СтруктураЗаполненияАвтотекста.Партнер = Новый Структура("Наименование", СокрЛП(Клиент.Наименование));

ИначеЕсли ТипЗнч(Клиент) = Тип("Строка") Тогда

Если ЗначениеЗаполнено(СокрЛП(ПолучателиПисьма[0].Представление)) Тогда

СтруктураЗаполненияАвтотекста.Партнер = Новый Структура("Наименование", СокрЛП(ПолучателиПисьма[0].Представление));

Иначе

СтруктураЗаполненияАвтотекста.Партнер = Новый Структура("Наименование", СокрЛП(Клиент));

КонецЕсли;

Иначе

Попытка

СтруктураЗаполненияАвтотекста.Партнер = Новый Структура("Наименование", СокрЛП(Клиент.Наименование));

Исключение

КонецПопытки;

КонецЕсли;

Иначе

Если ЗначениеЗаполнено(СокрЛП(ПолучателиПисьма[0].Представление)) Тогда

СтруктураЗаполненияАвтотекста.Партнер = Новый Структура("Наименование", СокрЛП(ПолучателиПисьма[0].Представление));

Иначе

СтруктураЗаполненияАвтотекста.Партнер = Новый Структура("Наименование", СокрЛП(ПолучателиПисьма[0].Адрес));

КонецЕсли;

КонецЕсли;

КонецЕсли;

ТаблицаАвтотекста = Новый ТаблицаЗначений;

ТаблицаАвтотекста.Колонки.Добавить("Тэг");
ТаблицаАвтотекста.Колонки.Добавить("ИмяКоманды");
ТаблицаАвтотекста.Колонки.Добавить("ЗаголовокКоманды");
ТаблицаАвтотекста.Колонки.Добавить("Действие");

CRM_АвтотекстПереопределяемый.СформироватьСписокАвтотекста(ТаблицаАвтотекста, Перечисления.CRM_НазначенияАвтотекста.АвтотекстЭлектронноеПисьмо);

Для Каждого СтрокаАвтотекста ИЗ ТаблицаАвтотекста Цикл

Если Найти(ТекстШаблона, СтрокаАвтотекста.Тэг) > 0 Тогда

ЗначениеТэга = CRM_АвтотекстПереопределяемый.ПолучитьЗначениеТэга(СтрокаАвтотекста, СтруктураЗаполненияАвтотекста);

ТекстШаблона = СтрЗаменить(ТекстШаблона, СтрокаАвтотекста.Тэг, ЗначениеТэга);

КонецЕсли;

КонецЦикла;

Для Каждого КлючИЗначение ИЗ СтруктураВложенийШаблона Цикл
ИД_Вложения = СтрЗаменить(КлючИЗначение.Ключ, "_1", "");
ТекстШаблона = СтрЗаменить(ТекстШаблона, ИД_Вложения, КлючИЗначение.Ключ);
КонецЦикла;

ФорматированныйДокументТекст.УстановитьHTML(ТекстШаблона, СтруктураВложенийШаблона);

Элементы.Вложения.ОтборСтрок = Новый ФиксированнаяСтруктура(«CRM_ИдентификаторПочтовогоВложения»,"*");

Объект.Текст = ФорматированныйДокументТекст.ПолучитьТекст();
ТекстПодписи = "";


НаборРегистра = РегистрыСведений.CRM_ПодписиУчетныхЗаписей.СоздатьНаборЗаписей();
НаборРегистра.Отбор.Пользователь.Установить(ПараметрыСеанса.ТекущийПользователь);
НаборРегистра.Отбор.УчетнаяЗапись.Установить(Объект.УчетнаяЗапись);
НаборРегистра.Прочитать();

Если НаборРегистра.Количество() > 0 Тогда

// Добавим подписи для пересылки и нового письма
Если Лев(Объект.Тема,3) <> «Re:» И Лев(Объект.Тема,3) <> «Fw:» Тогда

Если ЗначениеЗаполнено(НаборРегистра[0].ПодписьИсходящегоПисьма) Тогда

табВложения = УправлениеЭлектроннойПочтой.ПолучитьФайлыПодписиЭлектронногоПисьма(НаборРегистра[0].ПодписьИсходящегоПисьма);
Если табВложения.Количество() > 0 Тогда

Для Каждого Стр Из табВложения Цикл

ДвоичныеДанные = ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(Стр.Ссылка,Ложь);
Если ДвоичныеДанные <> Неопределено Тогда

Если Не Стр.CRM_ИдентификаторПочтовогоВложения = "" Тогда
СтруктураВложенийШаблона.Вставить(Стр.CRM_ИдентификаторПочтовогоВложения, Новый Картинка(ДвоичныеДанные));
Иначе

новСтр = Вложения.Добавить();
новСтр.Ссылка = Стр.Ссылка;
новСтр.ИмяФайла = Стр.ИмяФайла;
новСтр.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
новСтр.ИндексКартинки = Стр.ИндексКартинки;
новСтр.Размер = Стр.Размер;
новСтр.Расположение = 4;
новСтр.CRM_ИдентификаторПочтовогоВложения = Стр.CRM_ИдентификаторПочтовогоВложения;

КонецЕсли;

КонецЕсли;

КонецЦикла;

Иначе
СтруктураВложенийШаблона.Вставить("Пусто");
КонецЕсли;
ТекстПодписи = НаборРегистра[0].ПодписьИсходящегоПисьма.Текст;
КонецЕсли;

Иначе

Если ЗначениеЗаполнено(НаборРегистра[0].ПодписьПересылаемогоПисьма) Тогда

табВложения = УправлениеЭлектроннойПочтой.ПолучитьФайлыПодписиЭлектронногоПисьма(НаборРегистра[0].ПодписьПересылаемогоПисьма);
Если табВложения.Количество() > 0 Тогда

Для Каждого Стр Из табВложения Цикл

ДвоичныеДанные = ПрисоединенныеФайлы.ПолучитьДвоичныеДанныеФайла(Стр.Ссылка,Ложь);
Если ДвоичныеДанные <> Неопределено Тогда

Если Не Стр.CRM_ИдентификаторПочтовогоВложения = "" Тогда
СтруктураВложенийШаблона.Вставить(Стр.CRM_ИдентификаторПочтовогоВложения, Новый Картинка(ДвоичныеДанные));
Иначе

новСтр = Вложения.Добавить();
новСтр.Ссылка = Стр.Ссылка;
новСтр.ИмяФайла = Стр.ИмяФайла;
новСтр.ИмяФайлаНаКомпьютере = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
новСтр.ИндексКартинки = Стр.ИндексКартинки;
новСтр.Размер = Стр.Размер;
новСтр.Расположение = 4;
новСтр.CRM_ИдентификаторПочтовогоВложения = ?(Стр.CRM_ИдентификаторПочтовогоВложения = "", "*", Стр.CRM_ИдентификаторПочтовогоВложения);

КонецЕсли;

КонецЕсли;

КонецЦикла;

Иначе
СтруктураВложенийШаблона.Вставить("Пусто");
КонецЕсли;

ТекстПодписи = НаборРегистра[0].ПодписьПересылаемогоПисьма.Текст;

КонецЕсли;

КонецЕсли;

КонецЕсли;
//
//Если ПустаяСтрока(Объект.Текст) И ПустаяСтрока(Объект.Тема) И НЕ ПустаяСтрока(ТекстПодписи) Тогда
//
// Если ЗначениеЗаполнено(Объект.Текст) Тогда
// ТестХТМЛ = CRM_ОбщегоНазначенияКлиентСервер.ПреобразоватьТекстВHTML(Объект.Текст);
// КонецЕсли;
//
//Иначе
//
// // Значит ответ или пересылаемое
// Если ЗначениеЗаполнено(Объект.Текст) Тогда
// ТестХТМЛ = CRM_ОбщегоНазначенияКлиентСервер.ПреобразоватьТекстВHTML(Объект.Текст, Истина);
// КонецЕсли;
//
// Если НЕ ПустаяСтрока(ТекстПодписи) Тогда
// ТестХТМЛ = СтрЗаменить(ТекстПодписи, "<body>", "<body>" + ТестХТМЛ + "<BR>");
// КонецЕсли;
//
//КонецЕсли;
//
НомерКонечнойПозиции = Найти(ТекстШаблона,"</body>")-1;

НомерНачальнойПозиции = СтрДлина(ТекстШаблона)-Найти(ТекстШаблона,"</body>")+1;

ЛевСтр = Лев(ТекстШаблона,НомерКонечнойПозиции);

ПравСтр = Прав(ТекстШаблона,НомерНачальнойПозиции);

НачальнаяПозиция = Найти(ТекстПодписи,"<body>")+СтрДлина("<body>");

ЧислоСимволов = СтрДлина(ТекстПодписи)-НачальнаяПозиция-СтрДлина(ПравСтр);

ТекстПодписи = Сред(ТекстПодписи,НачальнаяПозиция,ЧислоСимволов);

ТекстШаблона = ЛевСтр + "<BR><BR>" +ТекстПодписи + ПравСтр;

ФорматированныйДокументТекст.УстановитьHTML(ТекстШаблона, СтруктураВложенийШаблона);

Элементы.Вложения.ОтборСтрок = Новый ФиксированнаяСтруктура(«CRM_ИдентификаторПочтовогоВложения»,"*");

КонецПроцедуры
1 nlv-lara
 
28.08.15
10:49
ТекстШаблона = Шаблон.Текст;// думаю рыть надо здесь, чтобы сохранялся исходный текст письма!!!

Попробовала так:
ТекстДок = СокрЛП(ФорматированныйДокументТекст.ПолучитьТекст());
    ТекстШаблона = ТекстДок + Шаблон.Текст;
// ТекстШаблона = Шаблон.Текст + ТекстДок; ТАК НЕ РАБОТАЕТ!

История письма вставляется вначале всего текста и очень некрасиво, без разделения строк.
2 ДенисЧ
 
28.08.15
10:56
"ТАК НЕ РАБОТАЕТ!"

Это почему?
3 nlv-lara
 
28.08.15
10:58
(2) Удаляет историю и все тут, кто б знал почему(
4 nlv-lara
 
28.08.15
13:35
Параметр "Шаблон" задается так:
Шаблон = ОткрытьФормуМодально("Справочник.CRM_ШаблоныРассылки.Форма.ФормаВыбора", , ЭтаФорма);
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.