Решил задачу, рассказал об этом
В новом ядре D7 битрикс появилаcь новая технология ORM. Она заменяет привычный GetList и позволяет выбирать данные из таблиц битрикс не пользуясь прямыми запросами к базе данных. В итоге операции выборки и сохранения в БД получаются однотипными, с одинаковыми параметрами и фильтрам. Для выборки данных необходимо описать в виде класса некую сущность и поля этой сущности. Сущность это таблица базы данных, поля сущности - столбцы таблицы.
Для каждой сущности нужно создать описание. В битрикс уже есть некоторые описания таблиц(сущности), но вот для выборки своих свойств инфоблока, сущность не описана. Поэтому мы это сделаем самостоятельно.
Существует уже описанная сущность для выборки полей из таблицы b_iblock_element с помощью \Bitrix\Iblock\ElementTable::getList. Сущность описана в файле /bitrix/modules/iblock/lib/element.php
class ElementTable extends Main\Entity\DataManager
{
public static function getTableName()
{
return 'b_iblock_element';
}
public static function getMap()
{
return array(
...
'IBLOCK_SECTION_ID' => array( // Основной раздел
'data_type' => 'integer',
'title' => Loc::getMessage('ELEMENT_ENTITY_IBLOCK_SECTION_ID_FIELD'),
),
'ACTIVE' => array( // Активность
'data_type' => 'boolean',
'values' => array('N', 'Y'),
'title' => Loc::getMessage('ELEMENT_ENTITY_ACTIVE_FIELD'),
),
'IBLOCK' => array( //связка с другой таблицей
'data_type' => 'Bitrix\Iblock\Iblock',
'reference' => array('=this.IBLOCK_ID' => 'ref.ID'),
),
);
}
}
Основные функции это
getTableName(), где возвращается название таблицы b_iblock_element
и
getMap(), где возвращаются описанные полей таблицы
В методе getMap() описываются поля таблицы и помимо этого описаны «ссылки» на другие сущности, для взаимосвязи. Например описана ссылка на таблицу IblockTable, чтобы можно было достать данные из таблицы b_iblock. Таблицы связываются по полю ID конструкцией представленной ниже и выбрать данные из таблице можно указав а параметре select параметр IBLOCK.CODE
'IBLOCK' => array(
'data_type' => 'Bitrix\Iblock\Iblock',
'reference' => array('=this.IBLOCK_ID' => 'ref.ID'),
),
Чтобы выбрать стандартные поля элементов, которые описаны в методе getMap() необходима запись вида
$rs = \Bitrix\Iblock\ElementTable::getList(
'filter' => array(
"ID"=>$arId
),
'select' => array(
'ID',
'IBLOCK.CODE'
));
while($r = $rs->fetch())
{
$arResult[] = $r;
}
Узнать какие можно получить свойства элементов, можно исполнить функцию \Bitrix\Iblock\ElementTable::getMap();
Но если нам нужно получить свои свойства элементов, нужно описать сущность другой таблицы. Если как у меня в настройках инфоблока значения свойств хранятся в отдельной таблице для данного информационного блока, то таблица будет называться b_iblock_element_prop_s3, где цифра 3 - это ID инфоблока. Вот для этой таблицы мы и будем описывать сущность b_iblock_element_prop_s3.
Привожу простой пример класса. Его мы назовем IblockElementPropertyTable и положим в файл elementproperty.php, подключив например в init.php При этом Table в конце названия обязательно. В классе опишем не все поля таблицы, а только те которые нам нужно. Сделаем это для свойства с названием Артикул. Его id равно 21
namespace Bitrix\Iblock;
use Bitrix\Main\Entity;
class IblockElementPropertyTable extends Entity\DataManager{
public static function getTableName(){
return 'b_iblock_element_prop_s3';
}
public static function getMap(){
return
array(
new Entity\IntegerField(
'IBLOCK_ELEMENT_ID',
array(
'primary' => true
)
),
new Entity\StringField(
'PROPERTY_21',
array(
'required' => true
)
)
);
}
}
Так, чтобы получить свойство с id 21 необходимо его описать в данном классе.
После всего необходимо связать две таблицы. Укажем отношение двух столбцов. Для этого обозначим в параметре runtime, что значение из столбца ID таблицы b_iblock_element является "ссылкой" на столбец IBLOCK_ELEMENT_ID таблицы b_iblock_element_prop_s3. И теперь можно в параметре select указать на выборку свойства ID=21.
$params = array(
'filter' => array(
"ID"=>$arId
),
'select' => array(
'ID',
'PROPERTY_21' =>'PROPERTY.PROPERTY_21'
),
);
$params['runtime'] = array(
'PROPERTY' => array(
'data_type' => 'Bitrix\Iblock\IblockElementProperty',
'reference' => array('=this.ID' => 'ref.IBLOCK_ELEMENT_ID'),
)
);
$rs = \Bitrix\Iblock\ElementTable::getList($params);
while($r = $rs->fetch())
{
$arResult[] = $r;
}
Подробнее как описываются поля здесь https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=4803
Так же хорошие статьи
https://tokmakov.msk.ru/blog/item/210
https://dev.1c-bitrix.ru/support/forum/forum6/topic88441/index.php
https://dev.1c-bitrix.ru/community/webdev/user/232354/blog/19113/