Работа с данными

Основы

Работа с данными в Creatio 8.x организована на основе паттерна DAO (Data Access Object). О паттерне DAO читайте в Википедии.

Слои паттерна DAO: 

  • BusinessObject  — реализация бизнес-логики.
  • DataAccessObject —  предоставляет приложению доступ к данным. При этом бизнес-логика и источник данных отделены друг от друга. Слой DAO может создавать DTO (Data Transfer Object). DTO может использовать слой BusinessObject. Для сохранения возвращать их в DAO. О паттерне DTO читайте в Википедии.
  • DataStorage  — организация различных хранилищ данных.

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

Слой Storage 

Storage — слой хранилища, который связан с определенным источником данных.

Типы хранилищ:

  • База данных приложения.
  • Веб-сервис.
  • Файловая система.

В Creatio 8.0 Atlas реализован доступ к базе данных приложения.

Слой Data Access Object 

Data Access Object — слой, который содержит источники данных (Data Source). Каждый источник данных связан с соответствующей моделью слоя бизнес-логики. 

Функции, которые выполняет слой DAO: 

  • Обеспечивает возможность выполнения CRUD-операций (load, save, insert, delete).
  • Предоставляет права на выполнение операций с данными (canEdit, canCreate, canDelete).
  • Предоставляет структуру данных (getSchema).

Схема данных описывает структуру данных, с которыми работает приложение.

Составляющие схемы данных:

  • Имя.
  • Заголовок.
  • Атрибуты. Важным структурным элементом атрибута являются валидаторы. Подробнее о валидаторах читайте в статье Кастомизация страницы.

Классы, которые описывают структуру схемы данных и атрибута, приведены ниже.

Структура схемы данных
Структура атрибута
export class DataSchema {
    public name: string;
    public caption: LocalizableString;
    public attributes: DataSchemaAttribute[];
    public primaryAttributeName?: string;
    public primaryDisplayAttributeName?: string;
}
export class DataSchemaAttribute {
    public name: string;
    public caption: string;
    public path: string;
    public dataValueType: DataValueType;
    public validators: DataSchemaValidatorConfig;
    public defaultValue: JsonData;
    public isValueCloneable: boolean;
    public attributeType: DataSchemaAttributeType;
    public referenceSchemaName?: string;
}

Важно. В версии Creatio 8.0 Atlas реализован источник данных EntityDataSource, который предоставляет возможность работы с базой данных приложения.

Слой Business Object 

Business Object — слой, который содержит модель представления (View model). Модель представления может содержать несколько моделей (Model). Слои View и Model описаны в статье Front-end архитектура Creatio.

Модель 

Модели данных описаны в секции modelConfig клиентской схемы. Модель содержит описание источника данных. В версии Creatio 8.0 Atlas реализован источник данных EntityDataSource, который предоставляет возможность работы с базой данных приложения.

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

  • Добавлять на холст новые и существующие элементы источников данных.
  • Редактировать элементы источников данных.
  • На холсте осуществлять привязку элементов управления к элементам источников данных и т. д.

Пример регистрации модели в клиентской схеме представлен ниже.

Пример регистрации модели в клиентской схеме
modelConfig: /**SCHEMA_MODEL_CONFIG*/{
    "dataSources": {
        /* Название источника данных - произвольное имя, не повторяющееся в этой секции. */
        "ContactDS": {
            /* Тип источника данных. */
            "type": "crt.EntityDataSource",
            "config": {
                /* Код схемы данных. */
                "entitySchemaName": "Contact"
            }
        }
    }
}/**SCHEMA_MODEL_CONFIG*/

Структура клиентской схемы описана в статье Клиентская схема.

Модель представления 

Модель представления отвечает за формирование слоя ViewModel — бизнес-логики взаимодействия слоев View и Model.

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

Пример описания модели представления в клиентской схеме представлен ниже.

