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

Объектная модель для смарт-тегов разделяет смарт-теги и действия, которые они выполняют. Это позволяет довольно гибко определять на что будет реагировать смарт-тег, и какое действие (действия) могут быть выполнены с распознанным тегом текстом.
Смарт-теги состоят из двух основных элементов:
- распознаватель (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 последовательность действий такова: в меню "Сервис" выбрать пункт "Параметры", на вкладке "Орфография" - кнопка "Орфография и автозамена":

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

Также возможно потребуется перезапустить ВСЕ активные приложения 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
{
///
/// Смарт-тэг для обработки номеров обращений CRM.
///
[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
{
///
/// Базовый абстрактный класс для смарт-тэгов CRM.
///
[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);
///
/// 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.
///
///
///
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).
ВНИМАНИЕ: не забудьте подписать полученную сборку!
Теперь осталось только зарегистрировать даный компонент, а регистрация, пожалуй, самый сложный этап создания смарт-тега. Состоит из двух шагов:
- Регистрация COM-объекта с реализацией действий наших смарт-тегов.
- Регистрация обработчика действий в Microsoft Office - через создание соответствующих ключей в реестре.
Более подробно про регистрацию можно прочитать в материалах, ссылки на которые приведены в конце статьи.
Для себя же я решил проблему регистрации сборок смарт-тегов через создание инсталлятора. Вот три основных момента:
Регистрация COM

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

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

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



Дополнительные ссылки:
Комментарии
Гость (не проверено)
10.08.2013 17:15
Permalink
Помощь
Здравствуйте, если бы Вы относительно смарт тегов в Ворд 2003 могли пояснить я бы оплатил потраченное время на меня
Vladislav Osmanov
08.10.2013 13:18
Permalink
Добрый день. В чём конкретно
Добрый день. В чём конкретно вопрос (если ещё актуально)?
Добавить комментарий