Как выбрать свойства элемента в ElementTable::getList в D7 ORM Битрикс?

Вы убрали 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

Сравнение ElementTable и ApiCodeTable для выборки свойств D7 ORM

Поле - 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 и CODE свойств
  1. Свойства в отдельной таблице (инфоблок 2.0) в настройках ИБ.
  2. Заполнен API_CODE инфоблока - иначе нет Element{ApiCode}Table.
  3. У свойств символьный CODE; не совпадает с полем элемента NAME/CODE.
  4. В getMap() ElementTable нет PROPERTY_*.
  5. Решите ветку: compiled entity или runtime (см. таблицу ниже).

Выберите: Element{ApiCode}Table или Runtime

Схема выбора между Element ApiCode Table и Runtime join
Ситуация 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.

Проверьте чеклист перед продом

  1. В fetch()/fetchObject() все CODE под ожидаемыми ключами.
  2. Фильтр по свойству работает на пустом и заполненном значении.
  3. На 20+ элементах один основной SQL, без N+1.
  4. Множественное 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 между стендами.

Обсудить вашу задачу

Было полезно?

Поставьте лайк, если статья помогла разобраться.

Поделиться статьёй

Отправьте тому, кому это пригодится.

Telegram ↗ MAX ↗ ВКонтакте ↗ Одноклассники ↗
Все статьи ↗

Как настроить регистрацию и личный кабинет покупателя на 1С-Битрикс?

Структура шаблонов сайта в Битриксе и поиск header footer

Как настроить скидки и промокоды на 1С-Битрикс: правила корзины и купоны