SECTION_PAGE_URL пуст? Полный гайд по устранению ошибки в 1С-Битрикс с пошаговыми примерами

Чаще всего поле остаётся пустым, когда не задан шаблон «URL страницы раздела» в настройках инфоблока — либо ваш скрипт читает данные не из того инфоблока. Ниже приведены четыре надёжных паттерна, которые быстро вернут рабочие ссылки и не сломаются при изменениях контента или настроек.

Что делать, если SECTION_PAGE_URL пуст?

Зачем вообще нужен SECTION_PAGE_URL

  • Формирует «чистый» адрес раздела («ЧПУ»), который любят пользователи и поисковые роботы.
  • Лежит в основе хлебных крошек, sitemap.xml, <canonical>, а иногда и фильтров.
  • От него зависят такие компоненты, как news.list, catalog.section.list, breadcrumb, «Умный фильтр» и др.

Если поле пустое, компонент выводит относительный путь вида /bitrix/…/index.php?SECTION_ID=42, что портит SEO-видимость и юзабилити.

Причины, по которым SECTION_PAGE_URL оказывается пустым

Причина Как диагностировать Как лечить
Не задан шаблон URL В админке пустое поле «URL страницы раздела» Заполнить шаблон (см. способ 1)
Код читает «не тот» инфоблок $sec['IBLOCK_ID'] не совпадает с нужным Проверьте ID и права доступа
Промежуточный кеш В dev-режиме URL «есть», а на проде — нет Очистите кеш или включите компонент «без кеша» на время теста
Раздел без символического кода В таблице b_iblock_section поле CODENULL Сгенерируйте символьные коды или включите автогенерацию

1. Задаём шаблон URL в настройках инфоблока

  1. Контент → Инфоблоки → нужный инфоблок → Изменить.
  2. В блоке «URL страницы раздела» запишите, например:
    #SITE_DIR#news/#SECTION_CODE_PATH#/
  3. Сохраните изменения и очистите кеш компонентов.

Проверочный код

<?php
$iblock = CIBlock::GetArrayByID($sec['IBLOCK_ID']);

$sec['SECTION_PAGE_URL'] = CIBlock::ReplaceDetailUrl(
    $iblock['SECTION_PAGE_URL'], // ← шаблон, который вы только что задали
    $sec,
    true,
    'S'
);

echo $sec['SECTION_PAGE_URL']; // /news/promo/akcija-20-proc/
?>

D7-вариант (короткий, без вызова «старыми» функциями):

use Bitrix\Iblock\Iblock;
use Bitrix\Iblock\Url\AdminPage\SectionAdminPageBuilder;

$iblock = Iblock::wakeUp($sec['IBLOCK_ID']);
$template = $iblock->getUrlTemplates()->getSectionUrlTemplate();
$builder  = new SectionAdminPageBuilder($template);

$sec['SECTION_PAGE_URL'] = $builder->build(
    ['SECTION_CODE_PATH' => $sec['CODE_PATH']]
);

2. Когда шаблон менять нельзя — формируем URL вручную

Иногда шаблон «забит» под старую структуру, а прав на его редактирование нет. Самый безопасный путь — собрать URL программно:

<?php
use Bitrix\Iblock\SectionTable;
use CIBlockSection;

$sections = SectionTable::query()
    ->setSelect(['ID', 'IBLOCK_ID', 'CODE'])
    ->whereIn('ID', $ids)             // $ids — нужные ID разделов
    ->fetchCollection();

foreach ($sections as $section)
{
    // 1. Получаем цепочку родителей
    $chain = CIBlockSection::GetNavChain(
        $section->getIblockId(),
        $section->getId(),
        ['CODE']
    );

    // 2. Склеиваем символьные коды
    $codes = [];
    while ($row = $chain->Fetch())
        $codes[] = $row['CODE'];

    // 3. Собираем финальный URL
    $section['SECTION_PAGE_URL'] = '/news/' . implode('/', $codes) . '/';
}
?>

