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

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

Как скопировать свойство в Битриксе

Для чего это может пригодиться? Например, когда вам надо сделать копию свойства, но вы не хотите испортить актуальные данные и что-нибудь сломать.

Любой скрипт начинается с подключения пролога и модуля инфоблока:

<?
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),
    false,
    false,
    array('PROP_FROM_OLD')
);
 
while($el = $res->GetNextElement()){
 
    $fields = $el->GetFields();
    //тут введите код свойство которое копируется
    $from = $el->GetProperty('PROP_FROM_OLD');
    //обновляем свойство
    CIBlockElement::SetPropertyValuesEx(
        $fields['ID'], //ID обновляемого элемента
        14, //ID инфоблока
        array('PROP_TO_NEW' => $from['VALUE']) //код обновляемого свойства
    );
}

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

<?
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),
    false,
    false,
    array('PROP_FROM_OLD')
);
 
while($el = $res->GetNextElement()){
 
    $fields = $el->GetFields();
    //тут введите код свойство которое копируется
    $from = $el->GetProperty('PROP_FROM_OLD');
    //обновляем свойство
    CIBlockElement::SetPropertyValuesEx(
        $fields['ID'], //ID обновляемого элемента
        14, //ID инфоблока
        array('PROP_TO_NEW' => $from['VALUE']) //код обновляемого свойства
    );
}

PROP_FROM_OLD и PROP_TO_NEW — символьные коды. Не забывайте менять свой ID инфоблока.

Как скопировать элементы в 1С-Битрикс

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

<?
if (CModule::IncludeModule("iblock")):

    $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())
    {

        echo "<pre>";
        print_r($ar_fields);
        echo "</pre>";


        $el = new CIBlockElement;
        $PROP = array();
        $PROP[7] = 1;  // проект
        $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,
          "DATE_ACTIVE_FROM" => $ar_fields['ACTIVE_FROM'],
          "PROPERTY_VALUES"=> $PROP,
          "NAME"           => $ar_fields['NAME'],
          "ACTIVE"         => "Y",            // активен
          );

        if($PRODUCT_ID = $el->Add($arLoadProductArray))
          echo "New ID: ".$PRODUCT_ID;
        else
          echo "Error: ".$el->LAST_ERROR;


    }

endif;
?>

Как видите, из инфоблока с ID 8 мы создаем в инфоблоке с ID 3 новые элементы. Значения свойств берутся из старого инфоблока, или же, как было в моем случае, из инфоблока который «оказался не там» после XML выгрузки 🙂 .

автор: Dmitriy

Занимаюсь веб-разработкой с 2011 года. Посмотреть некоторые из моих работ, а также узнать чуть больше обо мне, вы можете на forwww.ru.

Какие услуги предоставляю:
- Создание сайтов, шаблонов и компонентов на 1С-Битрикс;
- Разработка функционала с нуля и доработка кода на уже созданных проектах;
- Адаптивная вёрстка макетов и натяжка на Битрикс;
- Парсинг файлов и выгрузка на сайт (форматы - CSV, XML, XLSX, JSON)
- Интеграции со сторонними сервисами по API;
- Многоязычные версии и многое другое.

Если у вас остались вопросы, свяжитесь со мной любым удобным для вас способом или оставьте комментарий внизу.
E-mail: dmitriyribka@gmail.com
Skype: cinemacreaterus

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *