...

Получить все приложения/атрибуты приложения и записать их в переменную с типом категория

Тема в разделе "Примеры сценариев", создана пользователем ksannikov, 10 июл 2025 в 12:56.

  1. ksannikov

    ksannikov Участник

    Функция инициализации:
    Код:
    
    /* Client scripts module */
    declare const consoleany
    declare const windowany

    interface IApp {
        
    codestring,
        
    nsINamespace,
        
    namestring
    }

    interface 
    INamespace {
        
    codestring,
        
    namestring
    }

    /** поля приложения которые игнорируются */
    const ignor_fields = [
        
    '__directory',
        
    '__subscribers',
        
    '__externalId',
        
    '__tasks',
        
    '__tasks_earliest_duedate',
        
    '__tasks_performers',
        
    '__debug',
        
    '__deletedAt',
        
    '__externalProcessMeta',
        
    '__statusChangedAt',
        
    '__printForm']

    /** токен из администрирование -> токены */
    const API_TOKEN = `af9790b0-8224-4831-84b7-d28909d700dc`

    let base_urlstring ''

    /** функция инициализации */
    async function onInit(): Promise<void> {
        
    base_url System.company.url
        
    const namespaces await getNamespaces()
        if (
    namespaces?.length) {
            const 
    apps_arr await Promise.all(namespaces.map(=> getApps(f)));
            
    let all_appsIApp[] = []
            
    all_apps all_apps.concat(...apps_arr)
            for (
    let item of all_apps) {
                
    Context.fields.application.data.variants.push({
                    
    name: `${item.ns.name}/${item.name}`,
                    
    code: `${item.ns.code}.${item.code}`
                })
            }
        }
    }
    Функции для получения разделов/приложений:

    Код:
    
    /** получить разделы */
    async function getNamespaces(): Promise<INamespace[]> {
        
    let namespacesINamespace[] = []
        
    let res await fetch(`${base_url}/pub/v1/scheme/namespaces`, {
            
    method'GET',
            
    headers: {
                
    'Content-Type''application/json',
                
    'Authorization': `Bearer ${API_TOKEN}`,
            }
        })

        if (!
    res.ok) {
            
    let text await res.text()
            
    console.log(`Ошибка при отправке запроса: ${res.status} ${res.statusText} - ${text}`);
            return []
        } else {
            try {
                
    let json_result await res.json();
                
    //получаем разделы которые не скрыты и не глобальные
                
    const namespaces_json json_result.result.result.filter((fany) => f.namespace == "global" && f.hidden == false && f.__deletedAt == null)
                
    namespaces_json.map((fany) => {
                    
    namespaces.push({
                        
    codef.code,
                        
    namef.name
                    
    })
                })
            }
            catch (
    err) {
                
    console.log(`Ошибка при формировании ответа: ${err.message}`);
                return []
            }
        }

        return 
    namespaces
    }

    /**получить приложения из раздела */
    async function getApps(nsINamespace): Promise<IApp[]> {
        const 
    curr_ns_appsIApp[] = []
        
    let res await fetch(`${base_url}/pub/v1/scheme/namespaces/${ns.code}/apps`, {
            
    method'GET',
            
    headers: {
                
    'Content-Type''application/json',
                
    'Authorization': `Bearer ${API_TOKEN}`,
            }
        })

        if (!
    res.ok) {
            
    let text await res.text()
            
    console.log(`Ошибка при отправке запроса: ${res.status} ${res.statusText} - ${text}`);
            return []
        } else {
            try {
                
    let json_result await res.json();
                const 
    apps_json json_result.result.result
                apps_json
    .map((fany) => {
                    
    curr_ns_apps.push({
                        
    codef.code,
                        
    nsns,
                        
    namef.name
                    
    })
                })
            }
            catch (
    err) {
                
    console.log(`Ошибка при формировании ответа: ${err.message}`);
                return []
            }
        }

        return 
    curr_ns_apps
    }
    Фунция при изменении значения в поле "Приложение":

    Код:
    
    async function getAttrs():Promise<void> {
        
    //очищаем старые варианты
        
    if (Context.fields.attributes.data.variants?.length) {
            for (
    let i Context.fields.attributes.data.variants.length0i--) {
                
    Context.fields.attributes.data.variants.pop()
            }
        }
        if(!
    Context.data.application) return
        const [
    nscode] = (Context.data.application.code as string).split('.')
        
    let res await fetch(`${base_url}/pub/v1/scheme/namespaces/${ns}/apps/${code}`, {
            
    method'GET',
            
    headers: {
                
    'Content-Type''application/json',
                
    'Authorization': `Bearer ${API_TOKEN}`,
            }
        })
        if (!
    res.ok) {
            
    let text await res.text()
            
    console.log(`Ошибка при отправке запроса: ${res.status} ${res.statusText} - ${text}`);
        } else {
            try {
                
    let json_result await res.json();
                const 
    fields json_result.application.fields.filter((fany) => ignor_fields.indexOf(f.code) < 0);
                for (
    let field of fields) {
                    
    let code ''
                    
    let name ''
                    
    //для дат/время дополнительно записываем подтип
                    
    if (field.type == 'DATETIME') {
                        
    code = `${field.code}.${field.type}.${field.view.data.additionalType}`
                        
    name field.view.name
                    
    } else {
                        
    code = `${field.code}.${field.type}`
                        
    name field.view.name
                    
    }
                    
    Context.fields.attributes.data.variants.push({codecodenamename})
                }
            }
            catch (
    err) {
                
    console.log(`Ошибка при формировании ответа: ${err.message}`);
            }
        }
    }
    Более подробно можно посмотреть в ролике - ролик

    Еще больше полезной информации в ТГ канале WhatDaELMA365