Создание собственных сообщений в Microsoft Dynamics CRM

При возникновении необходимости расширения стандартного функционала Microsoft Dynamics 365, есть возможность создания собственных сообщений (событий) системы, на которые можно подписывать плагины. Рассмотрим полный процесс создания кнопки на риббоне, вызывающей наше событие, обрабатываемое плагином.

Заходим в решения проекта.

CRM Solutions
CRM Solutions

Выбираем созданное решение OMS.

Select CRM Solution
Select CRM Solution

Заходим во вкладку процессы и нажимаем кнопку «Создать».

Create Process
Create Process

Вводим название процесса, выбираем категорию «Действие» и сущность, с которой мы хотим связать сообщение и нажимаем кнопку «ОК».

Enter process name
Enter process name

В открывшимся окне настройки процесса можно указать аргументы сообщения. Создадим один выходной строковый параметр. Нажимаем кнопку «Сохранить и закрыть».

Enter process properties
Enter process properties

Теперь нам нужно в окне процессов решения выбираем созданный нами процесс нажимаем кнопку «Активировать», подтверждаем активацию и публикуем изменения.

Public process
Public process
Confirm Activation Process
Confirm Activation Process

Теперь нужно зарегистрировать плагин на созданное нами событие. Подробнее о создании и регистрации плагинов вы можете прочитать в статье Создание Plug-in для Microsoft Dynamic 365. Для этого воспользуемся утилитой Plugin Registration Tool. Зарегистрируем плагин и добавим новый шаг на созданное нами сообщение.

Register Plugin
Register Plugin

Теперь нам необходимо настроить создание сообщения в системе. Для этого нам нужно воспользоваться библиотекой process.js.

/// <reference path="../../lib/process_2_0.js"/>

function foo() {
    Process.callAction(
        "oms_CaseExtraBtnClick",
        [
            {
                key: "Target",
                type: Process.Type.EntityReference,
                value: new Process.EntityReference("oms_case", Xrm.Page.data.entity.getId())
            }
        ],
        function (params) {
            var result = params["Random"];
            alert(result);
        },
        function (error, trace) {
            alert(error);

            if (window.console && console.error) {
                console.error(error + "\n" + trace);
            }
        }
    );
}

Кроме того, создадим элементарный плагин, который будет реагировать на наше сообщение, генерировать случайное число и возвращать его в выходной параметр.

using System;
using Microsoft.Xrm.Sdk;

namespace Crm.Shvanov.OmsPlugin
{
    /// <summary>
    /// Данный плагин выполняет генерацию случайного числа.
    /// </summary>
    /// <remarks>
    /// Данный плагин регистрируется на сообщение oms_CaseExtraBtnClick, сущности oms_case, состояние pre-operation.
    /// </remarks>
    public class RandomPlugin : IPlugin
    {
       /// <summary>
       /// Метод Execute вызывается конвейером выполнения события при обработке запроса сообщения, для которого был зарегистрирован подключаемый модуль.
       /// </summary>
       /// <param name="serviceProvider">Контейнер для объектов обслуживания.</param>
       public void Execute(IServiceProvider serviceProvider)
       {
           // Получить контекст выполнения от поставщика услуг.
           IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

           // Получить сервис трассировки.
           ITracingService tracing = (ITracingService)serviceProvider.GetService(typeof(ITracingService));

           var rnd = new Random();
           var value = rnd.Next(0, 100).ToString();
           if (context.OutputParameters.Contains("Random"))
           {
                context.OutputParameters["Random"] = value;
           }
           else
           {
                context.OutputParameters.Add("Random", value);
           }

           tracing.Trace($"{nameof(RandomPlugin)}: Создано новое случайное число [{value}]");
       }
    }
}

Теперь нам осталось только создать кнопку на ленте-меню и привязать к ней скрипт генерации сообщения. Подробнее как это можно сделать можно прочитать в статье Добавление кнопки на меню-ленту (риббон) Microsoft Dynamic 365

Add Ribbon Command
Add Ribbon Command
Add Ribbon Button
Add Ribbon Button

В результате получаем следующее поведение:

Message Result
Message Result