Перейти к содержанию

Введение#

Модель - основная единица бизнес-логики программы. Декларативное описание сущности/объекта/документа. Это описание данных, которые хранятся в БД (таблица в которой хранятся данные, свойства, которые хранятся в таблице и т.д.). Каждая модель описывается в отдельном файле в json формате. Файл должен иметь формат: «Имя_модели.model.json». Как правило все они располагаются в каталоге проекта models.

Создание модели#

Создание модели заключается в её описании с помощью файла в формате json и использовании функционала обновления БД для создания требующихся для модели объектов БД.

В качестве примера описания простой модели будет использована модель city.model.json.

Отрывок содержимого файла:

{
  "rights": {
    "read": ["super"],
    "create": ["super"],
    "update": ["super"],
    "delete": ["super"]
  },
  "dbName": "City",
  "primaryKeyDomain": "City",
  "primaryKeyProperty": "VCode",
  "dateProperty": "EstDate",
  "storeHistory": true,
  "lock": true,
  "properties": {
    "VCode": {
      "dbName": "VCode",
      "type": "bigint",
      "meta": {
        "analytics": {
          "editable": true,
          "filterable": true,
          "name": "VCode"
        }
      }
    },
....
  }
}

Свойства#

Наименование Тип Описание Обязат.
parent строка задает модель для наследования. В качестве значения устанавливается относительный путь к модели. nan
schema строка задает имя схемы для таблицы и представления модели. По умолчанию значение dbo. nan
dbName строка задает связь модели с таблицей в пользовательской базе данных. В качестве значения устанавливается имя таблицы. В примере для модели задана таблица с именем testTable. Да
viewName строка задает связь модели с представлением в пользовательской базе данных. В качестве значения устанавливается имя представления. При установке значения для этого свойства данные считываются из указанного представления, иначе - из указанной таблицы. При изменении данных система работает с таблицей, указанной свойством dbName. В примере свойство не задано, поэтому чтение и изменение данных происходит из таблицы testTable. nan
typeName строка задает значение, по которому происходит разделение данных на уровне одной таблицы. Используется свойством typeNameProperty. nan
primaryKeyDomain строка задает ключ для генератора уникальных значений. В качестве значения указывается строка. Если значение этого свойства уникально в рамках всех моделей, то порядковый номер указанного первичного ключа модели генерируется только для одной таблицы. Если несколько моделей имеет одинаковое значение для этого свойства, то порядковый номер указанного первичного ключа генерируется для нескольких таблиц. Да
primaryKeyProperty строка описывает первичный ключ модели. В качестве значения устанавливается имя свойства модели из словаря properties. Да
labelProperty строка задает свойство, значение которого будет использоваться в качестве наименования объекта. Используется обозревателем аналитик в окне поиска для задания отображаемого наименования в контроле Lookup. nan
typeNameProperty строка указывает на свойство, используемое для разделения данных на уровне одной таблицы или представления. В качестве значения устанавливается имя свойства модели из словаря properties. Указанное свойство должно быть строкового типа. При установке этого свойства, в колонку, описанную указанным свойством, при сохранении данных модели записывается значение, указанное свойством typeName. При этом чтение данных осуществляется с условием проверки равенства значения в этой колонке значению typeName. В примере при сохранении данных в колонку TypeName таблицы testTable записывается значение "mytest". При чтении данных из таблицы testTable выбираются только те записи, у которых в колонке TypeName значение равно "mytest". nan
dateProperty строка указывает на свойство, используемое в качестве расчетной даты. В качестве значения устанавливается имя свойства модели из словаря properties. Указанное свойство должно иметь свойство type, равное "date". nan
storeHistory bool флаг, которое отвечает за хранение истории изменения данных в исторической базе. В качестве значения устанавливается булевое значение. По умолчанию значение true. В примере флаг принимает значение true, поэтому при изменении данных в таблице testTable с помощью исторического триггера вся история изменений будет сохраняться в таблице testTable исторической базы. nan
displayName строка описывает наименование модели для отображения на вкладках, если оно не переопределено свойствами экранной формы. В качестве значения устанавливается строка. nan
description строка задает описание модели. В качестве значения устанавливается строка. nan
lock bool флаг, включающий пессимистическое блокирование конкурентного доступа к экземплярам этой модели. Поддержка с версии 8.4. nan
rights объект описывает права для данного объекта. Представляет собой объект. Для каждого действия (create, read, update, delete) задается массив ролей, для которых это действие будет доступно. В примере чтение данных доступно только для ролей super и qweqwe, создание и обновление - только для роли super и удаление данных не доступно ни для одной роли. Да
useContext строка описывает настройки использования пользовательского контекста при работе с данными с помощью этой модели. Представляет собой объект. Для каждого действия (create, read, update, delete) задается булевое значение использовать контекст или нет. По умолчанию для всех действий значение true. В примере при чтении данных использование контекста отключается. nan
properties массив описывает перечень свойств модели. Представляет собой объект. Каждое свойство описывается в виде поля объекта properties, именем которого является имя свойства, а значение - объект с полями dbName, viewName, type. Да

