На просторах Интернета часто можно натолкнуться на жалобы пользователей CMS "1С-Битрикс", посвящённые тому прискорбному факту, что при копировании элемента инфоблока значения полей и свойств типа "Файл" не копируются - то есть, например, если в скопированном элементе поля "Картинка для анонса" и "Детальная картинка" были заполнены, то в получившейся копии они будут пусты. Если картинки должны быть одинаковы и у оригинала и у копии, приходится в каждую копию элемента заново загружать те же изображения.
Предположим, нам нужно, чтобы при копировании элемента инфоблока копировались также значения его полей "Картинка для анонса" и "Детальная картинка", свойства "Каталог" типа "Файл" и множественного свойства "Файлы" типа "Файл". Для этого можно в файле init.php прописать функцию AddEventHandler следующего вида:
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", ["ClassElementImageCopy", "OnBeforeIBlockElementAddHandler"]);
class ClassElementImageCopy
{
function OnBeforeIBlockElementAddHandler(&$arFields)
{
if (!empty($_REQUEST['copyID']) and ($copy_ID = (int)$_REQUEST['copyID']))
{
CModule::IncludeModule('iblock');
$product = CIBlockElement::GetByID($copy_ID)->fetch();
if(!empty($product['DETAIL_PICTURE']))
$arFields['DETAIL_PICTURE'] = CFile::MakeFileArray(CFile::GetPath($product['DETAIL_PICTURE']));
if(!empty($product['PREVIEW_PICTURE']))
$arFields['PREVIEW_PICTURE'] = CFile::MakeFileArray(CFile::GetPath($product['PREVIEW_PICTURE']));
$res = CIBlockElement::GetProperty(23, $copy_ID, ['ID' => 'ASC'], ['CODE' => 'FILES']);
while ($ob = $res->GetNext())
$arFields['PROPERTY_VALUES']['FILES'][] = ['VALUE' => CFile::MakeFileArray(CFile::GetPath($ob['VALUE'])), 'DESCRIPTION' => ''];
if(!empty($arFields['PROPERTY_VALUES']['FILES']))
CIblockElement::SetPropertyValues($arFields['ID'], 23, $arFields['PROPERTY_VALUES']['FILES'], 'FILES');
$res = CIBlockElement::GetProperty(23, $copy_ID, ['ID' => 'ASC'], ['CODE' => 'CATALOG']);
if ($ob = $res->GetNext())
{
$arFields['PROPERTY_VALUES']['CATALOG'] = ['VALUE' => CFile::MakeFileArray(CFile::GetPath($ob['VALUE'])), 'DESCRIPTION' => ''];
CIblockElement::SetPropertyValues($arFields['ID'], 23, $arFields['PROPERTY_VALUES']['CATALOG'], 'CATALOG');
}
}
}
}
Теперь, непосредственно после копирования элемента на открывшейся форме редактирования элемента-копии все поля и свойства типа "Файл" будут пусты. Но при нажатии кнопок "Сохранить", "Применить" или "Сохранить и добавить" нужные нам поля и свойства элемента-копии будут содержать копии значений соответствующих полей и свойств элемента-оригинала.