Опять всё сам понял.
Для реализации подобного функционала надо создать свою сущность.
Название файла должно быть как название класса, но в нижнем регистре.
//Файл contactspropertytable.php
//Обязательно наследует DataManager
class ContactsPropertyTable extends DataManager
{
// Не обязательно
private static int $tableID, $propertyID;
// Не обязательно
public function __construct($tableID, $propertyID)
{
self::$propertyID = $propertyID;
self::$tableID = $tableID;
}
public static function getTableName()
{
return 'b_iblock_element_prop_s'.self::$tableID;
}
public static function getMap()
{
return [
(new IntegerField('IBLOCK_ELEMENT_ID'))
->configurePrimary(true),
new StringField('PROPERTY_'.self::$propertyID),
];
}
}
//Файл contacts.php своего модуля
protected function runtimeElements(): array
{
new ContactsPropertyTable($this->iblockId, $this->getPropertyLinkId());
return [
new Entity\ReferenceField(
"LINK",
ContactsPropertyTable::class,
Query\Join::on('this.ID', 'ref.IBLOCK_ELEMENT_ID')
),
];
}