Массовое копирование элементов ИБ в админке 1C Bitrix

Появилась необходимость копировать элементы внутри ИБ в другой раздел. В Битриске можно копировать только по одному элементу, и это не удобно когда надо скопировать более ста элементов в другой раздел.
Для начала нам надо добавить в список действий новое новое действие – «копировать».
Открываем файл – /bitrix/modules/iblock/admin/iblock_element_admin.php, находим строку 1895. Там объявляет массив с событиями:

$arActions = array(
	"delete" => GetMessage("MAIN_ADMIN_LIST_DELETE"),
	"activate" => GetMessage("MAIN_ADMIN_LIST_ACTIVATE"),
	"deactivate" => GetMessage("MAIN_ADMIN_LIST_DEACTIVATE"),
);


Добавляем наше событие и получаем следующее:

$arActions = array(
	"delete" => GetMessage("MAIN_ADMIN_LIST_DELETE"),
	"activate" => GetMessage("MAIN_ADMIN_LIST_ACTIVATE"),
	"deactivate" => GetMessage("MAIN_ADMIN_LIST_DEACTIVATE"),
	"copy_all" => 'копировать',
);

Теперь нам необходимо добавить обработчик для данного события. В этом же файле перемещаемся на строку 647, там мы увидим следующее:

switch($_REQUEST['action'])

Ниже добавляем наш обработчик:

case "copy_all":
    
    $el = CIBlockElement::GetByID($ID);
    $el = $el->GetNext();
    $ibId = $el['IBLOCK_ID'];
    $new_section = intval($_REQUEST["section_to_move"]);
    
    $items = CIBlockElement::GetList(
        array(),
        array('IBLOCK_ID'  => $ibId,
              'ID' => $ID
        ),
        false,
        false,
        array('DETAIL_TEXT', 'PREVIEW_TEXT', 'PROPERTY_PRICE', 'PROPERTY_PHONE', 'PROPERTY_ADDRESS', 'PROPERTY_AREA', 'PROPERTY_LEVEL', 'PROPERTY_HOME', 'PROPERTY_REGION', 'PROPERTY_VARIANT', 'PROPERTY_BOLD', '*')
    );
    $item = $items->GetNext();
    
    $ob = new CIBlockElement();
    $PROP = array(
        'PRICE'   => $item['PROPERTY_PRICE_VALUE'],
        'PHONE'   => $item['PROPERTY_PHONE_VALUE'],
        'ADDRESS' => $item['PROPERTY_ADDRESS_VALUE'],
        'AREA'    => $item['PROPERTY_AREA_VALUE'],
        'LEVEL'   => $item['PROPERTY_LEVEL_VALUE'],
        'HOME'    => $item['PROPERTY_HOME_VALUE'],
        'REGION'  => $item['PROPERTY_REGION_VALUE'],
        'VARIANT' => $item['PROPERTY_VARIANT_VALUE'],
        'BOLD'    => $item['PROPERTY_BOLD_VALUE'],
    );
    
    $arLoadProductArray = Array(
      "MODIFIED_BY"       => $USER->GetID(),
      "IBLOCK_SECTION_ID" => $new_section,
      "IBLOCK_ID"         => $ibId,
      "NAME"              => $item['NAME'],
      "ACTIVE"            => "Y",
      "PREVIEW_TEXT"      => $item['PREVIEW_TEXT'],
      "DETAIL_TEXT"       => $item['DETAIL_TEXT'],
    );

    if(!$res = $ob->Add($arLoadProductArray)) {
       $lAdmin->AddGroupError(GetMessage("IBEL_A_UPDERR") . $ob->LAST_ERROR, $ID);
    }
    foreach ($PROP as $key => $val) {
        CIBlockElement::SetPropertyValueCode($res, $key, array('VALUE' => $val));
    }
    break;

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