💡 Проблема: Свойство инфоблока не отображается, хотя оно заполнено
Вы добавили новое свойство в инфоблок (например, «Размер», «Материал» или «Страна-производитель»), заполнили его для элементов, но оно не выводится на детальной странице (например, в карточке товара), даже если в настройках компонента указано его отображение.
Почему так происходит?
В Bitrix, помимо самого факта существования свойства, есть дополнительные «характеристики» (или фичи), которые управляют его поведением в различных частях системы. Одна из таких характеристик — DETAIL_PAGE_SHOW. Она отвечает за то, будет ли свойство участвовать в логике отображения на детальной странице элемента.
Если эта характеристика для свойства не включена (IS_ENABLED = 'N' или запись вообще отсутствует), то система игнорирует его при выводе на детальной странице.
🛠️ Решение: Массовая активация свойства через служебную таблицу b_iblock_property_feature
Вместо того чтобы вручную переключать эти опции в интерфейсе для каждого свойства, можно использовать небольшой PHP-скрипт, который напрямую работает с базой данных Bitrix, а именно с таблицей b_iblock_property_feature.
🎯 Как работает скрипт?
Этот скрипт выполняет простой, но очень эффективный алгоритм для каждого указанного ID свойства:
- Подключение к Bitrix: Скрипт использует стандартные механизмы Bitrix (D7) для подключения к ядру и базе данных.
- Проверка: Он ищет в таблице
b_iblock_property_featureзапись, которая соответствует текущему ID свойства, модулю'iblock'и характеристике'DETAIL_PAGE_SHOW'. - Обновление или Добавление:
- Если запись найдена: Это значит, что характеристика уже существует (возможно, была отключена). Скрипт просто обновляет поле
IS_ENABLEDна'Y'(ВКЛЮЧЕНО). - Если запись не найдена: Это значит, что характеристика никогда не была задана для этого свойства. Скрипт добавляет новую запись, сразу устанавливая
IS_ENABLEDв'Y'.
- Если запись найдена: Это значит, что характеристика уже существует (возможно, была отключена). Скрипт просто обновляет поле
- Результат: После выполнения скрипта все перечисленные свойства будут иметь активную характеристику
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";
}
?>


