Связь кастомной таблицы с таблицей Битрикс - uniqcle/Bitrix GitHub Wiki

Настройки -> Производительность -> Таблицы
Настройки -> Инструменты -> SQL запрос

Создаем свою таблицу

create table hospital_clients (
	id INTEGER NOT NULL auto_increment PRIMARY KEY,
	first_name VARCHAR(50),
	last_name VARCHAR(50),
	age TINYINT(4),
	doctor_id TINYINT(4),
	procedure_id TINYINT(4),
	contact_id INT(11)
);

insert into hospital_clients (id, first_name, last_name, age, doctor_id, procedure_id, contact_id) values (1, 'Владислав', 'Михайлов', 38, 69, 51, 1);
insert into hospital_clients (id, first_name, last_name, age, doctor_id, procedure_id, contact_id) values (4, 'Екатерина', 'Шарова', 30, 73, 46, 7);
insert into hospital_clients (id, first_name, last_name, age, doctor_id, procedure_id, contact_id) values (5, 'Глеб', 'Титов', 33, 73, 50, 3);

Включаем галочку Разрешить генерацию таблетов для ORM

Настройки-Настройки продукта-Настройки модулей-Монитор производительности-Генератор таблетов-Разрешить генерацию таблетов для ORM

В контекстом меню таблицы генерируем ORM Далее добавляем в модели.

/local/app/Models/Lists/HospitalClientsTable.php

namespace Models;

use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ORM\Data\DataManager;
use Bitrix\Main\ORM\Fields\IntegerField;
use Bitrix\Main\ORM\Fields\StringField;
use Bitrix\Main\ORM\Fields\Validators\LengthValidator;

use Bitrix\Main\ORM\Fields\Validators\RegExpValidator,
	Bitrix\Main\ORM\Fields\Relations\Reference,
	Bitrix\Main\ORM\Fields\Relations\OneToMany,
	Bitrix\Main\Entity\Query\Join;

/**
 * Class ClientsTable
 **/

class HospitalClientsTable extends DataManager
{
	/**
	 * Returns DB table name for entity.
	 *
	 * @return string
	 */
	public static function getTableName()
	{
		return 'hospital_clients';
	}

	/**
	 * Returns entity map definition.
	 *
	 * @return array
	 */
	public static function getMap()
	{
		return [
			new IntegerField(
				'id',
				[
					'primary' => true,
					'autocomplete' => true,
					'title' => Loc::getMessage('CLIENTS_ENTITY_ID_FIELD'),
				]
			),
			new StringField(
				'first_name',
				[
					'validation' => function()
					{
						return[
							new LengthValidator(null, 50),
						];
					},
					'title' => Loc::getMessage('CLIENTS_ENTITY_FIRST_NAME_FIELD'),
				]
			),
			new StringField(
				'last_name',
				[
					'validation' => function()
					{
						return[
							new LengthValidator(null, 50),
						];
					},
					'title' => Loc::getMessage('CLIENTS_ENTITY_LAST_NAME_FIELD'),
				]
			),
			new IntegerField(
				'age',
				[
					'title' => Loc::getMessage('CLIENTS_ENTITY_AGE_FIELD'),
				]
			),
			new IntegerField(
				'doctor_id',
				[
					'title' => Loc::getMessage('CLIENTS_ENTITY_DOCTOR_ID_FIELD'),
				]
			),
			new IntegerField(
				'procedure_id',
				[
					'title' => Loc::getMessage('CLIENTS_ENTITY_PROCEDURE_ID_FIELD'),
				]
			),
			new IntegerField(
				'contact_id',
				[
					'title' => Loc::getMessage('CLIENTS_ENTITY_CONTACT_ID_FIELD'),
				]
			),

			// виртуальное поле CONTACT которое получает запись из таблицы контактов
			// где ID равен значению contact_id таблицы hospital_clients
			(new Reference('CONTACT', \Bitrix\CRM\ContactTable::class,
				Join::on('this.contact_id', 'ref.ID')))
				->configureJoinType('inner'),


		];
	}
}

Проверить соответствие

namespace Models;

use Bitrix\Main\Localization\Loc;
use Bitrix\Main\ORM\Data\DataManager;
use Bitrix\Main\ORM\Fields\IntegerField;
use Bitrix\Main\ORM\Fields\StringField;
use Bitrix\Main\ORM\Fields\Validators\LengthValidator;

use Bitrix\Main\ORM\Fields\Validators\RegExpValidator,
	Bitrix\Main\ORM\Fields\Relations\Reference,
	Bitrix\Main\ORM\Fields\Relations\OneToMany,
	Bitrix\Main\Entity\Query\Join;
class HospitalClientsTable extends...

а также связку с таблицей битрикс CRM

// виртуальное поле CONTACT которое получает запись из таблицы контактов
			// где ID равен значению contact_id таблицы hospital_clients
			(new Reference('CONTACT', \Bitrix\CRM\ContactTable::class,
				Join::on('this.contact_id', 'ref.ID')))
				->configureJoinType('inner'),

Вывод в скрипте

use Bitrix\Main\Type;

use Models\Lists\CarsPropertyValuesTable as CarsTable;
use Models\HospitalClientsTable as Clients;

use Models\BookTable as Books;
use Models\PublisherTable as Publishers;
use Models\AuthorTable as Authors;
use Models\WikiprofileTable as Wikiprofiles;

// кастомная таблица и стандартная сущность Битрикс
// получение данных из hospital_clients
// получаем контакты CRM привязанные к своей таблице
$collection = Clients::getList([
	'select' => [
		'id',
		'first_name',
		'contact_id',
		'CONTACT.*'
	],
	'limit'=>3
])->fetchCollection();

foreach ($collection as $key => $record) {
	debug($record->getId().' '.$record->getFirstName().' '.$record->getContactId());
	debug($record->getContact()->getPost());
	debug($record->getContact()->getCompanyId());
	debug($record->getContact()->getTypeId());
	//debug($record->getContact()->getLastActivityTime());
}