/// <summary>
        /// Генерация дерева (списка) балансов (приложения 63) для выгрузки xml
        /// </summary>
        private static ConcurrentDictionary <int, FreeHierarchyTreeItem> GenerateBalance63Tree(FreeHierarchyTreeDescriptor descriptor)
        {
            var result = new ConcurrentDictionary <int, FreeHierarchyTreeItem>();

            var rootNodes = DeclaratorService.Service.Get_ExportService_Balances63();

            if (rootNodes == null)
            {
                return(result);
            }

            foreach (var rootNode in rootNodes)
            {
                var newItemNode = new FreeHierarchyTreeItem(descriptor, rootNode, false, string.Empty,
                                                            descriptor.GetMinIdAndDecrement(), null, true, nodeRights: null,
                                                            freeHierItemType: EnumFreeHierarchyItemType.FiasFullAddress);
                //{
                //    StringName = rootNode.StringName,
                //};

                newItemNode.Descriptor.Tree = result;

                //newItemNode.UpdateCountParents();

                result[newItemNode.FreeHierItem_ID] = newItemNode;
            }

            return(result);
        }
        private static ConcurrentDictionary <int, FreeHierarchyTreeItem> GenerateOldTelescopeTree(FreeHierarchyTreeDescriptor descriptor)
        {
            var result = new ConcurrentDictionary <int, FreeHierarchyTreeItem>();

            var rootNodes = EnumClientServiceDictionary.OldTelescopeTreeNodes.Values.Where(i => i.TreeLevel == 0);

            if (rootNodes == null)
            {
                return(result);
            }

            foreach (var rootNode in rootNodes)
            {
                rootNode.Parent_Absolute_Number = ""; //иначе зацикливание где нибудь будет

                var newItemNode = new FreeHierarchyTreeItem(descriptor, rootNode, false, string.Empty,
                                                            descriptor.GetMinIdAndDecrement(), null, true, nodeRights: null,
                                                            freeHierItemType: EnumFreeHierarchyItemType.OldTelescopeTreeNode);

                newItemNode.Descriptor.Tree = result;

                result[newItemNode.FreeHierItem_ID] = newItemNode;
            }

            return(result);
        }
        private static ConcurrentDictionary <int, FreeHierarchyTreeItem> GenerateStandartTreeBySupplyPS(FreeHierarchyTreeDescriptor descriptor, bool isHideTi)
        {
            var items  = new List <FreeHierarchyTreeItem>();
            var result = new ConcurrentDictionary <int, FreeHierarchyTreeItem>();

            foreach (var value in from ps in EnumClientServiceDictionary.DetailPSList
                     join ps_sup in GlobalTreeDictionary.PowerSupply_PS_List on ps.Key equals ps_sup.PS_ID into temp
                     from ps_t in temp.DefaultIfEmpty()
                     where ps_t == null
                     orderby ps.Value.Name
                     select ps.Value)
            {
                if (!IsGlobalFilterHaveItem(value))
                {
                    continue;
                }

                UserRightsForTreeObject right;
                if (!Manager.User.AccumulateRightsAndVerify(value, EnumObjectRightType.SeeDbObjects, value.GetObjectRightType(), out right))
                {
                    continue;
                }

                FreeHierarchyTreeItem newItem = new FreeHierarchyTreeItem(descriptor, value, nodeName: value.Name)
                {
                    FreeHierItem_ID       = descriptor.GetMinIdAndDecrement(),
                    IncludeObjectChildren = true,
                    IsHideTi         = isHideTi,
                    FreeHierItemType = EnumFreeHierarchyItemType.PS,
                    NodeRights       = right,
                };

                items.Add(newItem);
                newItem.Descriptor.Tree = result;
                if (newItem.IncludeObjectChildren)
                {
                    newItem.LoadStaticChildren(true, isHideTi);
                    newItem.Descriptor.NeedFindTI = true;
                }
            }
            if (FreeHierarchyTreeDescriptor.Sort != null)
            {
                FreeHierarchyTreeDescriptor.Sort(items);
            }
            foreach (var i in items)
            {
                result[i.FreeHierItem_ID] = i;
            }
            return(result);
        }
        private static ConcurrentDictionary <int, FreeHierarchyTreeItem> GenerateStandartTreeSections(FreeHierarchyTreeDescriptor descriptor)
        {
            var result = new ConcurrentDictionary <int, FreeHierarchyTreeItem>();
            var items  = new List <FreeHierarchyTreeItem>();

            HashSet <ID_TypeHierarchy> objectsHasRightDbSee = null;
            var hiers1 = EnumClientServiceDictionary.HierLev1List.Values;

            if (Manager.User != null && !Manager.User.IsAdmin)
            {
                try
                {
                    //Запрашиваем права на список объектов
                    objectsHasRightDbSee = Manager.User.UserHasRightDbSee(hiers1.Select(h1 => new ID_TypeHierarchy
                    {
                        ID            = h1.Id,
                        TypeHierarchy = enumTypeHierarchy.Dict_HierLev1,
                    }).ToList());
                }
                catch (Exception ex)
                {
                    Manager.UI.ShowMessage("Ошибка запроса прав: " + ex.Message);
                }
            }

            foreach (var item in hiers1.OrderBy(v => v.Item))
            {
                //Глобальный фильтр
                if (!IsGlobalFilterHaveItem(item))
                {
                    continue;
                }

                var minID = descriptor.GetMinIdAndDecrement();
                UserRightsForTreeObject hier1Right;
                var isExistsRight = Manager.User.AccumulateRightsAndVerify(item, EnumObjectRightType.SeeDbObjects, null, out hier1Right);
                if (!isExistsRight && Manager.User != null && !Manager.User.IsAdmin && objectsHasRightDbSee != null)
                {
                    //Проверяем через дочерних объектов
                    isExistsRight = objectsHasRightDbSee.Any(o => o.ID == item.Id && o.TypeHierarchy == item.GetTypeHierarchy());
                }

                var newItem = new FreeHierarchyTreeItem(descriptor, item, nodeName: item.Name)
                {
                    FreeHierItem_ID       = minID,
                    IncludeObjectChildren = true,
                    FreeHierItemType      = EnumFreeHierarchyItemType.HierLev1,
                    NodeRights            = hier1Right
                };

                newItem.Descriptor.Tree = result;
                bool isExistsChildSeeDbObjects = false;
                if (newItem.IncludeObjectChildren)
                {
                    isExistsChildSeeDbObjects = newItem.LoadStaticChildren(isExistsRight, isLoadStatic: true);
                }

                isExistsChildSeeDbObjects = newItem.IncludeChildrenSection(item.Id, item.Type, newItem.Children) || isExistsChildSeeDbObjects ||
                                            item.TIStatus.HasFlag(EnumTIStatus.Is_Section_Enabled);

                //У объекта нет прав на просмотр, или нет дочерних объектов на которые есть такие права
                if (isExistsChildSeeDbObjects) //Включаем только если есть сечения
                {
                    items.Add(newItem);
                }
                else
                {
                    newItem.Dispose();
                }
            }

            //Сечения которые не привязаны ни к чему
            foreach (var section in EnumClientServiceDictionary.GetSections().Values.Where(s => s.ParentId <= 0 && s.Section_ID > 0).OrderBy(s => s.Item))
            {
                UserRightsForTreeObject right;
                if (!Manager.User.AccumulateRightsAndVerify(section, EnumObjectRightType.SeeDbObjects, null, out right))
                {
                    continue;
                }

                var minID = descriptor.GetMinIdAndDecrement();
                FreeHierarchyTreeItem newItem = new FreeHierarchyTreeItem(descriptor, section)
                {
                    FreeHierItem_ID       = minID,
                    IncludeObjectChildren = true,
                    NodeRights            = right,
                    FreeHierItemType      = EnumFreeHierarchyItemType.Section,
                };

                newItem.Descriptor.Tree = result;
                newItem.LoadStaticChildren(true);

                items.Add(newItem);
            }

            if (FreeHierarchyTreeDescriptor.Sort != null)
            {
                FreeHierarchyTreeDescriptor.Sort(items);
            }
            foreach (var i in items)
            {
                result[i.FreeHierItem_ID] = i;
            }
            return(result);
        }
        /// <summary>
        /// Генерация стандартного дерева ПС
        /// </summary>
        /// <returns></returns>
        private static ConcurrentDictionary <int, FreeHierarchyTreeItem> GenerateStandartTreePS(FreeHierarchyTreeDescriptor descriptor, bool isHideTi)
        {
            var result = new ConcurrentDictionary <int, FreeHierarchyTreeItem>();

            var hiers1 = EnumClientServiceDictionary.HierLev1List.Values;


            var filterStatus = descriptor.FilterStatus;

            foreach (var item in hiers1.OrderBy(v => v.Item)) //сортируем по названию
            {
                if (item == null ||
                    (filterStatus.HasValue && (item.TIStatus & filterStatus.Value) == EnumTIStatus.None) || //Используется фильтр на дереве
                    !IsGlobalFilterHaveItem(item))    //Глобальный фильтр
                {
                    continue;
                }

                var isExistsChildSeeDbObjects = Manager.User.IsAssentRight(item, EnumObjectRightType.SeeDbObjects, null);

                if (!isExistsChildSeeDbObjects && //Нет собственных прав
                    !FreeHierarchyTreePreparer.ExistsStandartChildSeeDbObjects(item, descriptor.Tree_ID ?? -101, true)   //И нет дочерних объектов с правами
                    )
                {
                    continue;
                }

                var newItem = new FreeHierarchyTreeItem(descriptor, item, false, item.Name, descriptor.GetMinIdAndDecrement(), null, true, isHideTi, item.ObjectRights,
                                                        EnumFreeHierarchyItemType.HierLev1)
                {
                    Descriptor =
                    {
                        Tree = result
                    }
                };

                if (newItem.IncludeObjectChildren)
                {
                    isExistsChildSeeDbObjects = newItem.LoadStaticChildren(isExistsChildSeeDbObjects, isHideTi);
                }

                //У объекта нет прав на просмотр, или нет дочерних объектов на которые есть такие права
                //if (isExistsRight || isExistsChildSeeDbObjects)
                //{
                result[newItem.FreeHierItem_ID] = newItem;
                //}
                //else
                //{
                //    newItem.Dispose();
                //}
            }
            //if (FreeHierarchyTreeDescriptor.Sort != null) FreeHierarchyTreeDescriptor.Sort(items);
            //foreach (var i in items) result[i.FreeHierItem_ID] = i;
            return(result);
        }
        /// <summary>
        /// Генерация стандартного дерева Список OPCUA серверов
        /// </summary>
        private static ConcurrentDictionary <int, FreeHierarchyTreeItem> GenerateStandartTree_Dict_OPCUAServers(FreeHierarchyTreeDescriptor descriptor)
        {
            var items     = new List <FreeHierarchyTreeItem>();
            var result    = new ConcurrentDictionary <int, FreeHierarchyTreeItem>();
            var uaServers = UAHierarchyDictionaries.UaServers(Manager.UI.ShowMessage);

            if (uaServers == null)
            {
                return(null);
            }

            descriptor.NeedFindUaNode = true;

            foreach (var item in uaServers.Values)
            {
                UserRightsForTreeObject right;
                if (!Manager.User.AccumulateRightsAndVerify(item, EnumObjectRightType.SeeDbObjects, null, out right))
                {
                    continue;
                }

                var newItem = new FreeHierarchyTreeItem(descriptor, item)
                {
                    FreeHierItem_ID       = descriptor.GetMinIdAndDecrement(),
                    IncludeObjectChildren = true,
                    IsHideTi         = false,
                    FreeHierItemType = EnumFreeHierarchyItemType.UAServer,
                    NodeRights       = null,
                };

                newItem.Descriptor.Tree = result;

                items.Add(newItem);

                //дабавляем корневые узлы вручную
                //дальше будут подгружаться при раскрытии?
                List <TUANode> rootNodes = UAService.Service.UA_Get_RootNodes(item.UAServer_ID);
                foreach (var rootNode in rootNodes)
                {
                    TUANode node = null;
                    UAHierarchyDictionaries.UANodesDict.TryGetValue(rootNode.UANodeId, out node);
                    if (node == null)
                    {
                        continue;
                    }

                    FreeHierarchyTreeItem newItemNode = new FreeHierarchyTreeItem(newItem.Descriptor, node)
                    {
                        FreeHierItem_ID       = descriptor.GetMinIdAndDecrement(),
                        Parent                = newItem,
                        IncludeObjectChildren = true,
                        FreeHierItemType      = EnumFreeHierarchyItemType.UANode,
                        NodeRights            = right,
                    };

                    newItem.Children.Add(newItemNode);
                    newItem.Descriptor.Tree.TryAdd(newItemNode.FreeHierItem_ID, newItemNode);

                    //добавляем дочерние
                    //newItemNode.IncludeChildrenOPCNodes(newItemNode.Children, false);
                }
            }
            if (FreeHierarchyTreeDescriptor.Sort != null)
            {
                FreeHierarchyTreeDescriptor.Sort(items);
            }
            foreach (var i in items)
            {
                result[i.FreeHierItem_ID] = i;
            }
            return(result);
        }
        /// <summary>
        /// Генерация стандартного дерева FIAS адреса, которые используются
        /// </summary>
        private static ConcurrentDictionary <int, FreeHierarchyTreeItem> GenerateStandartTree_FIAS(bool IncludeHerarchyObjects, FreeHierarchyTreeDescriptor descriptor)
        {
            var result = new ConcurrentDictionary <int, FreeHierarchyTreeItem>();

            //добавляем корневые узлы
            IEnumerable <TFIASNode> rootNodes;

            if (!IncludeHerarchyObjects)
            {
                rootNodes = DeclaratorService.FIAS_Get_RootNodes();
            }
            else
            {
                rootNodes = DeclaratorService.FIASToHierarchy_Get_RootNodes();
            }

            if (rootNodes == null)
            {
                return(result);
            }

            foreach (var rootNode in rootNodes)
            {
                var newItemNode = new FreeHierarchyTreeItem(descriptor, rootNode, false, string.Empty, descriptor.GetMinIdAndDecrement(), null, true, nodeRights: null,
                                                            freeHierItemType: EnumFreeHierarchyItemType.FiasFullAddress)
                {
                    StringName = rootNode.StringName,
                    FIASNode   = rootNode,
                };

                newItemNode.Descriptor.Tree = result;

                //newItemNode.UpdateCountParents();

                //добавляем дочерние
                if (rootNode.IsChildrenExists)
                {
                    newItemNode.IncludeChildrenFIASNodes((rootNode.IsHierObjectExists || descriptor.Tree_ID == TreeTypeStandart_Dict_FIASToHierarchy));
                }

                result[newItemNode.FreeHierItem_ID] = newItemNode;
            }

            return(result);
        }