В данной статье вкратце расскажу о вспомогательных сервисах для работы с объектами системы и о способах манипуляции данными карточек.
Сервисы
Большинство их описано в документации. Полный список можно посмотреть в 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 | Навигатор. |
Объектная модель карточки
Любая карточка системы состоит их списка секций. Каждая секция это таблица в реляционной базе данных, то есть в каждой секции есть строки с определенным набором полей.
Секции бывают трех видов:
- табличные: предусмотрены для хранения одной и более строк
- плоские: те же табличные, только хранят по одной строке
- иерархические: дополнительно имеют поле указывающее на родительскую строку
Примеры работы с данными карточки
// получаем секцию с файлами документа
// 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();
Комментариев нет:
Отправить комментарий