Создать новую запись в разделе

Сложный

Реализация создания новой записи в разделе [Контакты] через стороннее приложение 

Пример. Создать консольное приложение, которое, используя класс InsertQuery, добавляет запись с колонками:

  • ФИО (Name) — "Иванов Иван Иванович".
  • Должность (Job) — "Разработчик".
  • Рабочий телефон (Phone) — "+12 345 678 00 00".

1. Создать и настроить проект консольного приложения C# 

  1. Используя среду разработки Microsoft Visual Studio (версии не ниже 2017), создайте проект консольного приложения Visual C#.

    Работа в Microsoft Visual Studio подробно описана в статье Разработать C# код в пользовательском проекте.

  2. Укажите в качестве названия проекта, например, DataServiceInsertExample.
  3. Свойству проекта Target framework установите значение ".NET Framework 4.7".
  4. В секцию References проекта добавьте зависимости от библиотек:
    • System.Web.Extensions.dll — библиотека классов, входящая в .NET Framework.
    • Terrasoft.Core.dll — библиотека основных классов серверного ядра приложения. Находится по пути ...\Terrasoft.WebApp\bin\Terrasoft.Core.dll.
    • Terrasoft.Nui.ServiceModel.dll — библиотека классов служб приложения. Находится по пути ...\Terrasoft.WebApp\bin\Terrasoft.Nui.ServiceModel.dll.
    • Terrasoft.Common.dll — библиотека основных классов серверного ядра приложения. Находится по пути ...\Terrasoft.WebApp\bin\Terrasoft.Common.dll.
  5. В файл исходного кода приложения добавьте директивы using.
    Добавление директив using
    using System;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Collections.Generic;
    using Terrasoft.Nui.ServiceModel.DataContract;
    using Terrasoft.Core.Entities;
    using System.Web.Script.Serialization;
    

2. Добавить объявление полей и констант 

Добавление полей и констант в исходный код приложения необходимо выполнить для доступа к возможностям сервиса работы с данными DataService.

Добавление объявления полей и констант
/* Основной URL приложения Creatio. Необходимо заменить на пользовательский. */
private const string baseUri = @"http://example.creatio.com";
/* Строка запроса к методу Login сервиса AuthService.svc. */
private const string authServiceUri = baseUri + @"/ServiceModel/AuthService.svc/Login";
/* Строка пути запроса InsertQuery. */
private const string insertQueryUri = baseUri + @"/0/DataService/json/reply/InsertQuery";
/* Cookie аутентификации Creatio. */
private static CookieContainer AuthCookie = new CookieContainer();

Здесь объявлены три строковых константных поля, с помощью которых формируются пути выполнения запросов на аутентификацию и запросов на чтение данных. Данные об аутентификации будут сохранены в поле AuthCookie.

3. Добавить метод, выполняющий аутентификацию 

Для доступа создаваемого приложения к сервису работы с данными DataService необходимо выполнить аутентификацию.

4. Реализовать запрос на добавление записи 

Поскольку объявленная ранее константа insertQueryUri содержит путь для отправки данных в формате JSON, то отправляемые данные необходимо предварительно сконфигурировать в виде строки, содержащей описание JSON-объекта, соответствующего контракту данных InsertQuery. Это можно сделать непосредственно в строчной переменной, однако намного удобнее и безопаснее с точки зрения возможности возникновения ошибок создать экземпляр класса InsertQuery, заполнить его свойства, а затем сериализовать его в строку.

Реализация запроса на добавление записи
/* Экземпляр класса запроса. */
var insertQuery = new InsertQuery()
{
    /* Название корневой схемы. */
    RootSchemaName = "Contact",
    /* Коллекция добавляемых значений колонок. */
    ColumnValues = new ColumnValues()
};
/* Экземпляр класса выражения запроса к схеме объекта.
Предназначен для конфигурирования колонки [ФИО]. */
var columnExpressionName = new ColumnExpression
{
    /* Тип выражения запроса к схеме объекта — параметр. */
    ExpressionType = EntitySchemaQueryExpressionType.Parameter,
    /* Параметр выражения запроса. */
    Parameter = new Parameter
    {
        /* Значение параметра. */
        Value = "Иванов Иван Иванович",
        /* Тип данных параметра — строка. */
        DataValueType = DataValueType.Text
    }
};

