...

Создание и редактирование оргструктуры в сценариях

Тема в разделе "Примеры сценариев", создана пользователем kirillov, 22 окт 2025 в 17:46.

  1. kirillov

    kirillov Новичок

    Столкнулся с проблемой того, что при редактировании оргструктуры в сценариях методы
    addChild() и moveToParent() не работали. Точнее сказать await System.organisationStructure.save(tree) вроде бы и выполнялся без ошибок, но по факту изменения не сохранялись.
    Проблема была в том что изменения объекта OrganisationStructureItem несвязанного с переменной tree, в которую вы загрузили оргструктуру, а потом будете её сохранять, не влечёт измение этого дерева. О чём речь:

    Код:
    
        const tree await System.organisationStructure.fetchTree();
        const 
    parent await System.organisationStructure.search().where(=> f.__id.eq("parent_uid")).first();
        const 
    org_item await System.organisationStructure.search().where(=> f.__id.eq("uid")).first();
        
    org_item!.moveToParent(parent!);
        const 
    errors await System.organisationStructure.save(tree);
    Несмотря на то, что и parent и org_item существуют в текущей оргструктуре, изменения не сохранятся.
    Анологично если мы передаём OrganisationStructureItem в функцию для постройки дерева.
    Код:
    
        const tree await System.organisationStructure.fetchTree();
        const 
    parent await System.organisationStructure.search().where(=> f.__id.eq("parent_uid")).first();
        const 
    childs parent!.getChildren();
        for (
    let child of childs) {
            
    CreateChilds(child);
        }
        const 
    errors await System.organisationStructure.save(tree);

        function 
    CreateChilds(parentOrganisationStructureItem): void {
            const 
    child System.organisationStructure.createItem("Department"OrganisationStructureItemType.Department)
            
    parent.addChild(child);
        }
    Несмотря на то что мы получили дочерние элменты методом getChildren(), этот код не будет работать как мы ожидаем.

    Правильный способ получения ссылки на элмент оргструктуры это искать его в самом дереве tree

    Код:
    
        const tree await System.organisationStructure.fetchTree();
        const 
    org_item tree.find("Department name");
    Поиск по названию вернёт первый попавшийся элемент, поэтому лучше искать другим способом, через корень дерева.

    Код:
    
        const tree await System.organisationStructure.fetchTree();
        const 
    root tree.getRoot();
        const 
    item root.find(=> i.data.name === 'Менеджеры' && i.data.type === OrganisationStructureItemType.Group);
    А в функцию можно передать id элемента и найти внутри неё элемент тем же способом по id.

    Код:
    
        const tree await System.organisationStructure.fetchTree();
        const 
    root tree.getRoot();
        const 
    childs root!.getChildren();
        for (
    let child of childs) {
            
    CreateChilds(child.id);
        }
        const 
    errors await System.organisationStructure.save(tree);

        function 
    CreateChilds(parent_idstring): void {
            const 
    parent root.find(i=>i.id == parent_id);
            const 
    child System.organisationStructure.createItem("Department"OrganisationStructureItemType.Department);
            
    parent!.addChild(child);
            const 
    childs parent!.getChildren();
        }