• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/posting/builder.php
  • Класс: BitrixSenderPostingBuilder
  • Вызов: Builder::fill
protected function fill(ConnectorBase $connector, $group, $usedPersonalizeFields = [])
{
	$count = 0;

	$typeCode = $this->getTypeCode();

	$isIncrementally = $connector instanceof ConnectorIncrementallyConnector && $group['FILTER_ID'];
	if ($isIncrementally)
	{
		$segmentBuilder = new SegmentDataBuilder($group['GROUP_ID'], $group['FILTER_ID'], $group['ENDPOINT']);

		if (!$segmentBuilder->isBuildingCompleted())
		{
			throw new NotCompletedException();
		}
	}

	$result = $isIncrementally
		? $segmentBuilder->getPreparedData()
		: $connector->getResult();

	while (true)
	{
		$dataList = array();
		$maxPart = 500;

		while ($data = $result->fetch())
		{
			if ($this->isCorrectData($data, $typeCode))
			{
				continue;
			}

			if (!isset($data[$typeCode]) && ((int)$this->typeId === RecipientType::CRM_LEAD_ID))
			{
				$data[$typeCode] = $data['FIELDS']['CRM_ENTITY_ID'];
			}

			$primary = RecipientNormalizer::normalize($data[$typeCode], $this->typeId);
			if ($primary == '')
			{
				continue;
			}
			$dataList[$primary] = $data;

			$count++;

			$maxPart--;
			if ($maxPart == 0)
			{
				break;
			}
		}

		if (count($dataList) === 0)
		{
			break;
		}
		$this->setRecipientIdentificators($dataList, $group['INCLUDE']);

		if ($group['INCLUDE'])
		{
			// add address if not exists
			if ($this->checkDuplicates)
			{
				$primariesString = SqlBatch::getInString(array_keys($dataList));
				$connection = Application::getConnection();
				$rowDb = $connection->query(
					"select r.CODE " .
					"from b_sender_posting_recipient pr, b_sender_contact r " .
					"where pr.CONTACT_ID = r.ID " .
					"and pr.POSTING_ID = " . (int) $this->postingId . " " .
					"and r.TYPE_ID = " . (int) $this->typeId . " " .
					"and r.CODE in ($primariesString)"
				);
				while ($row = $rowDb->fetch())
				{
					unset($dataList[$row['CODE']]);
				}
			}

			if (empty($dataList))
			{
				continue;
			}

			if(
				count($usedPersonalizeFields) > 0
			)
			{
				$preparedFields = [];

				foreach($dataList as $data)
				{
					if(!isset($data['FIELDS']))
					{
						continue;
					}

					$field = $data['FIELDS'];
					if(!isset($preparedFields[$field['CRM_ENTITY_TYPE']]))
					{
						$preparedFields[$field['CRM_ENTITY_TYPE']] = [];
					}
					$preparedFields[$field['CRM_ENTITY_TYPE']][] = $field['CRM_ENTITY_ID'];
				}

				foreach ($preparedFields as $entityType => $ids)
				{
					$this->checkUsedFields(
						$entityType, $ids, $usedPersonalizeFields, $dataList
					);
				}
			}

			$this->addPostingRecipients($dataList);
		}
		else
		{
			$this->removePostingRecipients($dataList);
		}
	}

	if (!$group['GROUP_ID'])
	{
		return;
	}

	$this->incGroupCounters($group['GROUP_ID'], $count);
}