• Модуль: disk
  • Путь к файлу: ~/bitrix/modules/disk/lib/volume/cleaner.php
  • Класс: BitrixDiskVolumeCleaner
  • Вызов: Cleaner::deleteFileUnnecessaryVersion
public function deleteFileUnnecessaryVersion(DiskFile $file, array $additionalFilter = []): bool
{
	$subTaskDone = true;

	$filter = [
		'=OBJECT_ID' => $file->getId(),
	];
	if (count($additionalFilter) > 0)
	{
		$filter = array_merge($filter, $additionalFilter);
	}

	$versionList = DiskVersion::getList([
		'filter' => $filter,
		'select' => ['ID']
	]);
	foreach ($versionList as $row)
	{
		$versionId = $row['ID'];

		/** @var DiskVersion $version */
		$version = DiskVersion::getById($versionId);
		if(!$version instanceof DiskVersion)
		{
			//$this->collectError(new Error('Version '.$versionId.' was not found'));
			continue;
		}

		// is a head
		if ($version->getFileId() == $file->getFileId())
		{
			//$this->collectError(new Error('Version '.$versionId.' is a head'));
			continue;
		}

		// attached_object
		$attachedList = DiskAttachedObject::getList([
			'filter' => [
				'=OBJECT_ID' => $file->getId(),
				'=VERSION_ID' => $version->getId(),
			],
			'select' => ['ID'],
			'limit' => 1,
		]);
		if($attachedList->getSelectedRowsCount() > 0)
		{
			$this->collectError(new Error('Version '.$versionId.' has attachments'));
			continue;
		}

		// external_link
		$externalLinkList = DiskExternalLink::getList([
			'filter' => [
				'=OBJECT_ID' => $file->getId(),
				'=VERSION_ID' => $version->getId(),
				'!TYPE' => DiskExternalLink::TYPE_AUTO,
			],
			'select' => ['ID'],
			'limit' => 1,
		]);
		if($externalLinkList->getSelectedRowsCount() > 0)
		{
			$this->collectError(new Error('Version '.$versionId.' has external links'));
			continue;
		}

		$task = $this->instanceTask();

		$logData = $task->collectLogData($version);

		try
		{
			// drop
			if (!$version->delete($task->getOwnerId()))
			{
				$this->collectError($version->getErrors());
			}
			else
			{
				$task->log($logData, __FUNCTION__);
				$task->increaseDroppedVersionCount();
			}
		}
		catch (MainSystemException $exception)
		{
			$this->collectError(new Error($exception->getMessage(), $exception->getCode()));
		}

		if (!$this->checkTimeEnd())
		{
			$subTaskDone = false;
			break;
		}
	}

	return $subTaskDone;
}