Для того, чтобы сделать подмену файла на событии OnBeforeCrmDealUpdate в Битрикс24, вам потребуется использовать несколько компонентов и событий.
Во-первых, вам нужно создать пользовательское событие в файле /bitrix/modules/main/include.php. Например, вы можете назвать его "onBeforeCrmDealUpdate". Это позволит вам перехватывать событие OnBeforeCrmDealUpdate и выполнять свой код.
Во-вторых, вам нужно создать компонент для работы с этим событием. Мы будем использовать компонент "bitrix:crm.deal.details". Создайте копию файла /bitrix/components/bitrix/crm.deal.details/component.php и назовите его, например, my_deal_details.php.
В этом новом файле компонента my_deal_details.php вам нужно изменить метод executeComponent(). В этом методе вы можете обратиться к методу CAllCrmDeal::Update() для обновления сделки, проверить, было ли изменено поле файлов сделки, и выполнить необходимую логику по подмене файла.
Примерно так будет выглядеть код:
class CCrmDealDetailsComponent extends CBitrixComponent { public function executeComponent() { if (!$this->checkModules()) { return; } if ($this->StartResultCache()) { if ($this->arParams['ELEMENT_ID'] > 0) { $dealFields = CAllCrmDeal::GetByID($this->arParams['ELEMENT_ID']); // Проверяем, было ли изменено поле файлов if ($dealFields['UF_CRM_XXX'] !== $_POST['UF_CRM_XXX']) { // Выполняем подмену файла $newFileId = ... ; // Ваш код для подмены файла // Обновляем поле файлов сделки $dealFields['UF_CRM_XXX'] = $newFileId; CAllCrmDeal::Update($this->arParams['ELEMENT_ID'], $dealFields); } // Далее выполняем стандартный код компонента ... } $this->includeComponentTemplate(); } } }
Обратите внимание, что UF_CRM_XXX - это пользовательское поле типа "Привязка к файлу". Чтобы подменить файл, вам нужно загрузить новый файл на сервер (например, с помощью метода CFile::SaveFile() или CFile::SaveFile() класса CAllMain в вашем коде), и затем использовать ID файла для обновления соответствующего поля.
Наконец, чтобы использовать новый компонент my_deal_details.php вместо стандартного компонента bitrix:crm.deal.details, вам нужно создать шаблон компонента с таким же именем и местом размещения. Измените файл /local/templates/.default/components/bitrix/crm.deal.details/.default/template.php, переименуйте его в my_deal_details.php и внесите необходимые изменения.
Теперь при каждом обновлении сделки и проверке, было ли изменено поле файлов, будет вызываться метод executeComponent() нового компонента my_deal_details.php, который позволит вам выполнить необходимые действия по подмене файла.