Детализация свойств#

Properties#

Массив свойств модели (колонки в таблице/представлении). Каждое свойство описывается объектом, который может содержать свойства:

Наименование Тип Описание
dbName строка свойство, которое задает связь свойства модели и колонки таблицы. В качестве значения устанавливается наименование колонки таблицы, заданной свойством dbName модели.
viewName строка задает связь свойства модели и колонки представления. В качестве значения устанавливается наименование колонки представления, заданного свойством viewName модели.
type строка задает тип свойства модели. В качестве значения может быть установлено имя типа, которое берется из словаря примитивов и является регистрозависимым значением, относительный путь к файлу модели или строка "this", если в качестве типа свойства модели задается та же самая модель. Обязательное свойство.

Модель всегда содержит свойства: CDate, WDate, CHost, Whost, CUser, WUser.

Список примитивных типов, доступных в системе для задания типов свойств модели и параметров запросов:

Наименование Описание
bigint Тип bigint в БД
bool Тип BIT в БД
date Тип date в БД
dateTime Тип dateTime в БД
dateTimeOffset Тип dateTimeOffset в БД
double Тип double в БД
file Тип uniqueidentifeir в БД. Является ссылкой на файл в хранилище файлов.
int Тип int в БД
longstring Тип varchar(max) в БД
money Тип money в БД
string Тип varchar(255) в БД
time Тип time в БД
tinyint Тип tinyint в БД
varbinary(max) Тип varbinary(max) в БД
uuid Тип uniqueidentifeir в БД

Пример#

{
  "dbName": "test",
  "typeName": "mytest",
  "primaryKeyDomain": "test",
  "primaryKeyProperty": "VCode",
  "typeNameProperty": "TypeName",
  "dateProperty": "DocumentDate",
  "displayName": "Простая модель",
  "description": "Simple model",
  "properties": {
    "VCode": {
      "dbName": "VCode",
      "type": "bigint"
    },
    "TypeName": {
      "dbName": "TypeName",
      "type": "string"
    },
    "Rate": {
      "dbName": "Rate",
      "type": "string"
    },
    "Contractor": {
      "dbName": "Contractor",
      "import": "../base/contractor.model.json"
    },
    "DocumentDate": {
      "dbName": "DocumentDate",
      "type": "date"
    }
  },
  "details": {
    "Detail": {
      "foreignKeyProperty": "PCode",
      "type": "this"
    }
  },
  "rights": {
    "create": ["super"],
    "read": ["super", "qweqwe"],
    "update": ["super"] 
  }
}

Дочерняя коллекция (детейл)#

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

Для связи табличной части с шапкой документа принято использовать поле PCode (Parent code, родительский код), он содержит ссылку на код документа.

Регистрация табличной части (их может быть несколько) происходит в свойстве модели details. Это объект, который содержит описание детейлов модели в виде свойств. Каждое описание должно содержать свойство type (ссылка на табличную модель) и foreignKeyProperty (свойство в табличной модели, которое будет ссылаться на текущий документ).

Пример:

Модель документа прайс-лист, табличная часть только одна – Detail, которая смотрит на модель PriceListDetail.model.json и связывается по полю PCode. Файл модели PriceList.model.json.

{
  "dbName": "PriceList",
  "primaryKeyDomain": "PriceList",
  "primaryKeyProperty": "VCode",
  "properties": {
    "VCode": {
      "dbName": "VCode",
      "type": "bigint"
    },
    "AcualDate": {
      "dbName": "AcualDate",
      "type": "dateTimeOffset"
    }
  },
  "details": {
    "Detail": {
      "foreignKeyProperty": "PCode",
      "type": "./PriceListDetail.model.json"
    }
  },
  "rights": {
    "create": ["super"],
    "read": ["super"],
    "update": ["super"],
    "delete": ["super"]
  }
}

Файл модели PriceListDetail.model.json.

{
  "dbName": "PriceListDetail",
  "primaryKeyDomain": "PriceListDetail",
  "primaryKeyProperty": "VCode",
  "properties": {
    "VCode": {
      "dbName": "VCode",
      "type": "bigint"
    },
    "PCode": {
      "dbName": "PCode",
      "type": "bigint"
    },
    "Material": {
      "dbName": "Material",
      "type": "./Material.model.json"
    },
    "Price": {
      "dbName": "Price",
      "type": "money"
    }
  },
  "rights": {
    "create": ["super"],
    "read": ["super"],
    "update": ["super"],
    "delete": ["super"]
  }
}