use Bitrix\Crm\Service\Container;
/** @var int $entityTypeId */
/** @var int $itemId */
/** @var int[] $sourceFileIds */
/** @var string $ufCode */
$container = Container::getInstance();
$factory = $container->getFactory($entityTypeId);
$item = $factory?->getItem($itemId);
if (!$factory || !$item)
{
throw new \RuntimeException('CRM item not found');
}
$field = $factory->getFieldsCollection()->getField($ufCode);
if (!$field || !$field->isFileUserField())
{
throw new \RuntimeException('CRM file field not found');
}
$fileUploader = $container->getFileUploader();
$resultFileIds = [];
foreach ($sourceFileIds as $sourceFileId)
{
$fileArray = \CFile::MakeFileArray((int)$sourceFileId);
if (!is_array($fileArray) || $fileArray === [])
{
continue;
}
$checkResult = $fileUploader->checkFile($field, $fileArray);
if (!$checkResult->isSuccess())
{
continue;
}
$savedFileId = $fileUploader->saveFilePersistently($field, $fileArray);
if ($savedFileId > 0)
{
$resultFileIds[] = $savedFileId;
}
}
$item->set($ufCode, $field->isMultiple() ? $resultFileIds : ($resultFileIds[0] ?? null));
$operationResult = $factory->getUpdateOperation($item)->launch();
if (!$operationResult->isSuccess())
{
throw new \RuntimeException(
implode('; ', array_map(static fn($e) => $e->getMessage(), $operationResult->getErrors()))
);
} |