Как добавить новые файлы в пользовательское поле сделки Битрикс24, сохранив существующие

    При работе с коробочной версией Битрикс24 возникает задача: добавить новые файлы в пользовательское поле сделки, имеющее тип "Файл" с множественным выбором, при этом не удаляя уже загруженные документы.

    Стандартный подход через API часто приводит к перезаписи поля, когда новые файлы замещают старые. Для корректного решения необходимо объединить идентификаторы существующих файлов с данными новых.

    Алгоритм решения

    Процесс состоит из нескольких ключевых шагов:

    • Получение текущих данных сделки: Загрузите информацию о сделке, включая массив с идентификаторами уже прикрепленных файлов.
    • Подготовка массива для обновления: Создайте новый массив, который будет содержать как старые ID файлов, так и данные новых файлов в специальном формате.
    • Формирование данных для новых файлов: Каждый новый файл должен быть представлен в виде массива с ключом fileData, содержащего имя файла и его содержимое в кодировке base64.
    • Вызов метода обновления: Передайте сформированный объединенный массив в поле при обновлении сделки.

    Пример реализации на PHP

    Ниже представлен рабочий код, который решает поставленную задачу. Предполагается, что у вас уже подключена библиотека CRest.

    require_once(__DIR__.'/crest.php');
    
    // Пути к новым файлам для добавления
    $filePaths = [
        __DIR__ . '/filesForTest/test.docx',
        __DIR__ . '/filesForTest/test2.docx',
    ];
    
    // Получаем данные сделки
    $deal = CRest::call('crm.deal.get', [
        'id' => 159
    ]);
    
    // Извлекаем массив ID существующих файлов из пользовательского поля
    $existingFiles = $deal['result']['UF_CRM_1766393619832'] ?? [];
    
    // Инициализируем массив для итогового обновления
    $filesForUpdate = [];
    
    // Добавляем ID старых файлов
    foreach ($existingFiles as $fileId) {
        $filesForUpdate[] = $fileId;
    }
    
    // Подготавливаем и добавляем новые файлы
    foreach ($filePaths as $path) {
        if (!file_exists($path)) {
            continue; // Пропускаем несуществующие файлы
        }
        // Формируем массив в формате, ожидаемом API Битрикс24
        $filesForUpdate[] = [
            'fileData' => [
                basename($path),
                base64_encode(file_get_contents($path))
            ]
        ];
    }
    
    // Выполняем обновление сделки с объединенным списком файлов
    $result = CRest::call('crm.deal.update', [
        'id' => 159,
        'fields' => [
            'UF_CRM_1766393619832' => $filesForUpdate
        ]
    ]);
    
    // Для отладки можно вывести сформированный массив
    echo '<pre>';
    print_r($filesForUpdate);
    echo '</pre>';

    Ключевые моменты

    • Формат данных: API Битрикс24 требует передавать существующие файлы как их числовые ID, а новые - как вложенные массивы fileData.
    • Проверка существования файлов: Код включает проверку file_exists для избежания ошибок.
    • Идентификатор поля: Замените UF_CRM_1766393619832 на код вашего конкретного пользовательского поля.
    • ID сделки: Укажите актуальный ID вашей сделки вместо значения 159.

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