/// <summary>
        /// УДАЛЕНИЕ ДУБЛИКАТОВ СВОЙСТВ
        /// Обход классов. Заполнение словарей для быстрого поиска классов
        /// </summary>
        /// <param name="class"></param>
        private void SurveyClass(Class @class)
        {
            @class.PropsCorrection();
            if (!String.IsNullOrWhiteSpace(@class.Code))//Классы без кода останутся но не попадают в словари
            {
                ClassLookUpByCode.Add(@class.Code, @class);

                if (@class.Properties.Count > 0)
                {
                    string key = GetClassKey(@class.Properties);

                    //Если есть 2 класса с одинаковым набором свойств, то словаре будет только один из них
                    if (!ClassLookUpByProps.ContainsKey(key))
                    {
                        ClassLookUpByProps.Add(key, @class);
                    }
                }
                else
                {
                    //обнаружен класс без свойств. Он подходит по имени?
                    for (int i = 0; i < Classifier.DefaultClasses.Length; i++)
                    {
                        if (DefClassesWithNoProps[i] == null && @class.Name.Equals(Classifier.DefaultClasses[i]))
                        {
                            DefClassesWithNoProps[i] = @class;
                        }
                    }
                }
            }

            foreach (Class nestedClass in @class.NestedClasses)
            {
                SurveyClass(nestedClass);
            }
        }
        private string GetUniqueClassCode()
        {
            int n = 1;

            while (ClassLookUpByCode.ContainsKey(n.ToString()))
            {
                n++;
            }
            return(n.ToString());
        }
        /// <summary>
        /// Заполнение свойств объекта в соответствии с классами. Присвоение ссылки на класс. Создание класса если еще нет
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="categories"></param>
        private void SetObjectProps(XML.St.Object obj, PropertyCategoryCollection categories, int defClassNum, int defClassLevelNum)
        {
            List <XML.Cl.Property> clProps = null;
            List <XML.St.Property> stProps = null;
            string actualKey = AnalizeNavisProps(categories, out clProps, out stProps);

            //Сначала присвоить правильный класс
            Class @class = null;

            //Проверить есть ли у объекта уже ссылка на класс
            if (!String.IsNullOrEmpty(obj.ClassCode))
            {
                //Найти этот класс
                ClassLookUpByCode.TryGetValue(obj.ClassCode, out @class);
                if (@class != null)
                {
                    //Если класс есть, то проверить его свойства
                    string currKey = GetClassKey(@class.Properties);
                    if (currKey == null || !currKey.Equals(actualKey))
                    {
                        //Если этот класс не подходит по свойствам, то он должен быть переназначен
                        @class = null;
                    }
                }
            }

            if (@class == null)
            {
                //Проверить есть ли класс подходящий по свойствам
                if (actualKey == null)
                {
                    //Свойств нет - присвоить дефолный класс без свойств
                    @class = DefClassesWithNoProps[defClassNum];
                }
                else
                {
                    //Поиск существующего класса подходящего по свойствам
                    ClassLookUpByProps.TryGetValue(actualKey, out @class);
                    if (@class == null)
                    {
                        //Подходящий класс не найден. Создать его
                        @class = CreateNewClass(Classifier.ClassName /*NEW_CLASS_NAME*/,
                                                Classifier.ClassName /*NEW_CLASS_NAME_IN_PLURAL*/,
                                                defClassLevelNum, actualKey, clProps);
                    }
                }
            }

            //Присвоить объекту ссылку на актуальный класс
            obj.ClassCode = @class.Code;

            //Задать свойства для объекта
            obj.Properties = stProps;
        }
        /// <summary>
        /// Создает класс и добавляет его во все нужные словари
        /// </summary>
        /// <param name="Name"></param>
        /// <param name=""></param>
        /// <returns></returns>
        private Class CreateNewClass(string name, string nameInPlural, int defLevelNum, string propKey = null, List <XML.Cl.Property> clProps = null)
        {
            //string code = GetUniqueClassCode();
            string code   = Guid.NewGuid().ToString();
            Class  @class = new Class()
            {
                Name = name, NameInPlural = nameInPlural, DetailLevel = DefDetailLevels[defLevelNum], Code = code
            };

            ClassLookUpByCode.Add(code, @class);
            Classifier.NestedClasses.Add(@class);

            if (propKey != null && clProps != null)
            {
                @class.Properties = clProps;
                ClassLookUpByProps.Add(propKey, @class);
            }

            return(@class);
        }