Перейти к содержанию
Инструкция

В анонсе новостей вывести детальное описание и обрезать текст

Как в анонсе компонента «Список новостей» 1С-Битрикс выводить текст из детального описания вместо превью и аккуратно обрезать его до нужной длины через CTextParser::html_cut, не ломая HTML-теги.

Обновлено 22 июля 6 минут чтения 1 просмотр

Бывает, что поле «Текст анонса» (PREVIEW_TEXT) у новостей не заполнено, а короткое описание для списка нужно. Тогда в шаблоне компонента bitrix:news.list можно взять начало детального описания (DETAIL_TEXT) и аккуратно обрезать его до нужной длины. Ключевое слово – «аккуратно»: простой substr() порежет HTML посреди тега и сломает вёрстку. Правильный инструмент в Битриксе – класс CTextParser и его метод html_cut(). Приём рабочий и в 2026 году.

Шаг 1. Копируем шаблон компонента к себе

Никогда не правьте файлы в /bitrix/components/ – при обновлении они перезапишутся. Скопируйте шаблон в свою тему:

/local/templates/ВАШ_ШАБЛОН/components/bitrix/news.list/ИМЯ_ШАБЛОНА/template.php

В 2026 году предпочтительна папка /local/ вместо /bitrix/templates/ – она не затрагивается обновлениями ядра и переносится вместе с проектом.

Шаг 2. Выводим обрезанное детальное описание

В template.php внутри цикла по элементам добавляем код. Он учитывает штатный параметр компонента PREVIEW_TRUNCATE_LEN («Максимальная длина анонса для вывода»):

if ($arParams["DISPLAY_PREVIEW_TEXT"] != "N" && $arItem["DETAIL_TEXT"]):
    $obParser = new CTextParser;
    if ($arParams["PREVIEW_TRUNCATE_LEN"] > 0) {
        // обрезаем текст детального описания, не ломая HTML-теги
        $arItem["DETAIL_TEXT"] = $obParser->html_cut(
            $arItem["DETAIL_TEXT"],
            $arParams["PREVIEW_TRUNCATE_LEN"]
        );
    }
    echo $arItem["DETAIL_TEXT"];
endif;

Как работает html_cut

CTextParser::html_cut($text, $len) обрезает строку примерно до $len символов, но при этом корректно закрывает открытые HTML-теги и не рвёт слова посередине. Именно поэтому он безопаснее обычного substr() для контента с разметкой. Метод добавляет и многоточие в конце обрезанного текста.

Шаг 3. Задать длину прямо в коде (без параметра компонента)

Если не хотите зависеть от настройки «Максимальная длина анонса», задайте число прямо в шаблоне:

$bigText   = $arItem["DETAIL_TEXT"];  // текст, который сокращаем
$obParser  = new CTextParser;
$textLength = 100;                    // нужная длина
$smallText = $obParser->html_cut($bigText, $textLength);
echo $smallText;

Важно про DETAIL_TEXT в выборке

Чтобы $arItem["DETAIL_TEXT"] вообще пришёл в шаблон списка, поле должно выбираться компонентом. У news.list за это отвечает набор полей: убедитесь, что детальное описание запрашивается, иначе поле будет пустым и обрезать окажется нечего. Проверить можно, выведя <?=var_dump(!empty($arItem["DETAIL_TEXT"]))?> во время отладки.

Нюансы и производительность

  • Тип текста. Если DETAIL_TEXT хранится в формате HTML – html_cut() обработает теги корректно. Если это визуальный редактор с BB-кодами, сначала может понадобиться преобразование.
  • Кэш компонента. Обрезка происходит в шаблоне, который кэшируется вместе с компонентом, – на каждый показ парсер заново не гоняется. Дополнительно оптимизировать не нужно.
  • SEO-дубли. Выводя начало детального текста в списке, вы дублируете контент детальной страницы. Для больших списков это не критично, но следите, чтобы анонс не повторял всю статью целиком.
  • Альтернатива. Для plain-text без разметки подойдёт штатная функция TruncateText($text, $len) – она короче, но не так бережно работает с HTML, как html_cut().

Смежные приёмы работы со «Списком новостей»: как вывести количество элементов в разделе, как вывести определённое поле элемента и как выбрать элемент по ID из GET.

Частые вопросы

Почему нельзя обрезать текст обычным substr()?

substr() режет строку по количеству символов вслепую и может оборвать HTML посреди тега – вёрстка после этого ломается. CTextParser::html_cut() учитывает разметку: корректно закрывает открытые теги и не рвёт слова.

Откуда html_cut берёт длину обрезки?

Вы передаёте её вторым аргументом. Обычно берут значение из штатного параметра компонента PREVIEW_TRUNCATE_LEN («Максимальная длина анонса для вывода»), но можно задать число прямо в шаблоне, например 100.

Почему $arItem["DETAIL_TEXT"] пустой в списке новостей?

Поле детального описания должно выбираться компонентом news.list. Если оно не запрошено в настройках выборки, в шаблон придёт пустая строка – проверьте набор выбираемых полей компонента.

Актуален ли CTextParser в 2026 году?

Да, класс CTextParser и метод html_cut() входят в ядро 1С-Битрикс и остаются рабочими. Для простого текста без HTML можно использовать и функцию TruncateText(), но с разметкой html_cut() безопаснее.

Валентина Меланина

Хотите обсудить свой проект?

Помогу с разработкой, аналитикой и AI-видимостью вашего сайта

Если у вас есть задача — от внедрения разметки и аналитики до полной переработки сайта — напишите, обсудим объём и подход.