Зачастую нужно реализовать следующий сценарий:- Контент-менеджер загружает файлы (картинки товара или раздела каталога) как есть. С кириллическим названием или пробелами. Как результат при валидации кода (если придет дотошный сеошник) могут вылезти куча ошибок связанных с разрывами в имени файла.Ниже публикую 2 скрипта, которые позволяют поправить эту ошибку перезаписав имена на корректные с точки зрения seo.
!!! ВАЖНО !!! Перед выполнением скрипта в настройках главного модуля должны быть следующие настройки (см. скриншот). И не забывайте указать свой ID инфоблока.

1. Для разделов
$start = microtime(true);
// включение модуля
\Bitrix\Main\Loader::includeModule('iblock');
$arOrder = array('ID' => 'ASC');
$arFilter = array('IBLOCK_ID' => 60); // указать id инфоблока
$arSelect = array('ID', 'NAME', 'PICTURE');
$countSection = 0;
$countPicture = 0;
// достаем список разделов
$res = CIBlockSection::GetList($arOrder, $arFilter, false, $arSelect, false);
// цикл перебора разделов
while($arSection = $res->Fetch()){
$countSection += 1;
// получаем id файла в системе
$fileID = $arSection['PICTURE'];
// если id файла не получен, значит раздел без картинки
if(isset($fileID)){
$countPicture += 1;
// получим картинку как объект по id
$fileInfo = CFile::GetByID($fileID);
if($fileArr = $fileInfo->Fetch()){
// указываем расположение для временного хранения в склейке с именем файла
// !!! путь к папке задается от корня /upload/
$newFilePath = 'user_files/'.$fileArr['FILE_NAME'];
// копируем файл во временную папку
$fileCopy = CFile::CopyFile($fileID, true, $newFilePath);
}
// получаем информацию в массиве
$arrTmp = CFile::MakeFileArray($fileCopy);
// начинаем обновлять картинку
$bs = new CIBlockSection;
// определим данные для корректной записи массива 'PICTURE'
$picture = array(
'name' => $arrTmp['name'],
'type' => $arrTmp['type'],
'tmp_name' => $arrTmp['tmp_name'],
'error' => 0,
'size' => $arrTmp['size'],
'MODULE_ID' => 'iblock',
);
$arFields = array(
'PICTURE' => $picture,
);
// обновляем раздел
$bs->Update($arSection['ID'], $arFields, false, false, true);
unset($fileID);
}
}
$time = microtime(true) - $start;
echo 'Всего найдено ' . $countSection . ' разделов <br>';
echo 'Обновлено ' . $countPicture . ' картинок <br>';
echo 'Время выполнения ' . $time . ' секунд';
Для элементов
$start = microtime(true);
// включение модуля
\Bitrix\Main\Loader::includeModule('iblock');
$arOrder = array('ID' => 'ASC');
$arFilter = array('IBLOCK_ID' => 55); // указать id инфоблока
$arSelect = array('ID', 'NAME', 'PREVIEW_PICTURE', 'DETAIL_PICTURE');
$countElement = 0;
$countPicture = 0;
// достаем список элементов
$ar_res = CIBlockElement::GetList($arOrder, $arFilter, false, false, $arSelect);
// цикл перебора элементов
while($arElement = $ar_res->Fetch()){
$countElement += 1;
$res = CIBlockElement::GetByID($arElement['ID']);
if($arElement = $res->GetNext()){
/*КАРТИНКА АНОНСА*/
if(isset($arElement['PREVIEW_PICTURE'])){
$countPicture += 1;
// получим картинку как объект по id
$fileInfo = CFile::GetByID($arElement['PREVIEW_PICTURE']);
if($fileArr = $fileInfo->Fetch()){
// указываем расположение для временного хранения в склейке с именем файла
// !!! путь к папке задается от корня /upload/
$newFilePath = 'user_files/'.$fileArr['FILE_NAME'];
// копируем файл во временную папку
$fileCopy = CFile::CopyFile($arElement['PREVIEW_PICTURE'], true, $newFilePath);
}
// получаем информацию в массиве
$arrTmp = CFile::MakeFileArray($fileCopy);
// обновляем элемент
$el = new CIBlockElement;
// определим данные для корректной записи массива 'PICTURE'
$picture = array(
'name' => $arrTmp['name'],
'type' => $arrTmp['type'],
'tmp_name' => $arrTmp['tmp_name'],
'error' => 0,
'size' => $arrTmp['size'],
'MODULE_ID' => 'iblock',
);
$arFields = array(
'PREVIEW_PICTURE' => $picture,
);
$res = $el->Update($arElement['ID'], $arFields);
}
/*КАРТИНКА ДЕТАЛЬНАЯ*/
if(isset($arElement['DETAIL_PICTURE'])){
$countPicture += 1;
// получим картинку как объект по id
$fileInfo = CFile::GetByID($arElement['DETAIL_PICTURE']);
if($fileArr = $fileInfo->Fetch()){
// указываем расположение для временного хранения в склейке с именем файла
// !!! путь к папке задается от корня /upload/
$newFilePath = 'user_files/'.$fileArr['FILE_NAME'];
// копируем файл во временную папку
$fileCopy = CFile::CopyFile($arElement['DETAIL_PICTURE'], true, $newFilePath);
}
// получаем информацию в массиве
$arrTmp = CFile::MakeFileArray($fileCopy);
// обновляем элемент
$el = new CIBlockElement;
// определим данные для корректной записи массива 'PICTURE'
$picture = array(
'name' => $arrTmp['name'],
'type' => $arrTmp['type'],
'tmp_name' => $arrTmp['tmp_name'],
'error' => 0,
'size' => $arrTmp['size'],
'MODULE_ID' => 'iblock',
);
$arFields = array(
'DETAIL_PICTURE' => $picture,
);
$res = $el->Update($arElement['ID'], $arFields);
}
}
}
$time = microtime(true) - $start;
echo 'Всего найдено ' . $countElement . ' элементов <br>';
echo 'Обновлено ' . $countPicture . ' картинок <br>';
echo 'Время выполнения ' . $time . ' секунд';
Оставлю этот тут, вдруг кому-то пригодится.