Плюсы метода

  • Не зависит от настроек инфоблока: даже если админ очистит шаблон, ссылка продолжит строиться.
  • Логика «в одном месте» — удобно поддерживать.

Минусы

  • Один доп-запрос GetNavChain на каждый раздел. Решается кешем или батч-запросом.

3. Быстрый «костыль» — ставим фолбэк, если шаблон пуст

Подходит для существующих проектов, где страшно что-то менять.

<?php
$iblock   = CIBlock::GetArrayByID($sec['IBLOCK_ID']);
$template = $iblock['SECTION_PAGE_URL'];

if ($template)                     // шаблон есть → используем стандартный путь
{
    $sec['SECTION_PAGE_URL'] = CIBlock::ReplaceDetailUrl(
        $template,
        $sec,
        true,
        'S'
    );
}
else                               // шаблона нет → надёжный фолбэк
{
    $sec['SECTION_PAGE_URL'] = '/news/' . $sec['CODE'] . '/';
}
?>

Совет: добавьте логирование в ветку else — так вы узнаете, кто и когда «сломал» шаблон.

4. Расширенный подход — собственный хелпер

Чтобы не дублировать логику, вынесите всё в одну функцию и подключайте через Composer-автолоадер или Bitrix-модуль:

<?php
namespace My\Tools;

use Bitrix\Iblock\SectionTable;
use CIBlockSection;
use CIBlock;

class Url
{
    public static function getSectionUrl(array $section, string $base = '/news/'): string
    {
        static $cache = [];

        $iblockId = $section['IBLOCK_ID'];

        // 1. Пробуем шаблон
        if (!isset($cache[$iblockId]))
        {
            $iblock          = CIBlock::GetArrayByID($iblockId);
            $cache[$iblockId] = $iblock['SECTION_PAGE_URL'];
        }

        $template = $cache[$iblockId];

        if ($template)
        {
            return CIBlock::ReplaceDetailUrl($template, $section, true, 'S');
        }

        // 2. Фолбэк — ручная сборка пути
        $chain = CIBlockSection::GetNavChain(
            $iblockId,
            $section['ID'],
            ['CODE']
        );

        $codes = [];
        while ($row = $chain->Fetch())
            $codes[] = $row['CODE'];

        return $base . implode('/', $codes) . '/';
    }
}
?>

Использование:

$url = \My\Tools\Url::getSectionUrl($sec);

Чек-лист перед публикацией

  1. Убедитесь, что у всех разделов проставлен символьный код (CODE).
  2. Очистите кеш компонентов и меню после изменения шаблона.
  3. Если применяете способ 2 или 3, проверьте нагрузку на БД и при необходимости закешируйте GetNavChain.
  4. Включите «Отладку композиций URL» в /bitrix/.settings.php, чтобы ловить ошибки ещё на dev-стенде.

Итоги

  • Базовое решение — задать правильный шаблон в инфоблоке.
  • Гарантированное решение — формировать URL самостоятельно, отталкиваясь от SECTION_CODE_PATH.
  • Продвинутое решение — вынести генерацию URL в общий хелпер и кешировать результаты.

Так вы защитите проект от случайных ошибок контент-менеджеров, не потеряете позиции в поиске и избавитесь от битых хлебных крошек.

Теги:  SECTION_PAGE_URL, ошибка, устранение, гайд, примеры, SEO, юзабилити

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Модули и компоненты для «1С-Битрикс»

оценка производится на основе предоставленного Технического Задания

от 20 000 рублей
Разработка дополнительных модулей для 1С-Битрикс, расширение функционала, внедрение любых решений, требующихся для выполнения ваших бизнес-задач.

* стоимость зависит от конкретной задачи, ее объема и сложности выполняемых работ.

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.

Техническая поддержка

выполняется с сайтами на основе любых CMS

от 5 000 рублей
Оптимизация производительности действующих интернет-проектов, наполнение и сопровождение, полная техническая поддержка и продвижение в поисковых сетях.

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.