Бизнес-процессы в Битрикс 24: сложности внедрения
- Октябрь 13, 2015
-
Бедросова Юлия
- CRM, Битрикс 24, кейсы
Казалось бы, дизайнер бизнес-процессов в Битрикс 24 – мощнейший механизм, позволяющий автоматизировать все, что угодно. Никакого программирования – вытаскивай кубики-активити – и любой воркфлоу спроектирован за 2 часа.
Однако же потребности реальных пользователей, их ожидания, порой серьезно расходятся с реализованными в Битрикс 24 возможностями, и процесс внедрения Битрикс 24 либо превращается, как в том анекдоте про экскурсовода – в обучение пользователей обходиться без того, что они считают естественным, либо растягивается на месяцы работы.
Возьмем, к примеру, банальный бизнес-процесс оформления больничного листа, который не раз автоматизировал, наверное, каждый внедренец Битрикс 24. И в каждой новой компании – по-разному.
Дано: трехэтапное утверждение больничного листа:
Сначала Больничный лист утверждает начальник отдела Business Manager, потом ответственный из отдела кадров HR, а уже потом ответственный за начисление заработной платы Payroll.
Какие сложности могут возникнуть при проектировании такого простого бизнес-процесса?
Сложность №1: тестирование в условиях когда пользователи уже активно используют портал. Понятное дело: разработку БП приходится вести в девелоперской копии, перелогиниваясь для теста под различными участниками процесса. Перелогиниваться бывает достаточно муторно, а кроме того, должны быть протестированы и email-уведомления, к-е до поры – до времени не должны приходить реальным пользователям.
Для упрощения процесса тестирования мы заводим в каждом БП переменную для хранения пользователей, которым разрешена отладка – они могут протолкнуть процесс дальше в любом месте.
PHP
123456789101112 CModule::IncludeModule("bizproc");$arSelectFields = array("ID", "WORKFLOW_ID", "ACTIVITY", "ACTIVITY_NAME", "MODIFIED", "OVERDUE_DATE", "NAME", "DESCRIPTION", "PARAMETERS", "STATUS","USER_STATUS");$dbRecordsList = CBPTaskService::GetList(array("ID" => "DESC"),array('WORKFLOW_ID'=>'{=Workflow:ID}'),false,false,$arSelectFields);$arRecord = $dbRecordsList->getNext();$rootActivity = $this->GetRootActivity();$rootActivity->SetVariable("TaskLink", 'http://адреспортала/company/personal/bizproc/'.$arRecord['ID'].'/');
PHP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 CModule::IncludeModule("sale");use BitrixMainTypeDateTime;$date = new DateTime('{=Document:DATE_CREATE}');$date=$date->format("d-m-Y");if (!CSalePdf::isPdfAvailable()) die();$ID={=Document:ID};$IBLOCK_ID={=Document:IBLOCK_ID};$PROPS=array();$db_props = CIBlockElement::GetProperty($IBLOCK_ID, $ID);while($ar_props = $db_props->Fetch()){$PROPS[$ar_props['ID']]=$ar_props;}$pdf = new CSalePdf('P', 'pt', 'A4');$pageWidth = $pdf->GetPageWidth();$pageHeight = $pdf->GetPageHeight();$pdf->AddFont('Font', '', 'pt_sans-regular.ttf', true);$pdf->AddFont('Font', 'B', 'pt_sans-bold.ttf', true);$fontFamily = 'Font';$fontSize = 10.5;$margin = array('top' => 15 * 72/25.4,'right' => 15 * 72/25.4,'bottom' => 15 * 72/25.4,'left' => 15 * 72/25.4);$width = $pageWidth - $margin['left'] - $margin['right'];$pdf->SetDisplayMode(100, 'continuous');$pdf->SetMargins($margin['left'], $margin['top'], $margin['right']);$pdf->SetAutoPageBreak(true, $margin['bottom']);$pdf->AddPage();$pdf->SetFont($fontFamily, 'B', $fontSize*2);$pdf->Cell(0, 30, $pdf->prepareToPdf('{=Document:NAME}`s personal leave '.$date), 0, 0, 'C');$pdf->Ln();$pdf->Ln();$pdf->Ln();$pdf->Ln();$pdf->SetFont($fontFamily, '', $fontSize);$pdf->Cell(0, 15, $pdf->prepareToPdf('Request content:'), 0, 0, 'L');$pdf->Ln();$pdf->Ln();$ROW1=150;$Y=15;$pdf->Cell($ROW1, $Y, $pdf->prepareToPdf('Employee Name:'), 0, 0, 'L');$pdf->MultiCell(0, $Y, $pdf->prepareToPdf('{=Document:NAME}'), 0, 'L');$pdf->Cell($ROW1, $Y, $pdf->prepareToPdf('First day of leave:'), 0, 0, 'L');$pdf->MultiCell(0, $Y, $pdf->prepareToPdf('{=Document:PROPERTY_225}'), 0, 'L');$pdf->Cell($ROW1, $Y, $pdf->prepareToPdf('Last day of leave:'), 0, 0, 'L');$pdf->MultiCell(0, $Y, $pdf->prepareToPdf('{=Document:PROPERTY_226}'), 0, 'L');$pdf->Cell($ROW1, $Y, $pdf->prepareToPdf('Type of leave:'), 0, 0, 'L');$pdf->MultiCell(0, $Y, $pdf->prepareToPdf('{=Document:PROPERTY_227}'), 0, 'L');$myfile='temp.pdf';$pdf->Output($myfile, 'F');if (!copy($myfile,$_SERVER['DOCUMENT_ROOT'].'/docs/appforms/forms/personal_leave_requests/request_'.$ID.'.pdf')){ }else{ unlink($myfile); }
Об авторе:
Инженер-программист по образованию, web-программист по призванию, Битрикс-программист по любви и 1с-программист по стечению обстоятельств, руководитель команды web-разработчиков, внедренец 1С-Битрикс и Битрикс24, основатель одноименной студии.
Я вас поняла. Это не эквивалентно. Проверьте свой вариант, когда аппрувящих несколько. Один – проаппрувил, а другой уже потом – когда таск не актуален – заходит по той же ссылке из письма.
Попробуйте в ссылке на задание БП указывать не ID задания, а ID самого БП. Которая есть строка с точкой.
Нужна именно ссылка на страницу конкретного таска. Она формируется с использованием ID таска.
С удовольствием посмотрю альтернативные варианты решения данной задачи, допускаю, что их может быть миллион.
Дня каждого вида документа нужна своя форма pdf. Поэтому не совсем понятно, как сделать общее действие. А вот для вашего случая на Б24 можно воспользоваться rest-действиями и реализовать задуманное.
Попробуйте в ссылке на задание БП указывать не ID задания, а ID самого БП. Возможно вы избавитесь от части кода.