Как «включить» отображение свойств на детальной странице товара (api Битрикс)

💡 Проблема: Свойство инфоблока не отображается, хотя оно заполнено

Вы добавили новое свойство в инфоблок (например, «Размер», «Материал» или «Страна-производитель»), заполнили его для элементов, но оно не выводится на детальной странице (например, в карточке товара), даже если в настройках компонента указано его отображение.

Почему так происходит?

В Bitrix, помимо самого факта существования свойства, есть дополнительные «характеристики» (или фичи), которые управляют его поведением в различных частях системы. Одна из таких характеристик — DETAIL_PAGE_SHOW. Она отвечает за то, будет ли свойство участвовать в логике отображения на детальной странице элемента.

Если эта характеристика для свойства не включена (IS_ENABLED = 'N' или запись вообще отсутствует), то система игнорирует его при выводе на детальной странице.

🛠️ Решение: Массовая активация свойства через служебную таблицу b_iblock_property_feature

Вместо того чтобы вручную переключать эти опции в интерфейсе для каждого свойства, можно использовать небольшой PHP-скрипт, который напрямую работает с базой данных Bitrix, а именно с таблицей b_iblock_property_feature.

🎯 Как работает скрипт?

Этот скрипт выполняет простой, но очень эффективный алгоритм для каждого указанного ID свойства:

  1. Подключение к Bitrix: Скрипт использует стандартные механизмы Bitrix (D7) для подключения к ядру и базе данных.
  2. Проверка: Он ищет в таблице b_iblock_property_feature запись, которая соответствует текущему ID свойства, модулю 'iblock' и характеристике 'DETAIL_PAGE_SHOW'.
  3. Обновление или Добавление:
    • Если запись найдена: Это значит, что характеристика уже существует (возможно, была отключена). Скрипт просто обновляет поле IS_ENABLED на 'Y' (ВКЛЮЧЕНО).
    • Если запись не найдена: Это значит, что характеристика никогда не была задана для этого свойства. Скрипт добавляет новую запись, сразу устанавливая IS_ENABLED в 'Y'.
  4. Результат: После выполнения скрипта все перечисленные свойства будут иметь активную характеристику DETAIL_PAGE_SHOW, и компонент детальной страницы сможет их корректно отобразить.

⚠️ Важные моменты безопасности

  • Резервное копирование: Всегда делайте резервную копию базы данных перед выполнением любых прямых SQL-запросов.
  • Идентификация свойств: Убедитесь, что список $propertyIds содержит правильные ID свойств (их можно найти в настройках инфоблока или в таблице b_iblock_property).
  • Местоположение: Скрипт следует запускать в корне сайта (например, как файл prop_fix.php) или в безопасном, временном месте, удаляя его сразу после использования.
  • Фича: Если вам нужно массово включить отображение свойств на странице списка элементов, замените 'DETAIL_PAGE_SHOW' на 'LIST_PAGE_SHOW'.

Этот подход позволяет быстро и массово решить проблему «невидимых» свойств без необходимости ручного перехода по десяткам настроек в административной части.

Скрипт

<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

use Bitrix\Main\Application;


/**
 * ID свойств инфоблока, которые нужно обновить.
 * Вам нужно **самостоятельно** определить, к какому инфоблоку относятся эти свойства.
 */
$propertyIds = [
    287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
    299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310
];

/**
 * ID инфоблока, к которому относятся свойства (если нужно для будущих проверок, хотя в текущем скрипте не используется).
 * Устанавливается для полноты и возможного расширения логики.
 */
// $iblockId = 12; // Пример

/**
 * Название фичи (характеристики) свойства, которую мы активируем.
 * DETAIL_PAGE_SHOW - отвечает за отображение свойства на детальной странице элемента.
 */
$featureId = 'DETAIL_PAGE_SHOW';

/**
 * Название модуля, к которому относится таблица свойств.
 */
$moduleId = 'iblock';

/**
 * Статус активности фичи ('Y' - включено).
 */
$isEnabled = 'Y';


$connection = Application::getConnection();

echo "<h3>⚙️ Запуск обновления характеристик свойств...</h3>";

foreach ($propertyIds as $propId) {
    // 1. Проверяем, есть ли уже запись о характеристике свойства в таблице
    $existing = $connection->query("
        SELECT ID FROM b_iblock_property_feature
        WHERE PROPERTY_ID = {$propId}
        AND MODULE_ID = '{$moduleId}'
        AND FEATURE_ID = '{$featureId}'
    ")->fetch();

    if ($existing) {
        // 2. Если запись есть - обновляем статус (включаем)
        $connection->query("
            UPDATE b_iblock_property_feature
            SET IS_ENABLED = '{$isEnabled}'
            WHERE ID = {$existing['ID']}
        ");
        echo "✅ Свойство **{$propId}** - **обновлено** (уже было, активировано).<br>\n";
    } else {
        // 3. Если записи нет - создаем новую (включаем)
        $connection->query("
            INSERT INTO b_iblock_property_feature
            (PROPERTY_ID, MODULE_ID, FEATURE_ID, IS_ENABLED)
            VALUES ({$propId}, '{$moduleId}', '{$featureId}', '{$isEnabled}')
        ");
        echo "➕ Свойство **{$propId}** - **добавлено** (включено).<br>\n";
    }
}

echo "<br><h2>🎉 Все свойства успешно обновлены!</h2>";
?>

DEBUG

<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

use Bitrix\Main\Application;

$connection = Application::getConnection();

// Проверяем свойство 288 (С галочкой)
echo "<h3>Свойство 288 (показывается на детальной):</h3>";
$features288 = $connection->query("
    SELECT * FROM b_iblock_property_feature 
    WHERE PROPERTY_ID = 288
")->fetchAll();
echo "<pre>";
print_r($features288);
echo "</pre><hr>";

// Проверяем свойство 289 (БЕЗ галочки)
echo "<h3>Свойство 289 (НЕ показывается на детальной):</h3>";
$features289 = $connection->query("
    SELECT * FROM b_iblock_property_feature 
    WHERE PROPERTY_ID = 289
")->fetchAll();
echo "<pre>";
print_r($features289);
echo "</pre><hr>";

// Смотрим все уникальные комбинации MODULE_ID + FEATURE_ID
echo "<h3>Все типы фич в системе:</h3>";
$allFeatures = $connection->query("
    SELECT DISTINCT MODULE_ID, FEATURE_ID 
    FROM b_iblock_property_feature
    ORDER BY MODULE_ID, FEATURE_ID
")->fetchAll();
foreach ($allFeatures as $feature) {
    echo "MODULE: {$feature['MODULE_ID']} | FEATURE: {$feature['FEATURE_ID']}<br>\n";
}
?>

Оцените статью
Разработчик на bitrix и wordpress