Взаимодействие с источниками данных

Бизнес-логика как источник данных

Для работы с БЛ как источником данных предназначен класс SbisService. Он позволяет установить объект БЛ и методы манипуляции данными (CRUD). Если объект БЛ расположен в другом приложении, то его также можно использовать, указав точку входа в это приложение.

Для работы с различными типами данных, поступающих с бизнес-логики, используются адаптеры. Для класса SbisService определен адаптер Sbis, который позволяет работать с данными в формате бизнес-логики СБИС. Он преобразует "сырые" данные, передаваемые с БЛ в JSON-формате, в набор записей (экземпляр класса List) или просто запись (экземпляр класса Model).

Пример: Инициализируем БЛ как источник данных. Для этого в конфигурации источника указываем объект БЛ.

import { SbisService } from 'Types/source';

// инициализируем источник данных БЛ
const dataSource = new SbisService({
    endpoint: 'Товар' // название объекта БЛ
});

Пример: Чтобы использовать объект БЛ из другого сервиса приложения, при инициализации источника указывают точку входа.

import { SbisService } from 'Types/source';

// инициализируем источник данных БЛ
const dataSource = new SbisService({
    endpoint: {
        contract: 'Товар', // название объекта БЛ
        address: '/store/service' // точка входа в другое приложение
    }
}); 

По умолчанию для объекта БЛ используются стандартные имена методов CRUD: "Создать", "Прочитать", "Обновить" и "Удалить". А также списочный метод "Список". Чтобы переопрередить используемые методы, используют дополнительные опции источника (SbisService).

Пример: Переопределение используемых методов.

import { SbisService } from 'Types/source';

// инициализируем источник данных БЛ
const dataSource = new SbisService({
    endpoint: 'Товар'  // название объекта БЛ
    binding: {
        query: 'МойСписокКонтактов',
        read: 'ПрочитатьКарточкуСотрудника'
    }
});

Статический источник данных

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

Их применяют там, где не нужно сохранять измененные данные в БД или бизнес-логике. Поэтому отсутствуют запросы к серверной части веб-приложениям, что увеличивает его быстродействие. Для двух клиентов веб-приложения данные статических источников изолированы друг от друга.

Описание статических данных

В качестве статических источников данных могут быть использованы данные в форматах:

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

работа с данными в формате JSON:

Описываем данные:

const myArray = [
   {'@КлючевоеПоле': 1, 'Содержимое': 'Пункт 1', 'Примечание': 'Текст 1', 'Завершена': false},
   {'@КлючевоеПоле': 2, 'Содержимое': 'Пункт 2', 'Примечание': 'Текст 2', 'Завершена': false},
   {'@КлючевоеПоле': 3, 'Содержимое': 'Пункт 3', 'Примечание': 'Текст 3', 'Завершена': true}
];

работа с данными в формате СБИС-JSON:

Описываем данные:

import { Memory } from 'Types/source';
import { adapter } from 'Types/entity';

const myArray = new Memory({
    adapter: new adapter.Sbis(),
    data: {
        _type: 'recordset',
        d: [
            [1, 'Пункт 1', 'Текст 1', false],
            [2, 'Пункт 2', 'Текст 2', false],
            [3, 'Пункт 3', 'Текст 3', true]
        ],
        s: [
            {n: '@КлючевоеПоле', t: 'Число целое'},
            {n: 'Содержимое', t: 'Строка'},
            {n: 'Примечание', t: 'Строка'},
            {n: 'Завершена', t: 'Логическое'},
        ]
    },
    keyProperty: '@КлючевоеПоле'
});

В описании требуются типы полей; ниже приведен перечень типов:

