Скрипт удаления устаревших товаров 1C Bitrix.

  • Роман Цуканов
    Разработчик
  • Дата публикации
    07.02.2020
  • Категория
    1С-Битрикс
удалить старые товары битрикс
Задача:Удалить все товары, у которых дата последнего изменения была 90 дней назад, а также остаток данных товаров равен нулю. .

Ситуация тривиальна. Прошла выгрузка, часть элементов инфоблока была удалена, но прикрепленные к данным элементам файлы так и остаются на сервере без определенного места жительства, но с занимаемой территорией (местом на FTP).


Одно дело просто удалить элемент и совсем другое удалить элемент вместе с прикрепленными к нему файлами. Речь идет, например, о картинках для анонса и картинках для подробного просмотра, различных свойствах с типом «файл» (галерея, прикрепленные инструкции, видео и т.д.).

Для начала создадим функцию, которая будет удалять файлы картинки для анонса и детальной картинки. К сожалению, через API этого не сделать, поэтому придется лезть в БД.

function deleteFileFromFtpAndDatabase($fileId)
{
    global $DB;

    $result = $DB->Query('SELECT FILE_NAME, SUBDIR FROM b_file WHERE MODULE_ID = "iblock" AND ID = '. $fileId);
    if ($row = $result->Fetch()) {
        $fileDir = $row['SUBDIR'];
        $fileName = $row['FILE_NAME'];
    }

    $path = $_SERVER['DOCUMENT_ROOT'] . "/upload/" . $fileDir . '/' . $fileName;
    $hRootDir = opendir($path);

    unlink($path);

    $result = $DB->Query('DELETE FROM b_file WHERE ID = '. $fileId);
}

Далее приступим к написанию самого скрипта. Для начала необходимый минимум.


define('STOP_STATISTICS', true);
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');

Теперь получим необходимые нам товары/элементы.

$date = date('Y.m.d H:i:s', strtotime(Date('Y-m-d',time()). ' - 90 days'));

$arSelect = Array("ID", "TIMESTAMP_X", "NAME", "QUANTITY", "PREVIEW_PICTURE", "DETAIL_PICTURE");
$arFilter = Array("IBLOCK_ID"=>18,  "ACTIVE"=>"Y","=QUANTITY"=>0, "<=TIMESTAMP_X"=>$date);
$res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
while($ob = $res->Fetch())
{
 $oldProducts[] =  $ob;
}

После получения массива, пробежимся по нему и удалим файлы, ну и за компанию сам элемент инфоблока.

foreach ($oldProducts as $oldProduct) {
    if(!empty($oldProduct['DETAIL_PICTURE'])) {
        deleteFileFromFtpAndDatabase($oldProduct['DETAIL_PICTURE']);
    }

    if(!empty($oldProduct['PREVIEW_PICTURE'])) {
        deleteFileFromFtpAndDatabase($oldProduct['PREVIEW_PICTURE']);
    }

    $arFilter = array(
        'IBLOCK_ID' => 18,
        'PROPERTY_TYPE' => 'F'
    );
    CIBlockElement::Delete($oldProduct['ID']);
}

Для идеального завершения задачи останется только дописать удаление файлов из  свойств типа «файл».

Еще нет коммментариев. Будь первым!

Оформить заказ в Devstages