Битрикс 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 року займаюся веб-розробкою. Зараз я – PHP Full Stack Developer.
Обговорити ваш проект, а також дізнатися більше про мене ви можете на цьому сайті:
dev.forwww.com

Email: dmitriyribka@gmail.com

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *