Прикрепление нескольких файлов к веб-форме Битрикс и отправка их в Битрикс24

  1. В шаблоне вывода формы создаем множественное поле

2. Создаем дополнительные поля типа Строка, где будут ссылки на файлы храниться

3. На событие добавление результата вешаем подобное:

function onBeforeResultAddHandler($WEB_FORM_ID,&$arFields,&$arrVALUES){
	$input_id = "";
	switch($WEB_FORM_ID){//id вебформы
		case 5:
		$input_id = 62;//id ответа, где будут ссылки на файлы
		break;
	}
	if(!empty($_FILES) && $input_id!=""){
			$files = reset($_FILES);
			foreach($files["name"] as $id=>$name){
				$arFile = array(
				"name" => $name,
				"tmp_name" => $files["tmp_name"][$id],
				"type" => $files["type"][$id],
				"MODULE_ID"=>"form",
				"size"=>$files["size"][$id]
				);
				
				$res = CFile::SaveFile($arFile,"form_result");//сохраняем файлы и создаем массив ссылок на них
				if($res){
					$arFiles[] = "https://www.bwt.ru".CFile::GetPath($res);
				}
			}
			$arrVALUES["form_text_".$input_id] = implode("; ",$arFiles);
		}
	return true;
}

Теперь при сохранении результата в файловом поле будет пусто, но файлы сохранятся и (ссылки на них).

4. В моем случае обработчик данных с форм самописный (обращение к нему идет по ajax), последовательность приблизительно: следующая:

$formId = intval($_POST["WEB_FORM_ID"]);
CForm::Check($formId, false, false, "Y", "N");//проверяем форму
if ($resultId = CFormResult::Add($formId)) {//Добавляем результат
        CFormResult::Mail($resultId);//отправляем письмо, если нужно
        $dbRes = CFormCrm::GetByFormID($formId);
        $arLink = $dbRes->Fetch();
        if (is_array($arLink) && $arLink['LINK_TYPE'] == CFormCrm::LINK_AUTO) {//если есть связь с CRM - создаем лид
            $oForm = new CFormCrm();
            $lead_id = $oForm->AddLead($formId, $resultId, $arLink);
        }

        if ($lead_id) {//если лид есть
            /* лид в Битрикс24 */

            $b24_response = json_decode(get_token());//тут вызов подключения к битрикс24, здесь кода не будет (важен принцип)
            $leadParam = array();
            $leadParam["ID"] = $lead_id;
            $arFormResults = array();
            $arFormAnswers = array();
            $arFormResult = CFormResult::GetDataByID($resultId, array("DOCUMENT_LINK"), $arFormResults, $arFormAnswers);//DOCUMENT_LINK - символьный код поля со списком ссылок
         
	    if(reset($arFormResult["DOCUMENT_LINK"])["USER_TEXT"]!=""){
				$arFiles = explode("; ",reset($arFormResult["DOCUMENT_LINK"])["USER_TEXT"]);
				foreach($arFiles as $file){
					$leadParam["FIELDS"]["UF_CRM_1613738699"][] = array('fileData'=>array(end(explode("/",$file)), base64_encode(file_get_contents($_SERVER["DOCUMENT_ROOT"].end(explode("bwt.ru",$file))))));//UF_CRM_1613738699 - это id нужного пользовательского поля из CRM
				}
			}
	
            query($b24_response->access_token, 'crm.lead.update', $leadParam);//обновляем лид
            /* лид в Битрикс24 */
        }
    }

После передачи лида обновляем его любым удобным способом, прикрепляя туда содержимое файлов в base64.

Минус — при удалении результаты формы файлы сами не исчезнут.