Пример описания модели представления в клиентской схеме
viewModelConfig: /**SCHEMA_VIEW_MODEL_CONFIG*/{
    "attributes": {
        /* Привязка атрибута модели представления ContactName к атрибуту Name модели ContactDS.*/
        "ContactName": {
            "modelConfig": {
                "path": "ContactDS.Name"
            }
        }
    }
}/**SCHEMA_VIEW_MODEL_CONFIG*/

Типы атрибутов модели представления:

  • Колонки простых типов.
  • Колонки коллекций.
  • Колонки по прямой связи.

Атрибуты для колонок простых типов данных 

Простые типы данных, которые можно представить путем использования элементов источников данных::

  • Текст.
  • Число.
  • Логическое значение.
  • Значение даты и времени.

Чтобы создать атрибут для колонки простого типа данных:

  1. Зарегистрируйте источник данных в схеме страницы Freedom UI.

    Регистрация источника данных
    modelConfig: /**SCHEMA_MODEL_CONFIG*/{
        "dataSources": {
            "ContactDS": {
                "type": "crt.EntityDataSource",
                "config": {
                    "entitySchemaName": "Contact",
                }
            }
        }
    }/**SCHEMA_MODEL_CONFIG*/
  2. В свойстве attributes секции viewModelConfig создайте атрибут.

    Создание атрибута
    viewModelConfig: /**SCHEMA_VIEW_MODEL_CONFIG*/{
        "attributes": {
            "StringAttribute_jghoo32": {
                "modelConfig": {
                    "path": "ContactDS.Name"
                }
            }
        }
    }/**SCHEMA_VIEW_MODEL_CONFIG*/,

Важно. Используйте уникальное имя атрибута.

Основным свойством атрибута является секция modelConfig. Это свойство описывает связь с элементом источника данных через свойство path. Значение свойства path —  [Имя источника данных].[Код колонки] (в примере ContactDS.Name) .

Атрибуты для коллекций 

Модель представления позволяет выполнять привязку атрибутов, которые являются коллекцией данных. Чтобы привязать атрибут типа коллекция, для свойства isCollection атрибута установите значение true.

Пример привязки атрибута типа коллекция к модели данных
viewModelConfig: /**SCHEMA_VIEW_MODEL_CONFIG*/{
    "attributes": {
        /* Привязка атрибута модели представления AccountList типа коллекция к модели AccountDS.*/
        "AccountList": {
            "isCollection": true,
            "modelConfig": {
                "path": "AccountDS",
                "pagingConfig": {},
                "sortingConfig": {},
                "filterAttributes": {}
            },
            "viewModelConfig": {
                "attributes": {
                    "value": {
                        "modelConfig": {
                            "path": "AccountDS.Id"
                        }
                    },
                    "displayValue": {
                        "modelConfig": {
                            "path": "AccountDS.Name"
                        }
                    }
                }
            },
            "embeddedModel": {
                "name": "AccountDS",
                "config": { 
                    "type": "crt.EntityDataSource",
                    "config": {
                        "entitySchemaName": "Account"
                    }
                }
            }
        }
    }
}/**SCHEMA_VIEW_MODEL_CONFIG*/

Расширенная настройка атрибута типа коллекция позволяет настроить постраничный вывод данных и их сортировку.

Пример расширенной настройки атрибута типа коллекция
viewModelConfig: /**SCHEMA_VIEW_MODEL_CONFIG*/{
    "attributes": {
        "AccountList": {
            "isCollection": true,
            "modelConfig": {
                "path": "AccountDS",
                /* Настройка постраничного вывода.*/
                "pagingConfig": {
                    "rowsOffset"?: "<OffsetAttributeName>",
                    "rowCount": 5 | "<RowCountAttributeName>"
                },
                /* Настройка сортировки коллекции.*/
                "sortingConfig": {
                    "attributeName": "AccountsSorting",
                    "default": [{
                        "columnName": "Name",
                        "direction": "Asc"
                    }]
                }
            },
            "viewModelConfig": {...}
        }
    }
}/**SCHEMA_VIEW_MODEL_CONFIG*/

