Всем привет!

На днях настраивал шаблоны сообщений, где макрос поля (например Инциденты.Номер) в теле письма должен быть ссылкой на запись в Системе. (По нажатию на эту ссылку, пользователь переходит к данному инциденту в реестре раздела).

Поскольку на комюнити по этому поводу ничего конкретно не нашел - решил поделится.

В системе есть сервис scr_HyperlinkUtils, который и отвечает за этот функционал. Поскольку там много всего перейду к самому главному - как сделать ссылку.

Есть конструкция:

#[Link;%1:Макрос>;Действие>/ Название сущности >/%1:ID]#, где

  1. Макрос> - Название макроса соответствующего поля
  2. Действие> - Одно из действий, которое произойдет по нажатию на ссылку, а именно
    • open - открытие карточки редактирования записи
    • goto - переход к записи в реестре
    • calltonumber - звонок по номеру средствами call-центра системы
  3. Название сущности > - название сущности в системе (Инцидент - Incident, Задача - Task и т.д.)

Получается, что для решения задачки, которую я описал в начале, нам необходимо:
Макрос #Номер# заменить на #[Link;%1:Номер;goto/Incident/%1:ID]#

Нравится

Поделиться

20 комментариев

Не могли бы описать этот механизм подробнее?

Что значит Макрос #Номер#? Вместо чего нужно подставить номер (или ID в базе) проекта, к которому нужно перейти из письма?

"Росинская Лена" написал:

Не могли бы описать этот механизм подробнее?

Что значит Макрос #Номер#? Вместо чего нужно подставить номер (или ID в базе) проекта, к которому нужно перейти из письма?

1. Для примера: при выполнении всех задач по инциденту, необходимо оповестить ответственного, о том, что все работы выполнены. Для удобства просмотра инцидента Вы можете добавить ссылку на эту запись. (В теле письма номер инцидента будет ссылкой, кликнув на которую, программа Террасофт перейдет к записи инцидента, либо откроет её карточку)

пример

2. При настройке шаблонов сообщений в Террасофте Вы можете добавлять макросы из пользовательского запроса.
пример2
В нашем случае мы используем макрос Номер, который в тело письма вставится в формате #Номер#.
пример3
И для того, что бы при отправке письма номер отображаемого инцидента стал ссылкой необходимо заменить #Номер# на #[Link;%1:Номер;goto/Incident/%1:ID]#

видимо, надо изначально написать этот макрос, который в нужное место письма подставляет строку.

Пытаюсь просто вставить её в письмо - как ссылка не работает. Что я делаю не так? =)
И можно ли из кода при формировании письма вместо номера подставлять эту строку (чтобы работало как ссылка)?

Попыталась из кода отправить письмо со строкой
#[Link;%1:Номер;goto/Opportunities/%1:{ED24FAA0-13E3-423A-BBBF-9C61B58D7FE7}]#

Не воспринимается как ссылка.

