Использование механизма Smart Tag для интеграции приложений Microsoft Office с CRM

Уникальные номера заказов, обращений и счетов очень мощный инструмент в Microsoft Dynamics CRM, которым просто необходимо пользоваться. Сейчас расскажу как с помощью небольшой разработки можно значительно улучшить взаимодействие офисных приложений с CRM, а, следовательно, повысить производительность работы с ними.

Для обработки информации и интеграции с внешними приложениями в Microsoft Office предусмотрен механизм смарт-тегов. Вы, возможно, не раз их видели, но не придавали особого значения. А ведь можно сделать так:

Пример smart tag в Microsoft Outlook

Объектная модель для смарт-тегов разделяет смарт-теги и действия, которые они выполняют. Это позволяет довольно гибко определять на что будет реагировать смарт-тег, и какое действие (действия) могут быть выполнены с распознанным тегом текстом.

Смарт-теги состоят из двух основных элементов:

  • распознаватель (recognizer) - отвечает за распознавание текстового фрагмента, ассоциированного с данным типом;
  • действие (action), которое будет выполнено при активизации смарт-тега (действий можно зарегистрировать несколько).

Простейший смарт-тег можно реализовать определив и распознаватель и действие в XML-файле:


<?xml version="1.0" encoding="utf-8" ?>
<FL:smarttaglist xmlns:FL="urn:schemas-microsoft-com:smarttags:list">
<FL:name>Simple smart-tag test</FL:name>
<FL:lcid>1049</FL:lcid>
<FL:description>Simple smart-tag test (all-in-one-XML)</FL:description>
<FL:moreinfourl>http://contoso.com/tag-info</FL:moreinfourl>
<FL:smarttag type="urn:your-company-com/smrttg#simpletest">
<FL:caption>Simple smart-tag test</FL:caption>
<FL:terms>
<FL:termlist>microsoft, dynamics, crm, office, outlook, word, excel</FL:termlist>
</FL:terms>
<FL:actions>
<FL:action id="GSearch">
<FL:caption>Search in &Google</FL:caption>
<FL:url>http://www.google.ru/search?q={TEXT}</FL:url>
</FL:action>
<FL:action id="YaSearch">
<FL:caption>Search in &Yandex</FL:caption>
<FL:url>http://yandex.ru/yandsearch?text={TEXT}</FL:url>
</FL:action>
<FL:action id="MyWcfHandler">
<FL:caption>Handle with &WCF-service</FL:caption>
<FL:url>http://intranet/handle/{TEXT}</FL:url>
</FL:action>
</FL:actions>
</FL:smarttag>
</FL:smarttaglist>

Скопировав файл с таким XML в директорию "C:\Program Files\Common Files\Microsoft Shared\Smart Tag\Lists" (предварительно закрыв все открытые приложения из состава Microsoft Office) можно начинать пользоваться смарт-тегом. В данном примере, распознаватель реагирует на одно из слов, перечисленных в теге "FL:termlist" через запятую. Для большей гибкости можно задать регулярное выражение - именно так мы и поступим при создании компонента смарт-тега для Micrisoft Dynamics CRM.

ВНИМАНИЕ: если вы создали и развернули компонент-смарт-тег, но в приложениях MS Office он себя никак не обозначает, скорее всего требуется влючить отображение сторонних смарт-тегов в настройках офиса. Для Outlook последовательность действий такова: в меню "Сервис" выбрать пункт "Параметры", на вкладке "Орфография" - кнопка "Орфография и автозамена":

Натсройки Outlook: Орфография и автозамена

затем в разделе "Правописание" - кнопка "Параметры автозамены", где в окне "Автозамена" на вкладке "Смарт-теги" выбрать опцию "Добавить смарт-теги к тексту" и отметить ваши смарт-теги:

Натройки Outlook: Параметры автозамены

Также возможно потребуется перезапустить ВСЕ активные приложения Microsoft Office (Word, Excel, Outlook...).

Итак, создаём распознаватели для нашего компонента:

CrmCaseSmartTagRecognizer.xml


