/// <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();
        }
Exemple #19
0
 public ValuePointInTime(DateTime date, ОбъектСсылка reference)
 {
     this.Date = date;
     this.Ref  = new ValueObjectRef(reference);
 }
        private void УдалитьУзелДанныхОбъекта(ОбъектСсылка ссылка)
        {
            Guid идСсылки = КонтекстДанных.ПолучитьОбобщенныйИдентификаторСсылки(ссылка);

            this.data.Remove(идСсылки);
        }