Обработчик событий для бизнес-процесса "отпуск", bitrix24

Если у вас в компании используется бизнес-процесс "отпуск", и вам хочется добавить некоторые ограничения и вывод ошибок при создании бизнес-процесса. В таком случае лучшим решение будет воспользоватся обработчиком событий и добавить свои условия и вывод текстовых ошибок на своё усмотрение. В данной задаче мне необходимо было решить такие вопросы:

  • Если сотрудник работает менее 6-ти месяцев создание заявки не доступно
  • Отпуск в Августе и Декабре в компании запрещён

Ниже будет приведён пример каким образом было сделано, а вы уже по своему усмотрению изменяйте код.


//Element Add
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", Array("BeforeElementAddAndtElemenUpdate", "OnBeforeIBlockElementAddHandler"));

class BeforeElementAddAndtElemenUpdate
{
    function OnBeforeIBlockElementAddHandler(&$arFields)
    {
    	if($arFields['IBLOCK_ID'] == 103)
    	{
    		global $USER, $APPLICATION;
    		$rsUser = CUser::GetByID($arFields['MODIFIED_BY']);
			$arUser = $rsUser->Fetch();

			//Check on the availability of holiday
			if($arFields['PROPERTY_VALUES'][432] == 3147 || $arFields['PROPERTY_VALUES'][432] == 3182)
			{
				if($arUser['UF_WORK_DATE'] == "")
				{
		            $APPLICATION->throwException("Ошибка. Создание заявки не доступно. В вашем профеле сотрудника не указана дата приёма на работу.");
		            return false;
				}
				else
				{
					$recruitment = strtotime($arUser['UF_WORK_DATE'])+15811200;
					$recruitment2 = strtotime($arFields['PROPERTY_VALUES'][429]['n0']['VALUE']);

					if($recruitment > $recruitment2)
					{
						$APPLICATION->throwException("Ошибка. Создание заявки не доступно, вы работаете меньше 6-ти месяцев.".$interval->m);
		            	return false;
					}
				}
			}

			//Add position
			if($arUser['UF_DOLJNOST']>0)
			{
				$res = CIBlockElement::GetList(Array("SORT"=>"ASC"), Array("ID"=>$arUser['UF_DOLJNOST'], "ACTIVE"=>"Y"), false, false, Array("ID", "NAME"));

				while($ob = $res->GetNextElement())
				{
					$arFields2 = $ob->GetFields();
					$arFields['PROPERTY_VALUES'][558]['n0']['VALUE'] = $arFields['PROPERTY_VALUES'][558]['n0']['VALUE'].' ('.$arFields2['NAME'].')';
				}
			}

            $from_time  = strtotime($arFields['PROPERTY_VALUES'][429]['n0']['VALUE']);
            $to_time  = strtotime($arFields['PROPERTY_VALUES'][428]['n0']['VALUE']);

            $value_time = 0;

            if($from_time>$to_time)
            {
            	$APPLICATION->throwException("Ошибка. Дата начала и дата окончания отпуска указаны в обратном порядке, укажите правильно даты отпуска.");
		            return false;
            }
            else
            {
            	$count_different = intval( (($to_time - $from_time)/86400)+1 );
            	for ($i=0; $i < $count_different; $i++)
                {
                	$now_tiem = $from_time+(86400*$i);
                	$date_number = date('N', $now_tiem);
                	$month_number = date('n', $now_tiem);

                	//August, December
                	if( ($month_number==8 || $month_number==12) && ($arFields['PROPERTY_VALUES'][432] != 3149) )
                	{
                		$APPLICATION->AddHeadString('',true);
                		$APPLICATION->throwException("Отпуск в Августе и Декабре в компании запрещён.");
		            	return false;
                	}

                	//Weekend
                	if($date_number!=6 && $date_number!=7)
                	{
                		$value_time++;
                	}
                }
            }
            
                //Amount of days
    		$arFields['PROPERTY_VALUES'][606]['n0']['VALUE'] = $value_time;

    		//Add create user in field (607)
    		$arFields['PROPERTY_VALUES'][607]['n0']['VALUE'] = $arUser['ID'];
    	}
    }
}