2014-02-01

Объектная модель и сервисы DocsVision

В данной статье вкратце расскажу о вспомогательных сервисах для работы с объектами системы и о способах манипуляции данными карточек.

Сервисы


В DocsVision есть вспомогательные сервисы для работы с объектами системы. Многие из них предназначены для работы с различными конструкторами и справочниками системы.
Большинство их описано в документации. Полный список можно посмотреть в DocsVision.BackOffice.ObjectModel.Services. Приведу список самых часто используемых мной.

Некоторые полезные сервисы:
IBaseCardServiceБазовые карточки.
ILockServiceБлокировки объектов.
IStateServiceСостояния карточек. В основном, используется поиск веток и переход к нужным состояниям.
IKindServiceВиды карточек.
IReferenceListServiceСписок ссылок.
IDocumentServiceДокумент.
IVersionedFileCardServiceКарточки файлов.
ITaskListServiceСписок задач.
ITaskGroupServiceГрупповое задание.
ITaskServiceЗадание.
IBaseUniversalServiceУниверсальный справочник.
IStaffServiceСотрудники и организации.
IPartnersServiceКонтрагенты.

Скрипты карточек


Некоторые полезные объекты, доступные в скрипте карточки:
this.BaseObjectТекущий базовый объект. Например, в скрипте карточки документа в свойстве содержится объект типа Document.
this.CardDataЭкземпляр CardData. Нужен для работы с данными карточки.
this.CardControl.ObjectContextТекущий контекст. Применяется для работы с объектами. Так же может искать сервисы.
this.SessionОписывает текущее соединение с сервером. Содержит список полезных менеджеров для работы с различными объектами системы (аналогично сервисам).
this.CardControl, this.CardFrameЭлемент управления текущей карточки. Интерфейсы немного отличаются.
this.CardControl.CardHost, this.CardFrame.CardHostНавигатор.

Объектная модель карточки


Любая карточка системы состоит их списка секций. Каждая секция это таблица в реляционной базе данных, то есть в каждой секции есть строки с определенным набором полей.

Секции бывают трех видов:
  • табличные: предусмотрены для хранения одной и более строк
  • плоские: те же табличные, только хранят по одной строке
  • иерархические: дополнительно имеют поле указывающее на родительскую строку
Описание объектной модели (секции и поля карточек) находится в DocsVision.BackOffice.CardLib.CardDefs.

Примеры работы с данными карточки


// получаем секцию с файлами документа
// BaseObject - текущий объект, после изменений, нужно сохранять в базу
// здесь, CardDocument.Files.ID - ид. секции файлов карточек документа
IList<BaseCardSectionRow> section_files_rows = (IList<BaseCardSectionRow>) this.BaseObject.GetSection(CardDocument.Files.ID);
IList<BaseCardSectionRow> section_rows = (IList<BaseCardSectionRow>) this.BaseObject.GetSection(my_section_guid);
foreach (BaseCardSectionRow row in section_rows)
{
    // чтение данных поля из своей секции
    var value = row[field_alias];
    // изменение значения поля в своей секции
    row[field_alias] = new_value;
}

// использование CardData
// получение сохраненных данных карточки
SectionData sd = this.CardData.Sections[my_section_guid];
// получить данные можно через свойство Rows с указанием RowID
var my_field = sd.Rows[my_row_id][“MyFieldAlias”];
// устанавливаем значения для полей с различными типами данных
sd.FirstRow.SetGuid("MyGuidField", new Guid("{94235069-B59C-4FB6-B3CD-FB8CBF394229}"));
sd.FirstRow.SetDateTime("MyDateField", new DateTime(2014, 01, 01, 0, 0, 0, 0));
// и т.п.

Также, объектная модель предусматривает доступ к стандартным секциям карточек через свойства document.SystemInfo, document.MainInfo, document.Files и т.д.

// получение текущего состояния документа
StatesState document_state = document.SystemInfo.State;
// задание нового состояния документа
document.SystemInfo.State = new_document_state;

// получение из базы любого объекта любого типа по GUID
// вид документа
KindsCardKind kck = this.CardControl.ObjectContext.GetObject<KindsCardKind>(new Guid("4ECE3759-A547-48FE-A54C-569C590F0BCA"));
// документ
Document doc = this.CardControl.ObjectContext.GetObject<Document>(my_document_guid);

Управление состояниями карточки


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

// получаем сервис для работы с состояниями
IStateService ss = this.CardControl.ObjectContext.GetService<IStateService>();
// текущее состояние
StatesState cs = this.BaseObject.SystemInfo.State;
// поиск веток по текущему состоянию
IEnumerable ebr = ss.FindLineBranchesByStartState(cs);
IEnumerator enbr = ebr.GetEnumerator();
enbr.MoveNext();
// первая попавшаяся ветка
StatesStateMachineBranch br = enbr.Current as StatesStateMachineBranch;
// или так короче:
StatesStateMachineBranch br = ebr.FirstOrDefault<StatesStateMachineBranch>();
// смена состояния карточки
this.CardControl.ChangeState(br);
// или так (здесь branch_or_state это либо ветка, либо состояние)
ss.ChangeState(base_card, branch_or_state)

Сохранение


В конце всех манипуляций необходимо сохранять измененные объекты любым подходящим способом:

this.CardControl.ObjectContext.SaveObject<Document>(document_instance);
this.CardControl.ObjectContext.AcceptChanges();