Creatio development guide
PDF
Это документация Creatio версии 7.16.0. Мы рекомендуем использовать новую версию документации.

Создание пользовательского макроса в отчетах MS Word

Glossary Item Box

Общие сведения

Раздел [Настройка отчетов] ([Report setup]) позволяет пользователям создавать отчеты MS Word средствами Creatio и выполнять их настройку с помощью плагина Creatio MS Word Report Designer. Создание и настройка отчетов MS Word описаны в статье "Настройка отчетов MS Word".

Общий порядок действий при создании отчета MS Word с использованием пользовательских макросов:

  1. Установите плагин Creatio MS Word Report Designer (выполняется однократно), как описано в статье "Установка плагина Creatio для MS Word".
  2. Добавьте запись отчета в разделе [Настройка отчетов] ([Report setup]).
  3. Настройте параметры отображения отчета.
  4. Реализуйте пользовательские макросы.
  5. Настройте поля и таблицы отчета.
  6. В плагине Creatio MS Word Report Designer настройте внешний вид отчета, а затем загрузите настроенный шаблон отчета в Creatio.

Особенности работы с макросами

Для настройки дополнительных возможностей выведения данных из Creatio в отчет MS Word необходимо использовать макросы. Можно использовать как базовые макросы, так и создавать пользовательские. Пользовательские макросы необходимо использовать для реализации нестандартных задач по настройке отчетов MS Word. Макрос для настройки отчета MS Word представляет собой класс, реализующий интерфейс IExpressionConverter (см. схему ExpressionConverterHelper пакета NUI).

Чтобы вызвать пользовательский макрос из шаблона отчета, макрос должен быть отмечен атрибутом ExpressionConverterAttribute с указанием имени макроса. Например:

[ExpressionConverterAttribute("CurrentUser")]

В классе должен быть реализован метод интерфейса Evaluate(object value, string arguments = ""). Метод в качестве аргумента принимает значение поля из шаблона отчета MS Word и возвращает значение типа string, которое будет подставлено на место этого поля в готовом отчете.

