Вы уже правильно ответили в своем вопросе:
Как прикрепить файл к сделке в множественное поле типа Файл?
1) При работе с коробочным API использование облачного API не допустимо.
Вместо конструкции:
$fields['UF_CONTRACT_REGISTER_DOCUMENT'][] = [
'fileData' => [
preg_replace('#.*/#', '', $resPdf['path']),
base64_encode(file_get_contents($protocol . '://' . $_SERVER["SERVER_NAME"] . $resPdf['path']))
]
];
Вам необходимо использовать \CFile::MakeFileArray() в который вы передадите абсолютный путь к необходимому файлу.
2) Не обязательно получать все поля сделки сразу. Для начала имеет смысл проверить: а пришло ли у вас в $fields поле UF_CONTRACT_REGISTER_DOCUMENT. Дело в том, что в новой карточке к вам может прийти только NAME (например меняете заголовок) или набор других полей. Нет смысла каждый раз получать эти поля и сравнивать с возможным null-значением ибо null значение всегда не будет равно существующему элементу.
Можно использовать для проверки конструкцию array_key_exists('UF_CONTRACT_REGISTER_DOCUMENT', $fields)
3) Генерация pdf файла может занять продолжительное время, а запрос на сохранение имеет таймаут в 30 секунд. Если вы не успеете то для пользователя он вызовет бесконечную загрузку и нерабочую карточку. Имеет смысл делать отложенную генерацию. т.е. регистрировать агента на дальнейшую генерацию или использовать другие механизмы для заполнения данного поля