/* Экземпляр класса выражения запроса к схеме объекта.
Предназначен для конфигурирования колонки [Рабочий телефон]. */
var columnExpressionPhone = new ColumnExpression
{
    ExpressionType = EntitySchemaQueryExpressionType.Parameter,
    Parameter = new Parameter
    {
        Value = "+12 345 678 00 00",
        DataValueType = DataValueType.Text
    }
};
/* Экземпляр класса выражения запроса к схеме объекта.
Предназначен для конфигурирования колонки [Должность]. */
var columnExpressionJob = new ColumnExpression
{
    ExpressionType = EntitySchemaQueryExpressionType.Parameter,
    Parameter = new Parameter
    {
        /* GUID записи "Разработчик" системного справочника [Должность].
        Необходимо заменить на GUID записи в приложении bpm'online пользователя. */
        Value = "11D68189-CED6-DF11-9B2A-001D60E938C6",
        /* Тип данных параметра — уникальный идентификатор. */
        DataValueType = DataValueType.Guid
    }
};
/* Инициализация коллекции колонок запроса. */
insertQuery.ColumnValues.Items = new Dictionary<string, ColumnExpression>();
/* Добавление выражений запроса в коллекцию добавляемых колонок.
Колонка [ФИО]. */
insertQuery.ColumnValues.Items.Add("Name", columnExpressionName);
/* Колонка [Рабочий телефон]. */
insertQuery.ColumnValues.Items.Add("Phone", columnExpressionPhone);
/* Колонка [Должность]. */
insertQuery.ColumnValues.Items.Add("Job", columnExpressionJob);
/* Сериализация экземпляра класса запроса на добавление в JSON-строку. */
var json = new JavaScriptSerializer().Serialize(insertQuery);

5. Выполнить POST-запрос к DataService 

  1. Создайте экземпляр класса HttpWebRequest.
  2. Заполните свойства экземпляра.
  3. Присоедините к запросу созданную ранее строку с JSON-объектом.
  4. Выполните и обработайте результат запроса к сервису работы с данными DataService.
    Реализация POST-запроса
    /* Преобразование строки JSON-объекта в массив байтов. */
    byte[] jsonArray = Encoding.UTF8.GetBytes(json);
    /* Создание экземпляра HTTP-запроса. */
    var insertRequest = HttpWebRequest.Create(insertQueryUri) as HttpWebRequest;
    /* Определение метода запроса. */
    insertRequest.Method = "POST";
    /* Определение типа содержимого запроса. */
    insertRequest.ContentType = "application/json";
    /* Добавление полученных ранее аутентификационных cookie в запрос на получение данных. */
    insertRequest.CookieContainer = AuthCookie;
    /* Установить длину содержимого запроса. */
    insertRequest.ContentLength = jsonArray.Length;
    
    /* Добавление CSRF токена в заголовок запроса. */
    CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));
    string csrfToken = cookieCollection["BPMCSRF"].Value;
    insertRequest.Headers.Add("BPMCSRF", csrfToken);
    
    /* Помещение в содержимое запроса JSON-объекта. */
    using (var requestStream = insertRequest.GetRequestStream())
    {
        requestStream.Write(jsonArray, 0, jsonArray.Length);
    }
    /* Выполнение HTTP-запроса и получение ответа от сервера. */
    using (var response = (HttpWebResponse)insertRequest.GetResponse())
    {
        /* Вывод ответа в консоль. */
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            Console.WriteLine(reader.ReadToEnd());
        }
    }
    

Реализация создания новой записи в разделе [Контакты] через Creatio IDE 

Пример. Добавить кнопку в раздел Контакты (Contacts). При нажатии на кнопку вызывать метод, который, используя класс InsertQuery, добавляет запись с колонками:

  • ФИО (Name) — "Иванов Иван Иванович".
  • Должность (Job) — "Разработчик".
  • Рабочий телефон (Phone) — "+12 345 678 00 00".

