Вы убрали CIBlockElement::GetList и вызываете ElementTable::getList, в select добавили PROPERTY_ARTNUMBER - а в fetch() снова только ID и NAME. Свойства не пропали из базы: их нет в getMap() у "голого" ElementTable. Ниже - как за один elementtable getlist выбрать свойства в CMS 1С-Битрикс через Element{ApiCode}Table или runtime Reference, проверить SQL и не получить Unknown field PROPERTY.
ElementTable::getList в D7 ORM читает только колонки b_iblock_element из getMap(); пользовательские свойства - отдельные VALUE/DESCRIPTION, не поля PROPERTY_* в select. Сегодня проверьте API_CODE инфоблока и CODE свойств. С API_CODE берите Element{ApiCode}Table и select BRAND_VALUE => BRAND.VALUE. Без API_CODE - runtime join к ElementPropertyTable с фильтром Property.CODE. После запроса сверьте getLastQuery: один JOIN, ключи fetch() = алиасы select.
Материал про "1С-Битрикс: Управление сайтом", не Bitrix24. D7 ORM - слой, который собирает SQL из getList: select, filter, runtime. ElementTable знает "шапку" элемента; свойства лежат в других таблицах, поэтому префикс PROPERTY_ из старого GetList сам не заработает.
Что такое выборка свойств через ElementTable::getList
Поле - NAME, CODE, PREVIEW_TEXT в b_iblock_element, уже в getMap(). Property - значение с символьным CODE (ARTNUMBER, BRAND) в таблице свойств. ORM подключает property через Element{ApiCode}Table (с iblock 19.0.0+) или runtime Reference.
Нужно: список каталога с 2-5 свойствами без N+1 GetProperty. Не здесь: один элемент - GetByID/GetPropertyValues; запись - SetPropertyValues; сравнение GetList vs D7 - B60.
Делайте: сначала API_CODE. Не делайте: PROPERTY_* в select ElementTable без entity/runtime.
Проверьте инфоблок: 2.0, API_CODE и CODE
- Свойства в отдельной таблице (инфоблок 2.0) в настройках ИБ.
- Заполнен API_CODE инфоблока - иначе нет Element{ApiCode}Table.
- У свойств символьный CODE; не совпадает с полем элемента NAME/CODE.
- В getMap() ElementTable нет PROPERTY_*.
- Решите ветку: compiled entity или runtime (см. таблицу ниже).
Выберите: Element{ApiCode}Table или Runtime
| Ситуация | Element{ApiCode}Table | ElementTable + runtime |
|---|---|---|
| API_CODE есть | Предпочтительно | Длиннее код |
| Множественные свойства | fetchObject() + коллекция | Дубли строк в fetchAll() |
| Чужой ИБ без API_CODE | Нет класса | Reference на ElementPropertyTable |
На практике ветку с API_CODE выбирают почти всегда: меньше runtime и проще filter по BRAND.VALUE. Join::on - в гайде B79. Не делайте: prop_s вручную при наличии API_CODE.
Настройте Element{ApiCode}Table::getList
use Bitrix\Main\Loader;
use Bitrix\Iblock\Elements\ElementCatalogTable;
Loader::includeModule('iblock');
$result = ElementCatalogTable::getList([
'select' => [
'ID', 'NAME',
'BRAND_VALUE' => 'BRAND.VALUE',
'NEWPRODUCT_NAME' => 'NEWPRODUCT.ITEM.VALUE',
],
'filter' => ['=ACTIVE' => 'Y', '=BRAND.VALUE' => 'Acme'],
'limit' => 50,
]);
while ($row = $result->fetch()) { /* BRAND_VALUE */ }
Нет PROPERTY_: связи по CODE свойства. Список - .ITEM.VALUE, файл - .FILE. Делайте: короткие алиасы в select. Не делайте: fetchAll() + несколько M:N свойств с limit - связи обрежутся.
Соберите runtime join к ElementPropertyTable
use Bitrix\Main\ORM\Query\Join;
use Bitrix\Main\ORM\Fields\Relations\Reference;
use Bitrix\Iblock\{ElementTable, ElementPropertyTable, PropertyTable};
$result = ElementTable::getList([
'select' => ['ID', 'NAME', 'PROP_VALUE' => 'ELEMENT_PROPERTY.VALUE'],
'filter' => [
'=IBLOCK_ID' => 5, '=PROPERTY.CODE' => 'ARTNUMBER',
],
'runtime' => [
new Reference('ELEMENT_PROPERTY', ElementPropertyTable::class,
Join::on('this.ID', 'ref.IBLOCK_ELEMENT_ID')),
new Reference('PROPERTY', PropertyTable::class,
Join::on('ref.IBLOCK_PROPERTY_ID', 'this.ID')),
],
]);
Фильтр по Property.CODE переносим между средами. Результат: один SQL на 50 элементов вместо 50+ GetProperty.
Разберите списочные и множественные свойства
Список: join PropertyEnumerationTable или NEWPRODUCT.ITEM в compiled entity. Множественное: только fetchObject() и коллекция по CODE - иначе одно VALUE или лишние строки. Enum подробнее - CIBlockPropertyEnum.
Делайте: LEFT-поведение, если элемент без свойства должен остаться в выборке. Не делайте: считать строки fetchAll() за число элементов при join к M:N.
Отладьте getLastQuery и типичные ошибки
| Симптом | Причина | Действие |
|---|---|---|
| Unknown field PROPERTY_* | Нет в getMap() | ApiCodeTable или runtime |
| Пусто в fetch() | Неверный CODE/алиас | Сверить select и админку |
| Строк больше, чем элементов | Множественное свойство | fetchObject() или группировка |
В реальном проекте типичная ошибка - смотреть только fetch() и не открыть getLastQuery(): join к свойству есть, а алиас в select другой. Снимите SQL через getLastQuery() или getTracker(). Компромисс - GetPropertyValuesArray по ID; полная миграция - B60.
Проверьте чеклист перед продом
- В fetch()/fetchObject() все CODE под ожидаемыми ключами.
- Фильтр по свойству работает на пустом и заполненном значении.
- На 20+ элементах один основной SQL, без N+1.
- Множественное property отдает все значения.
Вопросы по миграции каталога - контакты, кейсы - портфолио.
Проверено: Максим Молков (профиль). Источники: ElementTable, архитектура ORM инфоблоков, урок 12866 курса 43. Актуальность: iblock 19.0.0+, API_CODE.
Частые вопросы
Как вывести свойства элемента через ElementTable?
Не PROPERTY_* в select ElementTable. С API_CODE - Element{ApiCode}Table::getList и MY_PROP => MY_PROP.VALUE. Иначе runtime Reference на ElementPropertyTable + Property.CODE в filter. Сверьте алиасы select с ключами fetch().
Чем property отличается от поля в getList?
Поле - колонка элемента в getMap() (NAME). Property - VALUE в таблице свойств с CODE; в ORM это Reference, не PROPERTY_*. Legacy GetList понимает PROPERTY_; ElementTable::getList - нет.
Можно ли без CIBlockElement::GetList?
Да при инфоблоке 2.0 и API_CODE: один Element{ApiCode}Table::getList заменяет GetList + цикл GetProperty. Без API_CODE - runtime или GetPropertyValuesArray пачкой. Сравнение API - статья B60 на mvmolkov.ru.
Как получить множественное свойство в D7?
fetchObject() после getList и коллекция по CODE. fetch()/fetchAll() после join к одному VALUE дадут одно значение или дубли строк. Для MORE_PHOTO - .FILE или объектная коллекция.
Почему Unknown field PROPERTY?
Поля нет в getMap() ElementTable. Перейдите на Element{ApiCode}Table или runtime с алиасом PROP_VALUE => ELEMENT_PROPERTY.VALUE. API: ElementTable::getList, ElementPropertyTable, ReferenceField.
Как отфильтровать getlist property битрикс d7?
В compiled entity: '=BRAND.VALUE'. В runtime: '=PROPERTY.CODE' => 'ARTNUMBER' и условие на ELEMENT_PROPERTY.VALUE. Не привязывайте filter к IBLOCK_PROPERTY_ID между стендами.
Было полезно?
Поставьте лайк, если статья помогла разобраться.
Поделиться статьёй
Отправьте тому, кому это пригодится.
Можно поделиться и фрагментом: выделите текст статьи.