Атрибуты для колонок по прямой связи 

Колонки по прямой связи — это колонки связанных объектов текущего источника данных. Например, объект [Contact] содержит свойство [Account], которое также является объектом. Необходимо зарегистрировать атрибут по колонке [Name] связанного объекта [Account].

Чтобы создать атрибут для колонки по прямой связи:

  1. Зарегистрируйте источник данных в схеме страницы.

    Пример регистрации источника данных
    modelConfig: /**SCHEMA_MODEL_CONFIG*/{
        "dataSources": {
            "ContactDS": {
                "type": "crt.EntityDataSource",
                "config": {
                    "entitySchemaName": "Contact",
                }
            }
        }
    }/**SCHEMA_MODEL_CONFIG*/
  2. В свойстве attributes секции viewModelConfig создайте атрибут схемы страницы.

    Пример cоздания атрибута
    viewModelConfig: /**SCHEMA_VIEW_MODEL_CONFIG*/{
        "attributes": {
            "AccountName": {
                "modelConfig": {
                    "path": "ContactDS.AccountName"
                }
            }
        }
    }/**SCHEMA_VIEW_MODEL_CONFIG*/,

    В свойстве path хранится не путь к колонке, а путь к атрибуту источника данных, который будет создан на следующем шаге. Значение свойства path —  [Имя источника данных].[Имя атрибута источника данных] (например, ContactDS.AccountName) .

  3. В секции modelConfig cоздайте атрибут.

    Пример cоздания атрибута источника данных
    modelConfig: /**SCHEMA_MODEL_CONFIG*/{
        "dataSources": {
            "ContactDS": {
                "type": "crt.EntityDataSource",
                "config": {
                    "entitySchemaName": "Contact",
                    "attributes": {
                        "AccountName": {
                            "path": "Account.Name",
                            "type": "ForwardReference"
                        }
                    }
                }
            }
        }
    }/**SCHEMA_MODEL_CONFIG*/,

    Важно. Имя атрибута источника данных должно совпадать с именем атрибута, которое указано в свойстве path секции viewModelConfig (шаг 2).

Creatio позволяет создать атрибут по прямой связи с уровнем вложенности больше одного. Например, можно вывести название города связанного контрагента текущего контакта. В таком случае атрибут источника данных может выглядеть так:

Пример создания атрибута с несколькими уровнями вложенности
"dataSources": {
    "ContactDS": {
        "type": "crt.EntityDataSource",
        "config": {
            "entitySchemaName": "Contact",
            "attributes": {
                "AccountCityName": {
                    "path": "Account.City.Name",
                    "type": "ForwardReference"
                },
            }
        }
    }
}

Встроенная модель 

Встроенная модель (Embedded Model) — модель данных, которая встроена в модель представления без привязки к источнику данных.

Элементы типа коллекция, для которых Creatio позволяет использовать встроенную модель:

  • Список значений для реестра.
  • Выпадающий список, который формируется на основе справочника и т. д. 

Creatio не отображает встроенные модели данных в дизайнере Freedom UI, а также не предоставляет возможность привязки встроенных моделей к элементам управления на холсте.

Пример настройки встроенной модели
viewModelConfig: /**SCHEMA_VIEW_MODEL_CONFIG*/{
    "attributes": {
        "LookupAttributeCityList": {
            "isCollection": true,
            "modelConfig": {
                "path": "EmbeddedDS"
            },
            "embeddedModel" {
                "name": "EmbeddedDS",
                "config": {
                    "type": "crt.EntityDataSource",
                    "config": {
                        "entitySchemaName": "City"
                    }
                }
            }
            "viewModelConfig": {
                "attributes": {
                    "value": {
                        "modelConfig": {
                            "path": "EmbeddedDS.Id"
                        }
                    },
                    "displayValue": {
                        "modelConfig": {
                            "path": "EmbeddedDS.Name"
                        }
                    }
                }
            }
        }
    }
}/**SCHEMA_VIEW_MODEL_CONFIG*/,