1. Добавить кнопку в раздел Контакты 

  1. Cоздайте пакет и установите его в качестве текущего.
  2. Создайте схему замещающей модели представления раздела Контакты (Contacts).
  3. На панели дизайнера нажмите кнопку и создайте локализуемую строку.

    Для созданной строки установите:

    • Код (Code) — "InsertQueryContactButtonCaption".
    • Значение (Value) — "Добавить контакт" ("Add contact").
  4. В массив diff добавьте конфигурационный объект с настройками расположения кнопки на странице.
    diff
    diff: /**SCHEMA_DIFF*/[
        /* Метаданные для добавления в раздел пользовательской кнопки. */
        {
            /* Выполняется операция добавления элемента на страницу. */
            "operation": "insert",
            /* Название родительского элемента управления, в который добавляется кнопка. */
            "parentName": "ActionButtonsContainer",
            /* Кнопка добавляется в коллекцию элементов управления родительского элемента (мета-имя которого указано в parentName). */
            "propertyName": "items",
            /* Мета-имя добавляемой кнопки. */
            "name": "InsertQueryContactButton",
            /* Дополнительные свойства элемента. */
            "values": {
                /* Тип добавляемого элемента — кнопка. */
                itemType: Terrasoft.ViewItemType.BUTTON,
                /* Привязка заголовка кнопки к локализуемой строке схемы. */
                caption: { bindTo: "Resources.Strings.InsertQueryContactButtonCaption" },
                /* Привязка метода-обработчика нажатия кнопки. */
                click: { bindTo: "onInsertQueryContactClick" },
                "layout": {
                    "column": 1,
                    "row": 6,
                    "colSpan": 1
                }
            }
        }
    ]/**SCHEMA_DIFF*/
    

2. Добавить метод-обработчик события нажатия кнопки 

Чтобы при нажатии на созданную в разделе Контакты (Contacts) кнопку добавлялась запись с заданными параметрами, в секцию methods замещающей схемы модели представления добавьте метод-обработчик события нажатия кнопки onInsertQueryContactClick.

methods
methods: {
    /* Метод-обработчик нажатия кнопки. */
    onInsertQueryContactClick: function() {
        /* Создание экземпляра класса Terrasoft.InsertQuery. */
        var insert = Ext.create("Terrasoft.InsertQuery", {
            /* Название корневой схемы. */
            rootSchemaName: "Contact"
        });
        /* Установка значений-параметров Terrasoft.ParameterExpression.
        Создается экземпляр значения-параметра и добавляется в коллекцию значений колонок.
        Создание экземпляра значения-параметра для колонки [ФИО]. */
        insert.setParameterValue("Name", "Иванов Иван Иванович", Terrasoft.DataValueType.TEXT);
        /* Создание экземпляра значения-параметра для колонки [Рабочий телефон]. */
        insert.setParameterValue("Phone", "+12 345 678 00 00", Terrasoft.DataValueType.TEXT);
        /* Создание экземпляра значения-параметра для колонки [Должность]. */
        insert.setParameterValue("Job", "11D68189-CED6-DF11-9B2A-001D60E938C6", Terrasoft.DataValueType.GUID);
        /* Запрос к серверу на обновление данных. */
        insert.execute(function(response) {
            /* Вывод ответа от сервера в консоль браузера. */
            window.console.log(response);
        });
        /* Обновление данных реестра. */
        this.reloadGridData();
    }
}

Реализация класса InsertQuery для front-end части ядра приложения отличается от реализации класса InsertQuery для back-end части. Так, для создания параметров предусмотрен метод setParameterValue, а для выполнения запроса — метод execute. Узнать о свойствах и методах класса InsertQuery, реализованного в front-end части ядра приложения, можно в Библиотеке JS классов.

Результат выполнения примера 

После сохранения схемы и обновления страницы приложения с очисткой кэша в разделе Контакты (Contacts) появится кнопка Добавить контакт (Add contact). Кнопка добавляет контакт с заданными параметрами.