Перейти к основному содержанию
`Ctrl`+`K`

# Назначение участников маршрута из атрибутов документа

Используется, чтобы назначить пользователей на этапы маршрута на основе значений, хранящихся в атрибутах документа. Поддерживает одновременное назначение нескольких ролей, например исполнитель, подписывающий и согласовывающий. Для каждой роли выполняется проверка существования учетной записи; при необходимости допускаются исключения на основе параметров документа.

Место применения: `Приложение "Управление бизнес-процессами" > Справочники > Схема бизнес-процесса > [Процесс] > Редактировать > Вкладка "Процедуры" > Поле процедуры выполнения`.

Тип: JEXL-скрипт

    // Получаем информацию о бизне-процессе и записываем переменную с ним и документом
    var idProc = Bpm_PrStateApi.getProcessId(idpPrState); // Получаем id поцесса
    var idvDoc = Bpm_PrDocApi.getProcDocByPrState(idpPrState); // Получаем id состояния процесса для которого выполняется процедура
    var ropProc = Bpm_ProcessApi.load(idProc); // Записываем процесс в переменную как объект выполняемой процедуры

    // Получаем параметры-коды объектных привилегий схемы бизнес-процесса и создаем субъектов бизнес-процесса как объекты выполняемой процедуры
    var paramArr = param.split(";");

    // Исполнитель
    var svEmployee = paramArr[0];
    var ropTargetOptEmployee = Bpm_PrSubjectApi.getByPSSubject(ropProc, svEmployee);
    var ropTargetEmployee = ropTargetOptEmployee.get();
    var semployee = `
    select coalesce(pers.iduser, 0) as iduseremployee
    from wf_doc doc
    left join bs_employee e on cast(doc.jobjattrs_dz ->> 'idR1EmployeeSng' as int8) = e.id
    left join bs_person pers on e.idperson = pers.id
    where doc.gid = '${idvDoc}'
    `;

    // Подписывающий
    var svEmployeeSign = paramArr[2];
    var ropTargetOptEmployeeSign = Bpm_PrSubjectApi.getByPSSubject(ropProc, svEmployeeSign);
    var ropTargetEmployeeSign = ropTargetOptEmployeeSign.get();
    var semployeesign = `
    select
    coalesce(pers.iduser, 0) as iduseremployeesign
    ,bo.scode as bocode
    from wf_doc doc
    left join bs_employee e on cast(doc.jobjattrs_dz ->> 'idR1EmployeeSignSng' as int8) = e.id
    left join bs_person pers on e.idperson = pers.id
    left join bs_bisobj bo on doc.idbisobj = bo.id
    where doc.gid = '${idvDoc}'
    `;

    // Согласовывающий
    var svEmployeeMain = paramArr[1];
    var ropTargetOptEmployeeMain = Bpm_PrSubjectApi.getByPSSubject(ropProc, svEmployeeMain);
    var ropTargetEmployeeMain = ropTargetOptEmployeeMain.get();
    var semployeemain = `
    select coalesce(pers.iduser, 0) as iduseremployeemain
    from wf_doc doc
    left join bs_employee e on cast(doc.jobjattrs_dz ->> 'idR1EmployeeMainSng' as int8) = e.id
    left join bs_person pers on e.idperson = pers.id
    where doc.gid = '${idvDoc}'
    `;

    // Установка пользователей с селекционного экрана в качестве подписантов

    // Исполнитель
    var lemployee = sql(semployee).asList();
    for (w:lemployee){
    	if(w.iduseremployee == 0) {raise('Внимание! Для справки не указан исполнитель.');}
    	Bpm_PrSubjUserApi.register(ropTargetEmployee , w.iduseremployee, 0B, 0B);
    }

    // Подписывающий
    var lemployeesign = sql(semployeesign).asList();
    for (w:lemployeesign){
    	if(w.iduseremployeesign == 0 and w.bocode != '0100') {raise('Внимание! Для справки не указан подписывающий.');}
    	Bpm_PrSubjUserApi.register(ropTargetEmployeeSign , w.iduseremployeesign, 0B, 0B);
    }

    // Согласовывающий
    var lemployeemain = sql(semployeemain).asList();
    for (w:lemployeemain){
    	if(w.iduseremployeemain == 0) {raise('Внимание! Для справки не указан согласовывающий.');}
    	Bpm_PrSubjUserApi.register(ropTargetEmployeeMain, w.iduseremployeemain, 0B, 0B);
    }