Елена, здесь, вероятно, дело не в том, что Вы отправляете письмо из кода. Проверьте, верно ли создан шаблон сообщения, а именно:
- сформирован пользовательский запрос;
- шаблон сообщения создан с использованием пользовательского запроса;
- выполнен пункт 2 из ответа Дмитрия (http://www.community.terrasoft.ru/blogs/7544#comment-35998)

Спасибо, но всё-таки важно то, что письмо отправляется из кода следующим образом:

var Body = Body + FormatStr("Создал: %1\nДата создания: %2\n\nНазвание проекта: %3\nНаправление: %4\nТочка продаж: %5\nОтветственный: %6",
Author, DateStr, GetCorrectStringForSendEmail(Title), Direct, Department, Owner);
var Link = FormatStr("%1", OwnerID)
Link = '#[Link;%1:Номер;goto/Opportunities/%1:'+ Link+']#';
Body = Body+Link;

var SQL = "EXEC msdb.dbo.sp_send_dbmail @profile_name = '%1', ";
SQL += "@recipients = '%2', @body = '%3', @subject = '%4', @body_format = '%5'";
var body_format = 'HTML';
SQL = FormatStr(SQL, ProfileName, AddressStr, Body, Subject, body_format);
Connector.DBEngine.ExecuteCustomSQL(SQL, System.EmptyValue);

в формате html. Но текст #[Link;%1:Номер;goto/Opportunities/%1:'+ Link+']# всё так же не распознаётся как ссылка.

Скрипты, указанные в ответе Дмитрия, не используются (это видно по отладчику).

Елена,
при отправке писем через dbMail, с использованием Body_Format="HTML" следует использовать следующий формат ссылки:

<a href="terrasoft://open/Opportunities/' + CONVERT(NVARCHAR(250),@ID) + '">Перейти</a>

где
Open - операция открытия записи
Goto - переход к записи в реестре

@ID - ID Продажи (в Вашем случае).

Это то, что надо. Спасибо!

Вопрос в продолжение темы: можно ли настроить переход по ссылке к разделу, но так, чтобы фильтр был настроен на по ID записи, а по ContactID, к примеру?

"Росинская Лена" написал:

Вопрос в продолжение темы: можно ли настроить переход по ссылке к разделу, но так, чтобы фильтр был настроен на по ID записи, а по ContactID, к примеру?


Лена, все возможно с Террасофт :smile:
Вам необходимо будет переопределить метод: HyperlinkGotoWorkspace. То есть в существующий формат передачи ссылок добавить параметр, опредиляющий поле по которому необходимо осуществить фильтрацию.

terrasoft://goto/wnd_ХХХWorkspace/{b365C4C25-D782-4F14-89DA-1BB5C1D993CA}/ContactID - например.

А уже в самой функции распарсить сам параметр

	if (Params.length < 2) {
		return;
	}
	var Module = Params[0];
	var IDValue = Params[1].replace(/%7b/g, '{').replace(/%7d/, '}');	
// Опредиляем парамет из строки ссылки
	var FieldName = Params[2];

и уже соответственно обработать дальше

Спасибо за быстрый ответ!

И ещё один вопрос: можно ли сделать поле в датасете так, чтобы оно являлось ссылкой? Как в письме?

То есть, к примеру, в текстовом поле написать Перейти

так, чтобы это воспринималось как ссылка?

"Росинская Лена" написал:

Спасибо за быстрый ответ!

И ещё один вопрос: можно ли сделать поле в датасете так, чтобы оно являлось ссылкой? Как в письме?

То есть, к примеру, в текстовом поле написать Перейти

так, чтобы это воспринималось как ссылка?


Если речь идет о карточке, то я бы лучше сделал кнопку, при нажатии на которую, вычитывал данные из поля в котором указана сформирована ссылка, или же формировал её динамически.

К сожалению, речь идёт именно о гриде.

"Росинская Лена" написал:
можно ли сделать поле в датасете так, чтобы оно являлось ссылкой? Как в письме?

Если я верно понял, может, так?

Добрый день, подскажите пожалуйста как правильно сформировать BodyText, чтобы письмо в формате HTML отправлялось со ссылкой?
Я делаю так :

BodyText = 'Здравствуйте!/nВы добавлены в команду проекта: <a href="terrasoft://goto/Project/E9A312A0-4882-40DA-8DE7-05B1D45B4449/">Валютный проект</a>./n/nЭто сообщение сгенерировано автоматически. Пожалуйста, не отвечайте на него.'

На выходе получается следующее письмо:

Здравствуйте!
Вы добавлены в команду проекта: <a href="terrasoft://goto/Project/E9A312A0-4882-40DA-8DE7-05B1D45B4449/">Валютный проект</a>. 
 
Это сообщение сгенерировано автоматически. Пожалуйста, не отвечайте на него.

Валентин, проверьте, какой формат устанавливается?
Сам текст Вы формируете правильно, такое ощущение, что формат сообщения текстовый.

Вот полный вызов процедуры:

SendEmail({Address:  TeamSelectDataset.Values('eMail'), 
Subject: 'Вы добавлены в команду проекта!', BodyFormat: 2, 
HTMLBody: 'Здравствуйте!/nВы <b>добавлены</b> в команду проекта: <a href="terrasoft://goto/Project/E9A312A0-4882-40DA-8DE7-05B1D45B4449/">Валютный проект</a>./n/nЭто сообщение сгенерировано автоматически. Пожалуйста, не отвечайте на него.', 
AutoSend: true, SendImmediately: true});

Валентин, завтра проверю корректность формирования BodyText с учетом добавленной Вами процедуры вызова и сообщу результат.

Валентин, в функции CreateOutlookMessage скрипта scr_OutlookUtils замените блок кода

if (Params.HTMLBody) {
 Message.BodyFormat = 2;
 Message.Body = Params.HTMLBody;
			}

На:

if (Params.HTMLBody) {
 Message.BodyFormat = 2;
 Message.HTMLBody = Params.HTMLBody;
			}

Спасибо! Все получилось.

Показать все комментарии