Назад

Битрикс API – копирование свойств и элементов

Главная
Блог
Битрикс API – копирование свойств и элементов

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

В этой статье вы найдете готовые PHP-скрипты, которые помогут автоматизировать процессы копирования свойств и элементов между инфоблоками, обеспечивая точность и экономию времени.

Зачем это нужно?

  • Безопасное обновление данных: Вы можете создать копию свойства для тестирования новых функций, не затрагивая рабочее поле.

  • Миграция данных: При изменении структуры сайта часто требуется перенести элементы в другой инфоблок.

  • Исправление ошибок: Если данные были выгружены некорректно (как в примере автора, когда инфоблок "оказался не там"), скрипт поможет быстро их восстановить.

Важные предупреждения перед началом

  1. Бэкап! Перед запуском любых скриптов, которые изменяют данные, обязательно сделайте полную резервную копию базы данных.

  2. Тестовый стенд. Проверяйте скрипт на тестовой копии сайта, а не на боевом сервере.

  3. Внимательность. Внимательно проверьте все идентификаторы (ID инфоблоков, коды свойств), чтобы случайно не испортить данные.

Скрипт 1: Копирование значения одного свойства в другое

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

<?
// Подключаем ядро Битрикса
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

// Подключаем модуль инфоблоков
CModule::IncludeModule("iblock");

// Снимаем ограничения для длительных скриптов (для больших объемов данных)
@set_time_limit(99600);
ini_set("memory_limit", "4096M");
ini_set("max_execution_time", "0");
ini_set("max_input_time", "0");

// Получаем список элементов исходного инфоблока
$res = CIBlockElement::GetList(
    array(), // Сортировка
    array('IBLOCK_ID' => 1), // Фильтр (ID вашего исходного инфоблока)
    false,   // Группировка
    false,   // Постраничная навигация
    array('ID', 'PROP_FROM_OLD') // Выбираемые поля (обязательно ID и копируемое свойство)
);

// Обрабатываем каждый элемент
while($el = $res->GetNextElement()) {
    $fields = $el->GetFields();
    
    // Получаем массив данных свойства, которое копируем
    $from = $el->GetProperty('PROP_FROM_OLD');
    
    // Обновляем целевое свойство
    CIBlockElement::SetPropertyValuesEx(
        $fields['ID'],        // ID обновляемого элемента
        1,                    // ID инфоблока (должен совпадать с исходным!)
        array('PROP_TO_NEW' => $from['VALUE']) // Массив [код_свойства => значение]
    );
    
    // Для отладки можно выводить информацию
    echo "Обработан элемент ID: " . $fields['ID'] . "<br>";
}

// Сообщение об окончании работы
echo "Скопирование свойств завершено.";
?>

Что важно в этом коде:

  • В фильтре CIBlockElement::GetList и в методе SetPropertyValuesEx должен быть указан один и тот же IBLOCK_ID, если вы работаете в пределах одного инфоблока.

  • PROP_FROM_OLD и PROP_TO_NEW — это символьные коды свойств. Замените их на свои.

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

Скрипт 2: Перенос элементов в другой инфоблок

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

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
CModule::IncludeModule("iblock");

// Получаем элементы из исходного инфоблока (ID = 8)
$rs = CIBlockElement::GetList (
    false,
    Array("IBLOCK_ID" => 8, "ACTIVE" => "Y"),
    false,
    false,
    Array('ID', 'NAME', 'PROPERTY_HOURS', 'PROPERTY_MINUTES', 'ACTIVE_FROM')
);

while ($ar_fields = $rs->GetNext()) {
    // Создаем новый элемент
    $el = new CIBlockElement;
    
    // Подготавливаем массив свойств для нового элемента
    $PROP = array();
    $PROP[7] = 1; // Свойство с ID 7 (например, "Проект")
    $PROP[8] = $ar_fields['PROPERTY_HOURS_VALUE'];   // Копируем часы
    $PROP[9] = $ar_fields['PROPERTY_MINUTES_VALUE']; // Копируем минуты

    // Массив полей для нового элемента
    $arLoadProductArray = Array(
        "MODIFIED_BY"       => $USER->GetID(), // Текущий пользователь как редактор
        "IBLOCK_SECTION_ID" => false,          // Раздел "Корень"
        "IBLOCK_ID"         => 3,              // ID целевого инфоблока
        "DATE_ACTIVE_FROM"  => $ar_fields['ACTIVE_FROM'], // Копируем дату
        "PROPERTY_VALUES"   => $PROP,          // Массив свойств
        "NAME"              => $ar_fields['NAME'], // Копируем название
        "ACTIVE"            => "Y",            // Делаем активным
    );

    // Пытаемся добавить элемент
    if($PRODUCT_ID = $el->Add($arLoadProductArray)) {
        echo "Успешно создан новый элемент с ID: ".$PRODUCT_ID . "<br>";
    } else {
        echo "Ошибка при создании элемента: ".$el->LAST_ERROR . "<br>";
    }
}
?>

Что важно в этом коде:

  • В этом скрипте мы работаем с двумя разными инфоблоками: исходным (ID=8) и целевым (ID=3).

  • Свойства задаются не по символьным кодам, а по их ID ($PROP[7], $PROP[8]). Узнать ID свойства можно в админке в разделе "Настройки" инфоблока.

  • Используется метод CIBlockElement::Add, который создает совершенно новый элемент.

Заключение

С помощью этих скриптов вы можете эффективно управлять данными в своих проектах на Битрикс, автоматизируя рутинные и массовые операции. Главное — всегда помнить о мерах предосторожности: бэкапы и тестирование.

Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Читайте по теме
Все статьи
Нужен надежный исполнитель?
Разрабатываем сайты, выполняем миграцию на Битрикс, дорабатываем функционал, сопровождаем проекты, а также занимаемся поисковым продвижением и комплексным маркетингом
Получить консультацию
Все статьи