• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/item/field/collection/item.php
  • Класс: BitrixTasksItemFieldCollectionItem
  • Вызов: Item::saveValueToDataBase
public function saveValueToDataBase($value, $key, $item)
{
	$value = $this->translateValueToDatabase($value, $key, $item);

	$result = new Result();
	$errors = $result->getErrors();

	$itemId = $item->getId();
	/** @var SubItem $itemClass */
	$itemClass = static::getItemClass();
	$itemState = $item->getTransitionState();
	$isCreate = $itemState->isModeCreate();
	$isUpdate = $itemState->isModeUpdate();
	$isDelete = $itemState->isModeDelete();
	$newCodePattern = $this->getName().'.#CODE#';

	$this->onBeforeSaveToDataBase($value, $key, $item);

	$itemClass::enterBatchState();

	if($isUpdate || $isDelete)
	{
		if(method_exists($itemClass, 'findByParent')) // todo: use SubItem::isA() here, when moved to 5.4
		{
			$all = $itemClass::findByParent($itemId, array('select' => array('ID')), array(
				'USER_ID' => $item->getUserId()
			));

			/** @var SubItem $exItem */
			foreach($all as $exItem)
			{
				if($isUpdate && ($value && $value->containsId($exItem->getId())))
				{
					continue;
				}

				$exItem->setParent($item);
				$delResult = $exItem->delete();

				$errors->load($delResult->getErrors()->transform(array('CODE' => $newCodePattern)));
			}
		}
		else
		{
			throw new ArgumentTypeException('There should be a sub-item class: '.$key);
		}
	}

	if(($isCreate || $isUpdate) && $value)
	{
		foreach($value as $subItem)
		{
			// save each item of this collection separately
			/** @var SubItem $subItem */
			$subItem->setParentId($itemId);
			$saveResult = $subItem->save(array(
				'KEEP_DATA' => true,
			));

			$errors->load($saveResult->getErrors()->transform(array('CODE' => $newCodePattern)));
		}
	}

	$itemClass::leaveBatchState();

	return $result;
}