Назначение участников маршрута из атрибутов документа#
Используется, чтобы назначить пользователей на этапы маршрута на основе значений, хранящихся в атрибутах документа. Поддерживает одновременное назначение нескольких ролей, например исполнитель, подписывающий и согласовывающий. Для каждой роли выполняется проверка существования учетной записи; при необходимости допускаются исключения на основе параметров документа.
Место применения: Приложение "Управление бизнес-процессами" > Справочники > Схема бизнес-процесса > [Процесс] > Редактировать > Вкладка "Процедуры" > Поле процедуры выполнения.
Тип: 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);
}