<?xml version="1.0" encoding="utf-8" ?>
<FL:smarttaglist xmlns:FL="urn:schemas-microsoft-com:smarttags:list">
<FL:name>CRM: Распознователь номеров обращений CRM</FL:name>
<FL:description>Распознаёт номера обращений CRM, предлагает открыть соответствующую карточку обращения.</FL:description>
<FL:lcid>1049</FL:lcid>
<FL:smarttag type="urn:schemas-contoso-ru/crm#case">
<FL:caption>Номер обращения CRM</FL:caption>
<FL:re>
<FL:exp>
(CAS-\d{5}-\w{6})
</FL:exp>
</FL:re>
</FL:smarttag>
</FL:smarttaglist>

и CrmOrderSmartTagRecognizer.xml


<?xml version="1.0" encoding="utf-8" ?>
<FL:smarttaglist xmlns:FL="urn:schemas-microsoft-com:smarttags:list">
<FL:name>CRM: Распознователь номеров заказов CRM</FL:name>
<FL:description>Распознаёт номера заказов CRM, предлагает открыть соответствующую карточку заказа.</FL:description>
<FL:lcid>1049</FL:lcid>
<FL:smarttag type="urn:schemas-contoso-ru/crm#order">
<FL:caption>Номер заказа CRM</FL:caption>
<FL:re>
<FL:exp>
(ORD-\d{5}-\w{6})
</FL:exp>
</FL:re>
</FL:smarttag>
</FL:smarttaglist>

Помещаем эти файлы "C:\Program Files\Common Files\Microsoft Shared\Smart Tag\Lists\1049":

Размещение файлов-распознавателей

Интересно, что в данной реализации распознавателей нет описания действий - мы их реализуем в дополнительном компоненте. Также прошу обратить внимание на регулярные выражения - они соответствуют стандартным маскам номеров для Обращений и Заказов в CRM.

Теперь код компонента, реализующего действия данного смарт-тега (поиск в CRM обращений/заказов по их номерам). В данном случае, это COM-объекты:


using System;
using System.Text;
using System.Runtime.InteropServices;