Общий порядок действий при создании пользовательского макроса отчета MS Word:

  1. Создайте отчет в разделе [Настройка отчетов] ([Report setup]).
  2. Настройте параметры отображения отчета.
  3. Настройте поля и таблицы отчета.
  4. Добавьте в список колонок отчета колонку [Id], которая будет являться входящим параметром для пользовательского макроса.
  5. В пользовательский пакет добавьте схему типа [Исходный код] ([Source Code]), в которой реализуйте класс-наследник интерфейса IExpressionConverter. Класс необходимо отметить атрибутом ExpressionConverterAttribute с именем макроса, а также реализовать в нем метод Evaluate(object value, string arguments = "").
  6. Опубликуйте схему типа [Исходный код] ([Source Code]).
  7. При настройке полей к колонке [Id] добавьте тег с именем пользовательского макроса в формате [#ИмяМакроса#].

Описание примера

Создать для страницы редактирования раздела [Контрагенты] ([Accounts]) отчет "Account Summary", который отображает следующую информацию о контрагенте:

  • [Название] ([Name]);
  • [Тип] ([Type]);
  • [Основной контакт] ([Primary contact]);
  • [Дополнительная информация] ([Additional info]). Для контрагентов типа [Клиент] ([Customer]) должен отображаться годовой оборот, а для контрагентов типа [Партнер] ([Partner]) — количество сотрудников.

Отчет должен содержать информацию о дате его формирования и имени сотрудника, который его сформировал.

Исходный код

Пакет с реализацией примера можно скачать по ссылке.

Алгоритм реализации примера

1. Создайте новый отчет

Для создания нового отчета выполните следующие действия:

  1. Перейдите в дизайнер системы по кнопке . В блоке [Настройка системы] перейдите по ссылке [Настройка отчетов] ([Report setup]).
  2. Выполните действие [Добавить отчет] —>[MS Word] ([New report] —>[MS Word]) (рис. 1).

Рис. 1. — Реестр раздела [Настройка отчетов] ([Report setup])

2. Выполните настройку параметров отображения отчета

Установите следующие значения (рис. 3) в области настройки параметров отображения отчета (рис. 2, 2):

  • [Название отчета] ([Report title]) — "Account Summary".
  • [Раздел] ([Section]) — "Accounts (Контрагенты)".
  • [Отображать в разделе] ([Show in the section list view]).
  • [Отображать на странице записи] ([Show in the section record page]).

Рис. 2. — Страница настройки отчета MS Word

Рис. 3. — Настройка параметров отображения отчета

3. Реализуйте пользовательские макросы

В разделе [Конфигурация] ([Configuration]) пользовательского пакета на вкладке [Схемы] ([Schemas]) выполните действие [Добавить] —> [Исходный код] ([Add] —> [Source Code]) (рис. 4). Процесс создания схемы типа [Исходный код] ([Source Code]) описан в статье "Создание схемы [Исходный код]".

Рис. 4. — Добавление схемы типа [Исходный код] ([Source Code])

Для создаваемой схемы объекта установите (рис. 5):

  • [Заголовок] ([Title]) — "AccountInfoByTypeConverter";
  • [Название] ([Name]) — "UsrAccountInfoByTypeConverter".

Рис. 5. — Настройка схемы объекта типа [Исходный код] ([Source Code])

Реализуйте класс макроса для получения дополнительной информации в зависимости от типа контрагента. Полностью исходный код представлен ниже.

namespace Terrasoft.Configuration
{
    using System;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Web;
    using Terrasoft.Common;
    using Terrasoft.Core;
    using Terrasoft.Core.DB;
    using Terrasoft.Core.Entities;
    using Terrasoft.Core.Packages;
    using Terrasoft.Core.Factories;

    // Атрибут с именем макроса [AccountInfoByType].
    [ExpressionConverterAttribute("AccountInfoByType")]
    // Класс должен реализовывать интерфейс IExpressionConverter.
    class AccountInfoByTypeConverter : IExpressionConverter
    {
        private UserConnection _userConnection;
        private string _customerAdditional;
        private string _partnerAdditional;
        // Вызов значений локализуемых строк
        private void SetResources() {
            string sourceCodeName = "UsrAccountInfoByTypeConverter";
            _customerAdditional = new LocalizableString(_userConnection.ResourceStorage, sourceCodeName,
                "LocalizableStrings.CustomerAdditional.Value");
            _partnerAdditional =  new LocalizableString(_userConnection.ResourceStorage, sourceCodeName,
                "LocalizableStrings.PartnerAdditional.Value");
        }
        // Реализация метода Evaluate интерфейса IExpressionConverter.
        public string Evaluate(object value, string arguments = "")
        {
            try
            {
                _userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
                Guid accountId = new Guid(value.ToString());
                return getAccountInfo(accountId);
            }
            catch (Exception err)
            {
                return err.Message;
            }
        }
        // Метод получения дополнительной информации в зависимости от типа контрагента.
        // В качестве входящего параметра Id контрагента.
        private string getAccountInfo(Guid accountId)
        {
            SetResources();
            try
            {
                // Создание объекта класса EntitySchemaQuery с корневой схемой [Account].
                EntitySchemaQuery esq = new EntitySchemaQuery(_userConnection.EntitySchemaManager, "Account");
                // Добавление в схему колонки [Name] из справочного поля [Type].
                var columnType = esq.AddColumn("Type.Name").Name;
                // Добавление в схему колонки [Name] из справочного поля [EmployeesNumber].
                var columnNumber = esq.AddColumn("EmployeesNumber.Name").Name;
                // Добавление в схему колонки [Name] из справочного поля [AnnualRevenue].
                var columnRevenue = esq.AddColumn("AnnualRevenue.Name").Name;
                // Записи фильтруются по Id контрагента.
                var accountFilter = esq.CreateFilterWithParameters(
                    FilterComparisonType.Equal,
                    "Id",
                    accountId
                );
                esq.Filters.Add(accountFilter);
                // Получение коллекции сущностей.
                EntityCollection entities = esq.GetEntityCollection(_userConnection);
                // Если коллекция содержит элементы, то в зависимости от типа контрагента
                // метод возвращает соответствующую информацию.
                if (entities.Count > 0)
                {
                    Entity entity = entities[0];
                    var type = entity.GetTypedColumnValue<string>(columnType);
                    switch (type)
                    {
                        case "Customer":
                            return String.Format(_customerAdditional, entity.GetTypedColumnValue<string>(columnRevenue));
                        case "Partner":
                            return String.Format(_partnerAdditional, entity.GetTypedColumnValue<string>(columnNumber));
                        default:
                            return String.Empty;
                    }
                }
                return String.Empty;
            }
            catch (Exception err)
            {
                throw err;
            }
        }
    }
}

Присвойте локализуемым строкам отчета следующие значения (табл. 1):

Табл. 1. — Настройка локализованных строк

Name English (United States) Русский (Россия)
PartnerAdditional Number of employees {0} persons Количество сотрудников {0} чел.
CustomerAdditional Annual turnover {0} Годовой оборот {0}

Больше о работе с локализуемыми строками в статье "Дизайнер исходного кода".

После внесения изменений сохраните и опубликуйте схему.

В разделе [Конфигурация] ([Configuration]) пользовательского пакета на вкладке [Схемы] ([Schemas]) выполните действие [Добавить] —> [Исходный код] ([Add] —> [Source Code]) (рис. 4). Процесс создания схемы типа [Исходный код] ([Source Code]) описан в статье "Создание схемы [Исходный код]".

Для создаваемой схемы объекта установите (рис. 6):

  • [Заголовок] ([Title]) — "CurrentDateConverter";
  • [Название] ([Name]) — "UsrCurrentDateConverter".

Рис. 6. — Настройка схемы объекта типа [Исходный код] ([Source Code])

Реализуйте класс макроса для получения текущей даты. Полностью исходный код представлен ниже.

namespace Terrasoft.Configuration
{
    using System;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Web;
    using Terrasoft.Common;
    using Terrasoft.Core;
    using Terrasoft.Core.DB;
    using Terrasoft.Core.Entities;
    using Terrasoft.Core.Packages;
    using Terrasoft.Core.Factories;

    // Атрибут с именем макроса [CurrentDate].
    [ExpressionConverterAttribute("CurrentDate")]
    // Класс должен реализовывать интерфейс IExpressionConverter.
    class CurrentDateConverter : IExpressionConverter
    {
        private UserConnection _userConnection;

        // Реализация метода Evaluate интерфейса IExpressionConverter.
        public string Evaluate(object value, string arguments = "")
        {
            try
            {
                _userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
                // Метод возвращает текущую дату.
                return _userConnection.CurrentUser.GetCurrentDateTime().Date.ToString("dd MMM yyyy");
            }
            catch (Exception err)
            {
                return err.Message;
            }
        }
    }
}

После внесения изменений сохраните и опубликуйте схему.

В разделе [Конфигурация] ([Configuration]) пользовательского пакета на вкладке [Схемы] ([Schemas]) выполните действие [Добавить] —> [Исходный код] ([Add] —> [Source Code]) (рис. 4). Процесс создания схемы типа [Исходный код] ([Source Code]) описан в статье "Создание схемы [Исходный код]".

Для создаваемой схемы объекта установите (рис. 7):

  • [Заголовок] ([Title]) — "CurrentUserConverter";
  • [Название] ([Name]) — "UsrCurrentUserConverter".

Рис. 7. — Настройка схемы объекта типа [Исходный код] ([Source Code])

Реализуйте класс макроса для получения текущего пользователя. Полностью исходный код представлен ниже.

namespace Terrasoft.Configuration
{
    using System;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Web;
    using Terrasoft.Common;
    using Terrasoft.Core;
    using Terrasoft.Core.DB;
    using Terrasoft.Core.Entities;
    using Terrasoft.Core.Packages;
    using Terrasoft.Core.Factories;

    // Атрибут с именем макроса [CurrentUser].
    [ExpressionConverterAttribute("CurrentUser")]
    // Класс должен реализовывать интерфейс IExpressionConverter.
    class CurrentUserConverter : IExpressionConverter
    {
        private UserConnection _userConnection;
        // Реализация метода Evaluate интерфейса IExpressionConverter.
        public string Evaluate(object value, string arguments = "")
        {
            try
            {
                _userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
                // Метод возвращает контакт текущего пользователя.
                return _userConnection.CurrentUser.ContactName;
            }
            catch (Exception err)
            {
                return err.Message;
            }
        }
    }
}

После внесения изменений сохраните и опубликуйте схему.

4. Настройте поля отчета

В блоке [Настройте поля отчета] ([Set up report data]) рабочей области страницы (рис. 2, 5) настройте поля, значения которых необходимо отображать в отчете. Для этого нажмите и в выпадающем списке [Колонка] ([Column]) выберите колонку [Id] (рис. 8). Текущая колонка [Id] в дальнейшем будет использована для пользовательского макроса получения текущей даты.

Входящим параметром для пользовательского макроса является колонка [Id].

Рис. 8. — Выбор колонки

Нажмите [Выбрать] ([Select]).

Аналогично добавьте в шаблон колонки [Id] (колонка в дальнейшем будет использована для пользовательского макроса получения контакта текущего пользователя), [Название] ([Name]), [Тип] ([Type]), [Основной контакт] ([Primary contact]), [Id] (колонка в дальнейшем будет использована для пользовательского макроса получения дополнительной информации в зависимости от типа контрагента).

Перечень колонок после добавления представлен ниже (рис. 9).

Рис. 9. — Перечень добавленных колонок

5. Добавьте теги пользовательских макросов к именам колонок

Схему типа [Исходный код] ([Source Code]), в которой реализован пользовательский макрос, необходимо опубликовать, а затем добавить имя макроса в шаблон. Если обновить страницу в системе, то макрос печататься не будет.

Измените свойство колонки [Id] объекта [Контрагент] ([Account]). Для этого выполните следующие действия:

  1. В блоке [Настройте поля отчета] ([Set up report data]) рабочей области страницы (рис. 2, 5) дважды кликните по имени колонки [Id] или нажмите в строке названия колонки.
  2. Измените значение [Id] поля [Заголовок] ([Title]) на [Id[#CurrentDate#]] (рис. 10), где [#CurrentDate#] — тег пользовательского макроса для получения текущей даты.

    Рис. 10. — Настройка свойства колонки

    Нажмите [Сохранить] ([Save]).

Аналогично к имени остальных колонок [Id] добавьте следующие теги пользовательских макросов:

  • [#CurrentUser#] для получения контакта текущего пользователя.

  • [#AccountInfoByType#] для получения дополнительной информации в зависимости от типа контрагента.

Перечень колонок после добавления тегов пользовательских макросов представлен ниже (рис. 11).

Рис. 11. — Перечень добавленных колонок с макросами

Нажмите [Сохранить] ([Save]).

6. Настройте внешний вид отчета и загрузите настроенный шаблон в Creatio

Чтобы настроить шаблон, выполните следующие действия:

  1. Откройте любой файл MS Word.

  2. Нажмите кнопку [Connect] на панели инструментов плагина Creatio (рис. 12).

    Рис. 12. — Кнопка [Connect]

  3. Введите логин и пароль пользователя в Creatio. Возле поля [Server] нажмите (рис. 13).

    Рис. 13. — Авторизация

  4. Нажмите [New]. Введите параметры сервера (рис. 14).

    Рис. 14. — Настройка сервера

    Нажмите [OK].
  5. Нажмите кнопку [Select report] на панели инструментов плагина Creatio (рис. 15).

    Рис. 15. — Кнопка [Select report]

  6. Выберите отчет "Account Summary" и нажмите [OK] (рис. 16).

    Рис. 16. — Выбор отчета

    Окно настройки отчета имеет следующий вид (рис. 17).

    Рис. 17. — Настройка отчета

  7. Настройте внешний вид шаблона. Подробно настройка шаблона отчета описана в статье "Редактировать шаблон отчета в плагине MS Word".
    После настройки отчет имеет следующий вид (рис. 18).

    Рис. 18. — Настройка шаблона отчета

  8. Для загрузки настроенного шаблона отчета в Creatio, нажмите [Save to Creatio] (рис. 19).

    Рис. 19. — Кнопка [Save to Creatio]

В результате отчет "Account Summary" будет доступен на странице контрагента по кнопке [Печать] ([Print]) (рис. 20).

Рис. 20. — Отображение отчета "Account Summary" на странице записи раздела [Контрагенты] ([Accounts])

Отчет для контрагента типа [Клиент] ([Customer]) имеет следующий вид (рис. 21).

Рис. 21. — Пример отчета "Account Summary" для контрагента типа [Клиент] ([Customer])

Отчет для контрагента типа [Партнер] ([Partner]) имеет следующий вид (рис. 22).

Рис. 22. — Пример отчета "Account Summary" для контрагента типа [Партнер] ([Partner])

Перенос пакета с отчетом на другую среду разработки

Для переноса пакета с отчетом на другую среду разработки в разделе [Конфигурация] ([Configuration]) перейдите на вкладку [Данные] ([Data]) и выполните привязку данных следующих элементов:

  • SysModuleReport_ReportName — отчет. Подключается по Id отчета из таблицы [dbo.SysModuleReport] базы данных.
  • SysModuleReportTable_ReportName — табличная составляющая отчета. Подключается по Id отчета из таблицы [dbo.SysModuleReportTable] базы данных.

Посмотреть Id записи в таблице базы данных без доступа к ней можно, отобразив системную колонку Id в окне привязки данных к пакету.

© Terrasoft 2002-2020.

Был ли данный материал полезен?

Как можно улучшить эту статью?