• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/checklist/checklistfacade.php
  • Класс: BitrixTasksCheckListCheckListFacade
  • Вызов: CheckListFacade::merge
static function merge($entityId, $userId, $newItems, $parameters = [])
{
	$mergeResult = new Result();

	static::doMergePreActions($entityId, $userId);

	static::enableDeferredActionsMode();

	static::$oldItemsToMerge = static::getList([], [static::$entityIdName => $entityId]);
	$oldItemsKeys = array_keys(static::$oldItemsToMerge);

	if (empty($newItems))
	{
		static::deleteByCheckListsIds($oldItemsKeys);
		static::doDeletePostActions($entityId, $userId, ['ITEMS' => static::$oldItemsToMerge]);

		static::doMergePostActions($entityId, $userId, ['PARAMETERS' => $parameters]);

		return $mergeResult;
	}

	$traversedItems = [];
	$newItemsTree = static::getObjectStructuredRoots($newItems, $entityId, $userId, 'PARENT_NODE_ID');

	foreach ($newItemsTree as $item)
	{
		/** @var CheckList $item */
		$saveResult = $item->save();
		if (!$saveResult->isSuccess())
		{
			$mergeResult->loadErrors($saveResult->getErrors());
			return $mergeResult;
		}

		/** @var CheckList $savedItem */
		$savedItem = $saveResult->getData()['ITEM'];
		$traversedItems[] = $savedItem->toItemsArray();
	}

	$traversedItems = array_merge(...$traversedItems);
	$mergeResult->setData(['TRAVERSED_ITEMS' => $traversedItems]);

	$itemsToRemoveKeys = array_diff($oldItemsKeys, array_column($traversedItems, 'ID'));
	$itemsToRemove = array_filter(
		static::$oldItemsToMerge,
		static function ($item) use ($itemsToRemoveKeys)
		{
			return in_array((int)$item['ID'], $itemsToRemoveKeys, true);
		}
	);

	static::deleteByCheckListsIds($itemsToRemoveKeys);
	static::doDeletePostActions($entityId, $userId, ['ITEMS' => $itemsToRemove]);

	static::doMergePostActions($entityId, $userId, ['ITEMS' => $traversedItems, 'PARAMETERS' => $parameters]);

	static::disableDeferredActionsMode();
	static::onAfterMerge($traversedItems, $userId, $entityId, $parameters);

	return $mergeResult;
}