Использование механизма 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
{
    /// 
    /// Смарт-тэг для обработки номеров обращений 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).

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

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

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

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

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

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

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

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

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

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

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

 

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

Смарт-тег в Outlook

Смарт-тег в Word

Смарт-тег в Excel

 

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

Русский
field_vote: 
4.77143
Average: 4.8 (35 votes)

Комментарии

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

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

Добавить комментарий