...

Сохраняем данные задачи без её выполнения

Тема в разделе "Компоненты и интерфейс", создана пользователем ksannikov, 26 авг 2026 в 16:07.

  1. ksannikov

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

    Думаю, многие сталкивались с довольно частым запросом:
    Пользователь заполняет задачу, но пока не готов её выполнить. Хочется нажать «Сохранить», закрыть форму и вернуться к заполнению позже.

    Из коробки отдельного сохранения данных задачи без её выполнения в ELMA365 нет.


    Обычно эту задачу решают примерно так:
    Задача → переход → эта же задача

    Пользователь нажимает условное «Сохранить», текущая задача завершается и сразу создаётся новая.

    Работает? Да. Но есть нюанс: это уже другая задача.

    Старая закрывается, появляется новая, меняются даты, идентификаторы и история выполнения. В результате, например, исполнительская дисциплина уже не отражает реальную картину.

    Поэтому я сделал небольшой универсальный виджет «Сохранить изменения», который можно добавить практически на любую форму задачи.

    Подключается он через обычный виджет «Код»:
    Код:
    
    <%= UI.widget.render(
        
    'ext_f418f0b8-d580-45bc-9f74-906057ea7eb1@task_save'//здесь нужно указать расположение вашего виджета
        
    task_contextContext }
    ) %>
    В самом виджете есть поле task_context типа «Произвольный тип».
    То есть при открытии задачи мы просто передаём в него весь её контекст. А дальше всё довольно просто

    По кнопке «Сохранить изменения» собираем данные формы и обновляем контекст уже запущенного экземпляра процесса:

    Код:
    
    async function save(): Promise<void> {
        const 
    processId =
            
    Context.data.task_context.dataWithControls.context.contextId;

        if (!
    processId) return;

        const 
    context = {} as any;

        for (const 
    key in Context.data.task_context._fields) {
            if (
    key.includes('__')) continue;

            
    context[key] =
                
    Context.data.task_context.data[key];
        }

        const 
    process await System.processes
            
    ._searchInstances()
            .
    where(=> f.__id.eq(processId))
            .
    first();

        if (!
    process) {
            
    console.log(`process with id=${processId} not found`);
            return;
        }

        
    await process.updateContext(
            
    context,
            
    'Сохранение данных задачи'
        
    );
    }
    В результате пользователь может:
    открыть задачу → что-то заполнить → сохранить → продолжить позже

    При этом:
    — задача не выполняется
    — новая задача не создаётся
    — текущий маршрут процесса никуда не двигается
    — введённые данные сохраняются в контексте процесса

    Сам виджет при этом универсальный: создали его один раз и дальше просто подключаем на нужные формы задач.

    Получилось буквально несколько строк кода, но закрывает довольно распространённый запрос без переходов «из задачи в саму себя» и прочих обходных схем.

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