3.6 Модификация данных объекта
Зачастую, фоновые задачи создаются для выполнения различных модификаций объектов системы. Для модификаций объекта реализованы специальные классы-помощники для объектов, это классы, содержащие имя объекта и окачивающиеся на “_Helper”, так для РК это DOC_RC_Helper, для резолюции RESOLUTION_Helper и т.д.
У каждого такого “_Helper” класса реализованы свои методы для модификации объекта. Например, для РК, в классе DOC_RC_Helper есть методы ApplyDeliveryRule – для заполнения вида доставки, Append_REF_FILE – для прикрепления документа, Append_REF_LINK – добавление связки и др. Для резолюции - Append_REPLY- для добавления исполнителя и др.
При создании экземпляра класса “_Helper” указываются свойства Changes – экземпляр класса Changes и объект для модификации, причем объект должен быть загружен с возможностью редактирования, методом Load с указанием опции LoadOptions.ForEdit или методом LoadForEdit класса EntityHelper.
Методы Changes.Put(EntityBase entity) - регистрирует головную сущность объекта в наборе изменений, Changes.Save() - сохраняет данные Changes.
Пример добавления рубрики к РК документа:
|
var rcEntity = EntityHelper.Load<DOC_RC_Entity>(new DOC_RC_Ref(4954), LoadOptions.ForEdit);
var helper = new DOC_RC_Helper()
{
DocRc = rcEntity,
Changes = new Changes()
};
helper.Changes.Put(helper.DocRc);
helper.Append_REF_RUBRIC(new RUBRIC_CL_Ref(dueRubric));
helper.Changes.Save();
|
Для более простых модификаций возможно использовать сохранение измененного объекта с помощью экземпляра класса Changes, без использования класса-помощника. Например, если необходимо поменять один из атрибутов сущности.
Пример изменения признака «на контроле» резолюции:
|
var resolution = EntityHelper.LoadForEdit<RESOLUTION_Entity>(resolutionRef);
resolution.CONTROL_STATE = 1;
var changes = new Changes();
changes.Put(resolution);
changes.Save();
|
Некоторые классы-помощники, например, для РК документов, РКПД, резолюций (поручений) содержат метод Create, который регистрирует новый объект. Для РК и РКПД указывается группа документов, для которой создается новый объект, для резолюции вид резолюции (поручение или пункт) и ссылка на родительскую резолюцию.
Пример создания РК c резолюцией:
|
private void DocRcCreate(string dueDocGroup, string executorDue, string authorDue, string filePath)
{
var DateTimeNow = DateTime.Now;
var docRcHelper = new DOC_RC_Helper()
{
ViewContext = DOC_RCSaveContext.Current,
Changes = new Changes(),
User = UserContext.Current.USER_CL
};
var docRC = docRcHelper.Create(new DOCGROUP_CL_Ref(dueDocGroup));
docRC.DOC_DATE = DateTime.Today;
docRC.FREE_NUM = Guid.NewGuid().ToString("N");
docRC.AR_RC_VALUE_List[0].SetVal("sum_dog", 350000);
docRC.CONSISTS = "1";
docRC.ANNOTAT = "Содержание РК";
docRcHelper.ApplyDefaultRules();
AttachFile(docRcHelper, filePath);
var resHelper = new RESOLUTION_Helper(docRcHelper);
var resolution = resHelper.Create(1, null);
resHelper.ApplyDefaultRules();
resHelper.Append_REPLY_Department(new DEPARTMENT_Ref(executorDue));
resolution.DUE = authorDue;
resolution.RESOLUTION_DATE = DateTimeNow;
resolution.SEND_DATE = DateTimeNow;
resolution.LEFT_REZOLUTION = 0;
resolution.RESOLUTION_TEXT = "Текст резолюции";
docRcHelper.Changes.Save();
}
private void AttachFile(DOC_RC_Helper docRcHelper, string tempFilePath)
{
string tempFileName = Path.GetFileName(tempFilePath);
string fileName = Path.GetFileNameWithoutExtension(tempFileName);
var refFile = docRcHelper.Append_REF_FILE(fileName, "1");
refFile.DESCRIPTION = tempFileName;
refFile.NAME = tempFileName;
refFile.SetContents(tempFilePath);
}
|
* Примечание. Рекомендуется запоминать сущности в коде вместо многократного прохода через точки. Например, присваивание состава РК как docRC.CONSISTS = "1"; где var docRC = docRcHelper.DocRc, вместо docRcHelper.DocRc.CONSISTS = "1";
В данном примере создает РК с доп. реквизитом “sum_dog”, составом (CONSISTS), содержанием (ANNOTAT), добавлением правил по умолчанию (ApplyDefaultRules), файла и резолюции. Для резолюции указаны автор (DUE), дата резолюции (RESOLUTION_DATE), дата рассылки (SEND_DATE), признак рассылки в папку "На контроле" – контролеру и автору, в "Поступившие" и "На исполнении" – исполнителям (LEFT_REZOLUTION = 0) и текст резолюции (RESOLUTION_TEXT).
