/// <summary>
        /// Ждем подгрузки дерева, инициализируем
        /// </summary>
        public void LoadTreeAndInit(FreeHierarchyTypeTreeItem freeHierarchyTypeTreeItem, bool isFullReload = false,
                                    HashSet <int> singreRootFreeHierItemIds = null)
        {
            #region Очищаем старое дерево

            var items = Items;

            Items = null;

            string previousSets = null;

            if (descriptor != null)
            {
                if (descriptor.FreeHierarchyTree != null)
                {
                    //Запоминаем выбранные на прошлом дереве объекты
                    previousSets = descriptor.FreeHierarchyTree.GetSelectedToSet();
                }

                descriptor.Dispose();
                descriptor = null;
            }

            if (items != null)
            {
                items.DisposeChildren();
                items = null;
            }

            selectedType.DataContext = null;

            #endregion

            if (freeHierarchyTypeTreeItem != null)
            {
                Tree_ID = freeHierarchyTypeTreeItem.FreeHierTree_ID;
            }
            else
            {
                Tree_ID = DefaultTree_ID;
            }

            if (previousSets != null)
            {
                if (_startSelector != null)
                {
                    try
                    {
                        _startSelector.Dispose();
                        _startSelector = null;
                    }
                    catch
                    {
                    }
                }

                //Была смена дерева, пытаемся выделить объекты с предыдущего дерева
                SetItemsForSelection(previousSets, 2);
            }

            MainLayout.RunAsync(() => new TreeStartLoader(this, freeHierarchyTypeTreeItem, _selectedNodes, isFullReload, singreRootFreeHierItemIds),
                                loader =>
            {
                //Ошибка загрузки дерева
                lock (_selectedNodesSyncLock)
                {
                    if (loader == null || loader.Descriptor == null)
                    {
                        return;
                    }
                }

                if (IsSelectSingle)
                {
                    butNone.Visibility = showOnlySelected.Visibility = butAll.Visibility = System.Windows.Visibility.Collapsed;
                }

                var isFirstUsed = loader.IsFirstLoaded;

                IDictionary <int, FreeHierarchyTreeItem> source;
                lock (_selectedNodesSyncLock)
                {
                    source     = loader.FreeHierarchyTreeItems;
                    descriptor = loader.Descriptor;
                    freeHierarchyTypeTreeItem = loader.FreeHierarchyTypeTreeItem;
                    //_loader = null;
                    var prevTypeTreeItem = selectedType.DataContext as FreeHierarchyTypeTreeItem;
                    if (prevTypeTreeItem != null)
                    {
                        selectedType.DataContext = null;
                        prevTypeTreeItem.Dispose();
                    }

                    descriptor.SelectedChanged += DescOnSelectedChanged;

                    loader.Dispose();
                }

                if (source == null)
                {
                    return;
                }

                selectedType.DataContext = freeHierarchyTypeTreeItem;

                IEnumerable <KeyValuePair <int, FreeHierarchyTreeItem> > query;

                query = source.Where(i => i.Value != null && i.Value.Parent == null);

                //else
                //{
                //    //Нужно отобразить с дерево с определенного узла
                //    query = source.Where(i => i.Value != null && singreRootFreeHierItemIds.Contains(i.Value.FreeHierItem_ID));
                //}

                var parents = new RangeObservableCollection <FreeHierarchyTreeItem>(query
                                                                                    .Select(i => i.Value).OrderBy(o => o, new FreeHierarchyTreeItemComparer()), new FreeHierarchyTreeItemComparer());

                if (IsNSIDocuments)
                {
                    parents.Add(new FreeHierarchyTreeItem(descriptor, null as FreeHierarchyTreeItem)
                    {
                        FreeHierItemType = EnumFreeHierarchyItemType.CommonDocuments,
                        StringName       = "Общие документы"
                    });
                }

                var module = FindModule(this);
                if (module != null && Manager.Config.TreeDefaults != null)
                {
                    Manager.Config.TreeDefaults[module.ModuleType + Name] = descriptor.Tree_ID.GetValueOrDefault();
                }

                //Пытаемся оставить совместимость
                if (module != null && Manager.Config.FreeSets != null)
                {
                    var setKey = module.ModuleType + ":" + freeHierarchyTypeTreeItem.FreeHierTree_ID;

                    Dictionary <string, List <string> > set;
                    if (Manager.Config.FreeSets.TryGetValue(setKey, out set) && set != null)
                    {
                        Dictionary <string, List <string> > ks;
                        if (Manager.Config.FreeSets.TryGetValue(
                                freeHierarchyTypeTreeItem.FreeHierTree_ID.ToString(), out ks) && ks != null)
                        {
                            foreach (var k in ks)
                            {
                                List <string> existsSet;
                                if (set.TryGetValue(k.Key, out existsSet) && existsSet != null)
                                {
                                    existsSet.AddRange(k.Value);
                                }
                                else
                                {
                                    set[k.Key] = k.Value;
                                }
                            }
                        }

                        Manager.Config.FreeSets[freeHierarchyTypeTreeItem.FreeHierTree_ID.ToString()] = set;
                        Manager.Config.FreeSets.Remove(setKey);
                    }
                }

                sets.InitGlobal(freeHierarchyTypeTreeItem.FreeHierTree_ID.ToString());

                Items = parents;

                if (OnTreeDataLoaded != null)
                {
                    OnTreeDataLoaded(this, new EventArgsTreeItems
                    {
                        Items = parents,
                    });
                }
            }, priority: DispatcherPriority.Normal);
        }