Описание (схема) данных представления

Описание данных представления хранится в специальной системной карточке и представляет собой XML-документ (так же как схемы карточек и библиотек). Однако, работать с этим описанием, оперируя непосредственно узлами и атрибутами XML-документа, было бы слишком сложно и неудобно. Поэтому в объектной модели системы предусмотрен ряд специальных объектов, которые позволяют работать с описанием представления уже на уровне семантических объектов (полей карточек, операций с ними).

Базовым объектом в этой модели является объект View. Этот объект является создаваемым (например, его можно создать при добавлении в систему нового описания представления). Также он может быть проинициализирован на основании существующего описания представления, сохранённого в карточке ViewCard.

Доступ к представлению из карточки представления
Рисунок 1. Доступ к представлению из карточки представления

Для загрузки существующего описания представления используется вспомогательный объект SavedView (сохранённое описание представления), который можно получить из карточки сохранённых представлений (ViewCard).

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

const string VIEW_CARD_ID = "17F8F0B3-7E93-45E9-B250-EED4E93F3FA3";
ViewCard vcard = (ViewCard)session.CardManager.GetDictionary(new Guid(VIEW_CARD_ID));

Из коллекции сохранённых описаний объекта свойство Views, необходимое выбрать нужное представление и вызвать метод SavedView.Export, чтобы на выходе получить низкоуровневый объект View для непосредственного редактирования описания представления.

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

Виртуальные поля могут быть определены разработчиком в процессе создания схемы карточки (такие поля всегда будут доступны для использования во всех представлениях). Доступ к определениям этих полей можно получить через объектную модель метаданных CardType.VirtualFields. Элементы этой коллекции доступны только для чтения, так как они жестко определены в схеме карточки.

Также виртуальные поля можно создать (выделить) в процессе построения конкретного представления, и сохранить как отдельные объекты для дальнейшего использования в других представлениях по аналогичной секции. Такие виртуальные поля создаются на основе готовых элементов представлений ViewElement при помощи метода ExtractVirtualField. Они сохраняются в той же системной карточке ViewCard, что и описания представлений, и доступны для последующего повторного использования через её объектную модель. Для работы с такими виртуальными полями используется другой тип объектов — SavedVirtualField.

Пример добавления предварительно сохранённого виртуального поля к описанию представления:
const string SECTION_TYPE_ID = "{8C77892A-21CC-4972-AD71-A9919BCA8187}";

SavedVirtualFieldCollection savedColl = viewcard.GetVirtualFields(new Guid(SECTION_TYPE_ID)); (1)

SavedVirtualField  savedField = savedColl["Performer"]; (2)

ViewElement element;
element.MergeVirtualField(savedField.Export(), "Performers", "Performers"); (3)
1 Получение сохранённых определений виртуальных полей для конкретного типа секции.
2 Получение поля с псевдонимом Performer.
3 Добавление поля к описанию представления.
Типичный алгоритм создания нового описания представления может включать в себя следующие шаги:
  1. Определить количество и состав колонок будущего представления View.Columns, задать порядок сортировки данных в колонках View.Sorting.

  2. Сформировать как минимум один элемент представления ViewElement, определяющий источники данных для колонок:

    1. Задать основную секцию карточки, из которой будут извлекаться данные SectionId.

    2. Физические поля секции, которые выводятся в представление в непосредственном виде, перечислить в коллекции SectionFields.

    3. Если для данной секции ранее были определены виртуальные поля (в схеме карточки или в конкретной базе данных), то загрузить их описание при помощи метода MergeVirtualField.

    Чтобы вывести данные из полей другой секции или таблицы:
    1. Присоедините эту секцию (или таблицу) к основной секции в коллекции JoinDefinitions.

    2. Выбрать поля присоединенной секции (или таблицы), добавив их в коллекцию SectionFields вместе с псевдонимом присоединенной секции.

  3. Если представление должно содержать данные, не присутствующие в физических полях секций, то такие данные нужно оформить в виде вычисляемых полей ComputedFields.

    Для каждого вычисляемого поля ComputedFileld необходимо:
    1. Определить набор физических источников данных (ComputationParts), каждый их которых может быть значением физического поля секции или результатом выполнения арифметической функции.

    2. Определить агрегацию (Aggregation), выполняемую над физическими источниками данных.

    3. Определить операцию (Operation), выполняемую над физическими источниками данных.

    4. Задать ожидаемый тип результата вычислений (Type).

    5. При необходимости можно сопоставить каждому из возможных результатов вычислений конкретное значение, которое будет итоговым результатом (ResultSwitch).

При построении представления можно использовать псевдонимы трёх предопределённых секций:

  • Main — базовая секция представления.

  • Inst — строка из системной таблицы dvsys_instances, соответствующая текущей карточке.

  • Shortcuts — строка из секции ярлыков карточки папок, соответствующая текущей карточке.