Копирование элементов инфоблока вместе с файлами
К сожалению битрикс не умеет копировать элементы инфоблоков вместе с файлами, картинками анонса и детальной картинкой. Копируемый элемент создается с пустыми полями. А общение с тех. поддержкой битрикса выявило, что в документации сам процесс копирования элементов никак не описан, не описано, что копируется, а что нет и что вообще с этим делать.
Подходящих решений в маркетплейсе битрикса найти не удалось, а из блогов наиболее подходящую запись нашел только тут: https://odva.pro/blog/bitrix_copy_files/
Но в этом решении ID инфоблока и коды свойств прописаны хардокодом. Для более универсального решения я немного переписал скрипт и выкладываю тут:
use Bitrix\Main\EventManager; $eventManager = EventManager::getInstance(); $eventManager->addEventHandler('iblock', 'OnBeforeIBlockElementAdd', 'ClassElementImageCopy::OnBeforeIBlockElementAddHandler'); class ClassElementImageCopy < public static function OnBeforeIBlockElementAddHandler(&$arFields): void < if (!empty($_REQUEST['copyID']) && ($copyId = (int)$_REQUEST['copyID'])) < CModule::IncludeModule('iblock'); $product = CIBlockElement::GetByID($copyId)->fetch(); if (!empty($product['DETAIL_PICTURE'])) < $detailPicture = CFile::MakeFileArray(CFile::GetPath($product['DETAIL_PICTURE'])); $arFields['DETAIL_PICTURE'] = $detailPicture; > if (!empty($product['PREVIEW_PICTURE'])) < $previewPicture = CFile::MakeFileArray(CFile::GetPath($product['PREVIEW_PICTURE'])); $arFields['PREVIEW_PICTURE'] = $previewPicture; > $iblockId = $arFields['IBLOCK_ID']; $resProps = CIBlock::GetProperties($iblockId); $filesProp = []; while ($prop = $resProps->Fetch()) < if ($prop['PROPERTY_TYPE'] === 'F') < $filesProp[] = $prop; >> foreach ($filesProp as $prop) < $resProperty = CIBlockElement::GetProperty($iblockId, $copyId, ['ID' => 'ASC'], ['CODE' => $prop['CODE']]); while ($fileValue = $resProperty->GetNext()) < $file = CFile::MakeFileArray(CFile::GetPath($fileValue['VALUE'])); $arFields['PROPERTY_VALUES'][$prop['CODE']][] = [ 'VALUE' => $file, 'DESCRIPTION' => $fileValue['DESCRIPTION'] ?: '', ]; > if (!empty($arFields['PROPERTY_VALUES'][$prop['CODE']])) < CIblockElement::SetPropertyValues($arFields['ID'], $iblockId, $arFields['PROPERTY_VALUES'][$prop['CODE']], $prop['CODE']); > > > > >
Копируемы файлы появятся в элементе после нажатия на кнопки «Применить» или «Сохранить».
Как скопировать инфоблок Битрикс со свойствами?
Часто при разработке сайта возникает необходимость скопировать инфоблок Битрикса со свойствами, данная задача может показаться очень сложной. Как правило, требуется производить экспорт в XML, правку кода и импорт из обратно на сайт, что занимает огромное количество времени.
С данной задачей очень легко справляется готовый модуль копирования инфоблоков, очень простой в установке и удобный в использовании. С помощью модуля вы можете легко копировать любой информационный блок Битрикса со всеми его свойствами. Модуль позволяет
- Скопировать инфоблок
- Скопировать элементы инфоблока
- Скопировать все разделы и подразделы инфоблока
Помощь проекту
Привет, меня зовут Вика! Я являюсь автором сайта Weblim.
Если Вам помогла данная статья, вы можете отблагодраить меня перечислив любую денежную сумму. Заранее спасибо!
Инфоблоки, инструменты

Теперь администрирование сайта стало простым как никогда, благодаря легким в использовании и надежным инструментам.
Вы можете несколькими кликами мыши скопировать элемент прямо в списке, переместить его в другой инфоблок или «отвязать» от раздела. И это лишь малая часть возможностей модуля. Просто установите его и Вы получите доступ к следующим улучшениям:
- Возможность копирования и перемещения элементов между инфоблоками
- Удобное перемещение между ячейками в новых инфоблоках
- Возможности копирования различных элементов в рамках одного инфоблока
- Опция «отвязать от текущего раздела».
- Типы свойств «Простой чекбокс» и «Палитра»
- Кнопка просмотра элемента в публичной части.
- Экспорт и импорт свойств инфоблока. А также формы элемента и секции.
- Пользовательские свойства инфоблоков
- Удобное управление чекбоксами списков.
- Переключатель режима просмотра элементов в одном инфоблоке
Удобное управление чекбоксами

Наверняка вы знаете о такой удобной функции: выделить мышью один чекбокс, нажать shift, кликнуть на второй и все чекбоксы между ними тоже помечаются как выделенные. Благодаря модулю Инфоблоки. Инструменты. теперь эта функция доступна и в 1С-Битрикс.
Копирование и перенос
копировать в списке

копировать и переместить

привязать к разделу
Как часто перед вами стоит задача скопировать или переместить элемент в другой раздел, или в соседний инфоблок?
С функционалом модуля Инфоблоки. Инструменты. вы можете копировавать элементы в рамках одного инфоблока прямо в списке, перемещать элементы между инфоблоками, копировать свойства инфоблоков за несколько кликов мыши.
Все действия интуитивно понятны. Например, для того, чтобы переместить элементы в конкретный раздел инфоблока-преемника, отметьте галочкой нужный элемент, в меню «Действия» выберите «переместить в другой ИБ», укажите инфоблок и раздел.

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