namespace Contoso.Crm.OfficeSmartTags
{
/// <summary>
/// Смарт-тэг для обработки номеров обращений CRM.
/// </summary>
[ProgId("Contoso.Crm.Office.SmartTag.Case.Actions")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[Guid("AEF4C5ED-C78A-438e-A420-DBEF7679BC26")]
[ComVisible(true)]
public class CrmCaseSmartTagAction : CrmSmartTagAction
{
protected override string TAG_NAME
{
get
{
return "urn:schemas-contoso-ru/crm#case";
}
}

public override void InvokeVerb(int VerbID, string ApplicationName, object Target, Microsoft.Office.Interop.SmartTag.ISmartTagProperties Properties, string Text, string Xml)
{
string crmCaseFormUrl =
"http://crm/contoso/cs/cases/edit.aspx?id={0}#";

// ищем GUID заказа по номеру заказа
string caseId = _crmAdapter.LookupCaseId(Text);

if (String.IsNullOrEmpty(caseId))
{
System.Windows.Forms.MessageBox.Show(
String.Format("Обращение с номером '{0}' не найдено!", Text));
}
else
{
System.Diagnostics.Process.Start(
String.Format(crmCaseFormUrl, caseId));
}
}

public override string ProgId
{
get
{
return "Contoso.Crm.Office.SmartTag.Case.Actions";
}
}

public override string get_Desc(int LocaleID)
{
return "Распознаёт номера обращений CRM, предлагает открыть соответствующую карточку обращения.";
}

public override string get_Name(int LocaleID)
{
return "CRM: Распознователь номеров обращений CRM";
}

public override string get_SmartTagCaption(int SmartTagID, int LocaleID)
{
return "Номер обращения CRM";
}

public override string get_VerbCaptionFromID(int VerbID, string ApplicationName, int LocaleID)
{
return "Открыть обращение CRM";
}

public override string get_VerbNameFromID(int VerbID)
{
return "Открыть обращение CRM";
}
}
}

Базовый класс CrmSmartTagAction определён следующим образом:


using System;
using System.Text;
using Microsoft.Office.Interop.SmartTag;
using OfficeSmartTagSample;
using System.Runtime.InteropServices;

namespace Contoso.Crm.OfficeSmartTags
{
/// <summary>
/// Базовый абстрактный класс для смарт-тэгов CRM.
/// </summary>
[ComVisible(false)]
public abstract class CrmSmartTagAction : ISmartTagAction
{
protected abstract string TAG_NAME
{
get;
}

protected CrmAdapter _crmAdapter = new CrmAdapter();

#region ISmartTagAction Members

public abstract void InvokeVerb(
int VerbID,
string ApplicationName,
object Target,
ISmartTagProperties Properties,
string Text,
string Xml);

public abstract string ProgId
{
get;
}

public int SmartTagCount
{
get
{
// Specify the number of smart tag types this recognizer supports.
return 1;
}
}

public abstract string get_Desc(int LocaleID);

public abstract string get_Name(int LocaleID);

public abstract string get_SmartTagCaption(int SmartTagID, int LocaleID);

/// <summary>
/// The most important aspect of this class is the implementation of the read-only
/// property SmartTagName.
/// This property evaluates to "urn:schemas-contoso-ru/crm#order" which is identical
/// to the namespace definition in the XML recognizer.
/// It provides the link between this Action class and the regular expression recognizer.
/// </summary>
/// <param name="SmartTagID"></param>
/// <returns></returns>
public string get_SmartTagName(int SmartTagID)
{
return TAG_NAME;
}

public abstract string get_VerbCaptionFromID(int VerbID, string ApplicationName, int LocaleID);

public int get_VerbCount(string SmartTagName)
{
return 1;
}

public int get_VerbID(string SmartTagName, int VerbIndex)
{
return 1;
}

public abstract string get_VerbNameFromID(int VerbID);

#endregion
}
}

Класс для обработки заказов аналогичен CrmCaseSmartTagAction, и отличается только возвращаемой строкой с путём к найденному заказу (см. CRM SDK: URL Addressable Forms and Views).

ВНИМАНИЕ: не забудьте подписать полученную сборку!

Теперь осталось только зарегистрировать даный компонент, а регистрация, пожалуй, самый сложный этап создания смарт-тега. Состоит из двух шагов:

  1. Регистрация COM-объекта с реализацией действий наших смарт-тегов.
  2. Регистрация обработчика действий в Microsoft Office - через создание соответствующих ключей в реестре.

Более подробно про регистрацию можно прочитать в материалах, ссылки на которые приведены в конце статьи.

Для себя же я решил проблему регистрации сборок смарт-тегов через создание инсталлятора. Вот три основных момента:

Регистрация COM

Инсталлятор: регистрация COM-объекта для смарт-тега

Копирование XML с распознавателями

Инсталлятор: копирование распознавателей смарт-тега

Создание в реестре соответствующих ключей

Инсталлятор: регистрация в реестре смарт-тега

 

Вот, пожалуй, и всё. После успешной регистрации и включения смарт-тегов в параметрах приложений Microsoft Office номера обращений и заказов станут распознаваться в этих приложениях:

Смарт-тег в Outlook

Смарт-тег в Word

Смарт-тег в Excel

 

Дополнительные ссылки:

Ваша оценка: Пусто Средняя: 4.8 (35 votes)

Комментарии

Помощь

Здравствуйте, если бы Вы относительно смарт тегов в Ворд 2003 могли пояснить я бы оплатил потраченное время на меня

Добрый день. В чём конкретно

Добрый день. В чём конкретно вопрос (если ещё актуально)?

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.
  • Syntax highlight code surrounded by the {syntaxhighlighter SPEC}...{/syntaxhighlighter} tags, where SPEC is a Syntaxhighlighter options string or "class="OPTIONS" title="the title".

Подробнее о форматировании

Image CAPTCHA
Enter the characters shown in the image.
Работает на Drupal, система с открытым исходным кодом.