/// <summary> /// Асинхронно записывает данные объекта на сервере. /// </summary> /// <param name="режимЗаписиДокумента">Режим записи документа (только для документов).</param> /// <param name="режимПроведенияДокумента">Режим проведения документа (только для документов).</param> /// <returns></returns> protected async Task ЗаписатьДанныеАсинх(ежимЗаписиДокумента режимЗаписиДокумента = ежимЗаписиДокумента.Запись, ежимПроведенияДокумента режимПроведенияДокумента = ежимПроведенияДокумента.Неоперативный) { ValueObjectRef tempObject = new ValueObjectRef(this.reference); tempObject.Property = new ValueBase[this.modifiedFields.Count]; int i = 0; foreach (string key in this.modifiedFields) { object value = null; this.data.TryGetValue(key, out value); ValueBase property = ValueBase.From(value); property.Name = key; tempObject.Property[i] = property; i++; } PostObject_Settings settings = new PostObject_Settings( this.ДополнительныеСвойства, режимЗаписиДокумента, режимПроведенияДокумента, this.isExchangeLoadMode ); Task <PostObjectResponse> task = this.Клиент().SoapКлиент.PostObjectAsync(tempObject, settings); ValueObjectRef returnObject = (await task).@return; ОбъектСсылка ссылка = returnObject.GetValue(this.Клиент()) as ОбъектСсылка; this.УстановитьСсылку(ссылка); this.УстановитьЗначенияИзСвойствSOAP(returnObject.Property); this.modifiedFields.Clear(); }
/// <summary> /// Получает значение свойства объекта по ссылке на объект и имени свойства. /// </summary> /// <param name="ссылка">Ссылка на объект.</param> /// <param name="имяПоля">Имя поля.</param> /// <param name="значение">Значение поля.</param> /// <returns>Возвращает true, Если значение установлено, в противном случае - false.</returns> public bool ПопыткаПолучитьЗначение(ОбъектСсылка ссылка, string имяПоля, out object значение) { ссылка = ссылка ?? throw new ArgumentNullException("ссылка"); if (имяПоля.Equals("Ссылка", StringComparison.OrdinalIgnoreCase)) { значение = ссылка; return(true); } УзелМетаданных реквизит; if (((dynamic)ссылка.Метаданные()).еквизиты.ПопыткаНайтиПодчиненный(имяПоля, out реквизит)) { if (ссылка.Пустая()) { значение = null; return(true); } Dictionary <string, object> данныеОбъекта = this.ПолучитьУзелДанныхОбъекта(ссылка); if (данныеОбъекта.TryGetValue(имяПоля, out значение)) { return(true); } this.ЗагрузитьДанныеОбъекта(ссылка); return(ПопыткаПолучитьЗначение(ссылка, имяПоля, out значение)); } if (((dynamic)ссылка.Метаданные()).ТабличныеЧасти.ПопыткаНайти(имяПоля, out реквизит)) { if (ссылка.Пустая()) { значение = this.ПолучитьТабличнуюЧасть(ссылка, (МетаданныеТабличнаяЧасть)реквизит); return(true); } Dictionary <string, object> данныеОбъекта = this.ПолучитьУзелДанныхОбъекта(ссылка); object таблЧасть; if (данныеОбъекта.TryGetValue(имяПоля, out таблЧасть)) { if (!(таблЧасть is ТабличнаяЧасть)) { таблЧасть = this.ПолучитьТабличнуюЧасть(ссылка, (МетаданныеТабличнаяЧасть)реквизит); данныеОбъекта[имяПоля] = таблЧасть; } значение = таблЧасть; return(true); } this.ЗагрузитьДанныеОбъекта(ссылка); return(this.ПопыткаПолучитьЗначение(ссылка, имяПоля, out значение)); } значение = null; return(false); }
internal void УстановитьЗначенияИзСвойствSOAP(ОбъектСсылка ссылка, ValueBase[] properties) { if (properties == null) { return; } УзелМетаданных реквизиты = ссылка.Метаданные().НайтиПодчиненный("Реквизиты"); УзелМетаданных таблЧасти = ссылка.Метаданные().НайтиПодчиненный("ТабличныеЧасти"); foreach (ValueBase property in properties) { УзелМетаданных текМета; if (реквизиты.ПопыткаНайтиПодчиненный(property.Name, out текМета)) { object значение = property.GetValue(this.Клиент); this.УстановитьЗначениеПоляОбъекта(ссылка, текМета.Имя(), значение); } else if (таблЧасти.ПопыткаНайтиПодчиненный(property.Name, out текМета)) { object значение = property.GetValue(this.Клиент); if (значение is ТаблицаЗначений) { ТабличнаяЧасть таблЧасть = this.ПолучитьТабличнуюЧасть(ссылка, (МетаданныеТабличнаяЧасть)текМета); таблЧасть.ЗагрузитьДанные(значение as ТаблицаЗначений); } } } }
internal static КонтекстОбъекта ПолучитьКонтекстОбъекта(ОбъектСсылка ссылка) { if (ссылка == null) { throw new ArgumentNullException("ссылка"); } switch (ссылка.ТипКоллекции()) { case ТипКоллекции.Справочник: return(new СправочникОбъект(ссылка as СправочникСсылка)); case ТипКоллекции.Документ: return(new ДокументОбъект(ссылка as ДокументСсылка)); case ТипКоллекции.ПланВидовХарактеристик: return(new ПланВидовХарактеристикОбъект(ссылка as ПланВидовХарактеристикСсылка)); case ТипКоллекции.ПланСчетов: return(new ПланСчетовОбъект(ссылка as ПланСчетовСсылка)); case ТипКоллекции.ПланВидовРасчета: return(new ПланВидовРасчетаОбъект(ссылка as ПланВидовРасчетаСсылка)); case ТипКоллекции.БизнесПроцесс: return(new БизнесПроцессОбъект(ссылка as БизнесПроцессСсылка)); case ТипКоллекции.Задача: return(new ЗадачаОбъект(ссылка as ЗадачаСсылка)); default: throw new ArgumentException(); } }
/// <summary> /// Базовый конструктор на основании ссылки на объект. /// </summary> /// <param name="ссылка"></param> internal КонтекстОбъекта(ОбъектСсылка ссылка) { this.reference = ссылка; this.data = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase); this.modifiedFields = new HashSet <string>(StringComparer.OrdinalIgnoreCase); this.additionalProperties = new Структура(); this.isExchangeLoadMode = false; }
internal void УстановитьПредставлениеОбъекта(ОбъектСсылка ссылка, string представление) { if (представление == null) { return; } Dictionary <string, object> данныеОбъекта = ПолучитьУзелДанныхОбъекта(ссылка); данныеОбъекта["#"] = представление; }
private ТабличнаяЧасть ПолучитьТабличнуюЧасть(ОбъектСсылка ссылка, МетаданныеТабличнаяЧасть метаданные) { Dictionary <string, object> данныеОбъекта = this.ПолучитьУзелДанныхОбъекта(ссылка); object таблЧасть; if (!данныеОбъекта.TryGetValue(метаданные.Имя(), out таблЧасть) || !(таблЧасть is ТабличнаяЧасть)) { таблЧасть = new ТабличнаяЧасть(метаданные); this.УстановитьЗначениеПоляОбъекта(ссылка, метаданные.Имя(), таблЧасть); } return(таблЧасть as ТабличнаяЧасть); }
private static Guid ПолучитьОбобщенныйИдентификаторСсылки(Ссылка ссылка) { if (ссылка is ОбъектСсылка) { ОбъектСсылка текСсылка = ссылка as ОбъектСсылка; return(ПолучитьОбобщенныйИдентификаторСсылки(текСсылка.ПолноеИмяТипа(), текСсылка.УникальныйИдентификатор().ToString())); } else { ПеречислениеСсылка текСсылка = ссылка as ПеречислениеСсылка; return(ПолучитьОбобщенныйИдентификаторСсылки(текСсылка.ПолноеИмяТипа(), текСсылка.Имя)); } }
private Dictionary <string, object> ПолучитьУзелДанныхОбъекта(ОбъектСсылка ссылка) { Guid идСсылки = КонтекстДанных.ПолучитьОбобщенныйИдентификаторСсылки(ссылка); Dictionary <string, object> node = null; if (!this.data.TryGetValue(идСсылки, out node)) { node = new Dictionary <string, object>(StringComparer.OrdinalIgnoreCase); this.data.Add(идСсылки, node); } return(node); }
/// <summary> /// Устанавливает ссылку на объект базы данных 1С. /// </summary> /// <param name="ссылка"></param> public void УстановитьСсылку(ОбъектСсылка ссылка) { if (ссылка == this.reference) { return; } if (ссылка.ТипКоллекции() != this.reference.ТипКоллекции() || ссылка.ИмяКоллекции() != this.reference.ИмяКоллекции()) { throw new ArgumentException(String.Format("Тип аргумента \"ссылка\" не соответствует требуемому типу \"{0}\".", this.reference.ПолноеИмяТипа()), "ссылка"); } this.reference = ссылка; }
public override object GetValue(БромКлиент client = null) { ОбъектСсылка reference = client != null?client.Контекст().ПолучитьОбъектСсылку(this.Type, new Guid(this.Value)) : throw new System.ArgumentNullException("client"); if (this.Presentation != null) { client.Контекст().УстановитьПредставлениеОбъекта(reference, this.Presentation); } if (this.Property != null) { client.Контекст().УстановитьЗначенияИзСвойствSOAP(reference, this.Property); } return(reference); }
private void ИнициализироватьДанныеОбъекта(ОбъектСсылка ссылка) { Dictionary <string, object> данныеОбъекта = ПолучитьУзелДанныхОбъекта(ссылка); данныеОбъекта.Clear(); УзелМетаданных реквизиты = ссылка.Метаданные().НайтиПодчиненный("Реквизиты"); foreach (var ключЗначение in реквизиты) { данныеОбъекта[ключЗначение.Key] = null; } данныеОбъекта["#"] = null; }
/// <summary> /// Получает текстовое представление объекта по ссылке на объект. /// </summary> /// <param name="ссылка">Ссылка на объект.</param> /// <returns>Возвращает текстовое представление объекта.</returns> public string ПолучитьПредставлениеОбъекта(ОбъектСсылка ссылка) { ссылка = ссылка ?? throw new ArgumentNullException("ссылка"); if (ссылка.Пустая()) { return(""); } object представление = null; Dictionary <string, object> данныеОбъекта = this.ПолучитьУзелДанныхОбъекта(ссылка); if (данныеОбъекта.TryGetValue("#", out представление)) { return((string)представление); } this.ЗагрузитьДанныеОбъекта(ссылка); return(this.ПолучитьПредставлениеОбъекта(ссылка)); }
/// <summary> /// Асинхронно загружает данные объекта с сервера. /// </summary> /// <param name="ссылка">Ссылка на объект.</param> public async Task ЗагрузитьДанныеОбъектаАсинх(ОбъектСсылка ссылка) { GetObject_Settings settings = new GetObject_Settings(); settings.AddSkippedProperties = true; settings.FieldAutoinclusion = new RequestFieldAutoinclusionSettings(); settings.FieldAutoinclusion.DefaultFields = true; settings.FieldAutoinclusion.DefaultFieldsSpecified = true; settings.FieldAutoinclusion.CustomFields = true; settings.FieldAutoinclusion.CustomFieldsSpecified = true; settings.FieldAutoinclusion.Tables = true; settings.FieldAutoinclusion.TablesSpecified = true; Task <GetObjectResponse> task = this.bromClient.SoapКлиент.GetObjectAsync((ValueObjectRef)ValueBase.From(ссылка), settings); ValueObjectRef refSoap = (await task).@return as ValueObjectRef; this.ИнициализироватьДанныеОбъекта(ссылка); this.УстановитьПредставлениеОбъекта(ссылка, refSoap.Presentation); this.УстановитьЗначенияИзСвойствSOAP(ссылка, refSoap.Property); }
/// <summary> /// Удаляет данные объекта из контекста. /// </summary> /// <param name="ссылка">Ссылка на объект.</param> public void ОчиститьДанныеОбъекта(ОбъектСсылка ссылка) { this.УдалитьУзелДанныхОбъекта(ссылка); }
/// <summary> /// Загружает данные объекта с сервера. /// </summary> /// <param name="ссылка">Ссылка на объект.</param> public void ЗагрузитьДанныеОбъекта(ОбъектСсылка ссылка) { Task task = this.ЗагрузитьДанныеОбъектаАсинх(ссылка); task.Wait(); }
internal void УстановитьЗначениеПоляОбъекта(ОбъектСсылка ссылка, string имяПоля, object значение) { Dictionary <string, object> данныеОбъекта = this.ПолучитьУзелДанныхОбъекта(ссылка); данныеОбъекта[имяПоля] = значение; }
public ValueObjectRef(ОбъектСсылка value) { this.Type = value != null?value.ПолноеИмяТипа() : throw new System.ArgumentNullException("value"); this.Value = value.УникальныйИдентификатор().ToString(); }
public ValuePointInTime(DateTime date, ОбъектСсылка reference) { this.Date = date; this.Ref = new ValueObjectRef(reference); }
private void УдалитьУзелДанныхОбъекта(ОбъектСсылка ссылка) { Guid идСсылки = КонтекстДанных.ПолучитьОбобщенныйИдентификаторСсылки(ссылка); this.data.Remove(идСсылки); }