• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/entity/letter.php
  • Класс: BitrixSenderEntityLetter
  • Вызов: Letter::saveDataSegments
protected function saveDataSegments($id, array $segmentsInclude, array $segmentsExclude)
{
	$segmentsExclude = array_unique($segmentsExclude);
	$segmentsInclude = array_unique($segmentsInclude);
	$segmentsInclude = array_diff($segmentsInclude, $segmentsExclude);

	$segmentsList = array(
		array(
			'list' => $segmentsExclude,
			'include' => false
		),
		array(
			'list' => $segmentsInclude,
			'include' => true
		),
	);

	$oldSegments = $this->loadDataSegments($id);
	$letter = LetterTable::getById($id)->fetch();
	LetterSegmentTable::deleteList(array('LETTER_ID' => $id));

	$isChanged = false;
	$dataToInsert = [];
	foreach ($segmentsList as $segments)
	{
		if(empty($segments['list']))
		{
			continue;
		}

		$typeCode = $segments['include'] ? 'INCLUDE' : 'EXCLUDE';
		$list = [];
		foreach ($segments['list'] as $segment)
		{
			$list[] = ['DATE_UPDATE' => $letter['DATE_UPDATE'], 'ID' => $segment];
			$dataToInsert[] = array(
				'LETTER_ID' => $id,
				'SEGMENT_ID' => $segment,
				'INCLUDE' => $segments['include'],
			);
		}

		$newest = self::getArrayDiffNewest($list, $oldSegments[$typeCode]);
		$removed = self::getArrayDiffRemoved($list, $oldSegments[$typeCode]);

		if (count($newest) === 0 && count($removed) === 0)
		{
			continue;
		}

		if (count($newest) > 0)
		{
			Segment::updateUseCounters($newest, $segments['include']);
		}

		$isChanged = true;
	}
	if(!empty($dataToInsert))
	{
		LetterSegmentTable::addMulti($dataToInsert);
	}

	if ($isChanged && $this->getId() && $this->get('POSTING_ID'))
	{
		PostingBuilder::create()
			->run($this->get('POSTING_ID'), false);
	}
}