...

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

Тема в разделе "Скрипты и разработка", создана пользователем ksannikov, 10 июл 2025.

  1. ksannikov

    ksannikov Активный участник

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

    interface IApp {
        
    code: string,
        
    ns: INamespace,
        
    name: string
    }

    interface 
    INamespace {
        
    code: string,
        
    name: string
    }

    /** поля приложения которые игнорируются */
    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_url: string = ''

    /** функция инициализации */
    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(f => getApps(f)));
            
    let all_apps: IApp[] = []
            
    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 namespaces: INamespace[] = []
        
    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((f: any) => f.namespace == "global" && f.hidden == false && f.__deletedAt == null)
                
    namespaces_json.map((f: any) => {
                    
    namespaces.push({
                        
    code: f.code,
                        
    name: f.name
                    
    })
                })
            }
            catch (
    err) {
                
    console.log(`Ошибка при формировании ответа: ${err.message}`);
                return []
            }
        }

        return 
    namespaces
    }

    /**получить приложения из раздела */
    async function getApps(ns: INamespace): Promise<IApp[]> {
        const 
    curr_ns_apps: IApp[] = []
        
    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((f: any) => {
                    
    curr_ns_apps.push({
                        
    code: f.code,
                        
    ns: ns,
                        
    name: f.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.length; i > 0; i--) {
                
    Context.fields.attributes.data.variants.pop()
            }
        }
        if(!
    Context.data.application) return
        const [
    ns, code] = (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((f: any) => 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({code: code, name: name})
                }
            }
            catch (
    err) {
                
    console.log(`Ошибка при формировании ответа: ${err.message}`);
            }
        }
    }
    Более подробно можно посмотреть в ролике - ролик

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