Record.FIELD_TYPE_QUERY = "Выборка";
Record.FIELD_TYPE_RECORD = "Запись";
Record.FIELD_TYPE_INTEGER = "Число целое";
Record.FIELD_TYPE_STRING = "Строка";
Record.FIELD_TYPE_TEXT = "Текст";
Record.FIELD_TYPE_DOUBLE = "Число вещественное";
Record.FIELD_TYPE_MONEY = "Деньги";
Record.FIELD_TYPE_DATE = "Дата";
Record.FIELD_TYPE_DATETIME = "Дата и время";
Record.FIELD_TYPE_TIME = "Время";
Record.FIELD_TYPE_ARRAY = "Массив";
Record.FIELD_TYPE_BOOLEAN = "Логическое";
Record.FIELD_TYPE_HIERARCHY = "Иерархия";
Record.FIELD_TYPE_IDENTITY = "Идентификатор";
Record.FIELD_TYPE_ENUM = "Перечисляемое";
Record.FIELD_TYPE_FLAGS = "Флаги";
Record.FIELD_TYPE_LINK = "Связь";
Record.FIELD_TYPE_BINARY = "Двоичное";
Record.FIELD_TYPE_UUID = "UUID";
Record.FIELD_TYPE_RPCFILE = "Файл-rpc";
Record.FIELD_TYPE_TIME_INTERVAL = "Временной интервал";

Создание статического источника данных

Для создания статического источника данных используют класс Memory. Он преобразует "сырые" данные, созданные в исходном коде в виде ассоциативных массивов объектов, в набор записей (экземпляр класса RecordSet) или просто запись (экземпляр класса Model).

Пример: Создание "сырых" данных в JS-модуле контрола.

// "сырые" данные
const arrayOfObj = [
    {'@Заметка': 1, 'Содержимое': 'Пункт 1', 'Завершена': false},
    {'@Заметка': 2, 'Содержимое': 'Пункт 2', 'Завершена': false},
    {'@Заметка': 3, 'Содержимое': 'Пункт 3', 'Завершена': true}
];

В качестве первичного ключа будущего набора записей может выступать любое поле, значения которого уникальны. Например, в "сырых" данных поле первичного ключа можно установить полем с именем в формате "@ИмяПоля". Далее при создании источника поле ПК устанавливают вручную через опцию keyProperty.

Для обработки данных, созданных в нативном JSON-формате, использован адаптер Json.

Пример: Инициализация статического источника данных в JS-модуле.

import { Memory } from 'Types/source';
import { adapter } from 'Types/entity';

// инициализируем статический источник данных
const dataSource = new Memory({
    data: arrayOfObj, // передаём массив "сырых" данных
    keyProperty: '@Заметка' // указываем поле первичного ключа
    // adapter: new adapter.Json(); <-- единственный адаптер, по умолчанию настроен для данного класса
});

Иерархия в данных источника

Достаточно, чтобы данные источников содержали следующие поля:

  • Раздел. Первичный ключ той записи, которая является узлом для текущей.
  • Раздел@. Является ли запись узлом (true), скрытым узлом (false) или конечным листом (null).
  • Раздел$. Есть ли внутри ещё элементы. По значению данного поля отрисовываются крестики узлов в представлениях данных.

Пример: Иерархия в статическом источнике данных.

// "сырые" данные с иерархией
const arrayOfObj = [
    {
        '@Заметка': 1, 
        ... , 
        'Раздел': null, 
        'Раздел@': true, 
        'Раздел$': true
    },
    {
        '@Заметка': 2, 
        ... , 
        'Раздел': 1, 
        'Раздел@': null, 
        'Раздел$': false
    },
    {
        '@Заметка': 3, 
        ... , 
        'Раздел': 1, 
        'Раздел@': null, 
        'Раздел$': false
    }
];

Аналогично с БЛ метод должен возвращать записи с такими же полями.

Как контролу установить источник

Источник данных устанавливается с помощью опции source.

В следующе примере источник данных устанавливается для контрола Таблице.

Пример
Исходный код
<!-- WML -->
<Controls.grid:View
   source="{{_viewSource}}"
   columns="{{_columns}}" />
// TypeScript
import {Control} from 'UI/Base';
import {Memory} from 'Types/source';
import {TColumns} from 'Controls/grid';

export default class MyClass extends Control {
    protected _viewSource: Memory;
    protected _columns: TColumns = [{displayProperty: 'country', width: '100px'}];
    protected _beforeMount(): void {
        this._viewSource = new Memory({
            keyProperty: 'key',
            data: [{key: 0, country: 'Россия'}]
        });
    }
}