Аналогичным образом вы можете привязать элемент к любому разделу внутри инфоблока: в меню «Действия» выберите пункт «добавить привязку к разделу» и укажите раздел.
Отвязать от раздела
Еще одна удобная опция — «oтвязать от текущего раздела». Подходит, когда необходимо исключить некоторые элементы из раздела «Распродажа», к примеру.

Перемещение по ячейкам

Помимо копирования и перемещения модуль позволяет быстро перескакивать по полотну полей. В режиме редактирования нажмите Ctrl и стрелками перемещайтесь по полотну в любую сторону:
Свойства инфоблоков

Предусмотрены пользовательские свойства для элементов и секций, но порой не хватает пользовательских свойств самих инфоблоков. Например, чтобы хранить там дополнительные настройки. Эта задача также решена в рамках модуля Инфоблоки. Инструменты.
Функция привычно проста в использовании. После установки модуля в разделе редактирования инфоблока появляется вкладка «Доп. поля», в которой вы можете создавать, добавлять, изменять, удалять свойства. На данный момент свойства сквозные для всех инфоблоков, то есть, если свойство создано в одном — оно будет доступно для всех. Для того, чтобы получить значение полей для конкретного инфоблока, используем следующую функцию:
if (Cmodule::IncludeModule(‘asd.iblock’))
и получаем массив
Array ( [UF_ASD_TPL_INSERT] => текст [UF_TEST] => 1000 [UF_TESTLIST] => Array ( [2] => раз [3] => два [4] => три ) )
Копирование инфоблоков в Битриксе
В стандартной админке Битрикса нет возможности создать новый инфоблок на основе уже существующего. В статье представлена немного переработанная версия скрипта из официальной документации вендора, в более структурированном виде и комментариями
Для запуска достаточно скопировать скрипт целиком в любой файл проекта и вызвать его в браузере.
addError(new Bitrix\Main\Error('Не указан инфоблок для копирования')); return $result; > if (empty($iblockTypeTo)) < $result->addError(new Bitrix\Main\Error('Не указан инфоблок для копирования')); return $result; > /** * Получаем все поля инфоблока-источника */ $iblockFields = CIBlock::GetArrayByID($iblockIdFrom); unset($iblockFields["ID"], $iblockFields["LID"]); $iblockFields["GROUP_ID"] = CIBlock::GetGroupPermissions($iblockIdFrom); /** * Название и код API инфоблока должны быть уникальными, добавляем new к значениям */ $iblockFields["NAME"] .= "_new"; $iblockFields["API_CODE"] .= "new"; $iblockFields["IBLOCK_TYPE_ID"] = $iblockTypeTo; /** * Привязка к сайту может быть множественной, поэтому используем отдельный запрос */ $iblockSiteObject = CIBlock::GetSite($iblockIdFrom); while ($iblockSite = $iblockSiteObject->Fetch()) < $iblockFields["LID"][] = $iblockSite['SITE_ID']; >/** * Создаем инфоблок */ $iblockNew = new CIBlock(); $iblockIdNew = $iblockNew->Add($iblockFields); if ($iblockIdNew === false) < $result->addError(new Bitrix\Main\Error($iblockNew->LAST_ERROR)); return $result; > /** * Выбираем и копируем свойства инфоблока */ $iblockPropertyNew = new CIBlockProperty(); $iblockProperties = CIBlockProperty::GetList( ["sort" => "asc", "name" => "asc"], ["ACTIVE" => "Y", "IBLOCK_ID" => $iblockIdFrom] ); while ($property = $iblockProperties->GetNext()) < $property["IBLOCK_ID"] = $iblockIdNew; unset($property["ID"]); /** * Для свойств типа "список" дополнительным запросом получаем возможные варианты */ if ($property["PROPERTY_TYPE"] === "L") < $propertyEnums = CIBlockPropertyEnum::GetList( ["DEF" =>"DESC", "SORT" => "ASC"], ["IBLOCK_ID" => $iblockIdFrom, "CODE" => $property["CODE"]] ); while ($enumFields = $propertyEnums->GetNext()) < $property["VALUES"][] = [ "VALUE" =>$enumFields["VALUE"], "DEF" => $enumFields["DEF"], "SORT" => $enumFields["SORT"] ]; > > /** * Очистка ненужных элементов массива свойства, которые начинаются с ~ */ foreach ($property as $k => $v) < if (!is_array($v)) < $property[$k] = trim($v); >if ($k[0] === '~') < unset($property[$k]); >> $propertyCopy = $iblockPropertyNew->Add($property); if ($propertyCopy === false) < $result->addError(new Bitrix\Main\Error($iblockPropertyNew->LAST_ERROR)); return $result; > > return $result; > Loader::IncludeModule("iblock"); $request = Context::getCurrent()->getRequest(); /** * Если запрос POST, пытаемся обработать */ if ($request->isPost()) < $result = iblockCopy((int)$request->getPost('from'), (string)$request->getPost('to')); > /** * Списки инфоблоков и типов инфоблоков для постороения списков */ $iblockList = IblockTable::getList()->fetchCollection(); $iblockTypeList = TypeTable::getList()->fetchCollection(); ?>
isSuccess()) < ?>
Инфоблок успешно скопирован
?> isSuccess()) < ?>
=implode('
', $result->getErrorMessages())?>
?>
Больше статей и материалов по web-разработке в tg-канале - подписывайтесь!
1 комментарий “ Копирование инфоблоков в Битриксе ”
Добрый день. Не нашел на сайте формы контактов, берете ли вы в работу заказы по доработке проектов на Битрикс? Если есть интерес напишите пожалуйста на почту.

