Перейти к содержанию

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

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

6 мин 55 Обновлено 22 июля Сложность: Базовая

TL;DR

  • Шаблон news.list копируйте в /local/, а не правьте в /bitrix/.
  • Для обрезки HTML используйте CTextParser::html_cut(), а не substr().
  • html_cut() корректно закрывает теги и не рвёт слова.
  • Длину берут из параметра PREVIEW_TRUNCATE_LEN или задают числом в коде.
  • DETAIL_TEXT должен выбираться компонентом, иначе поле пустое.

Бывает, что поле «Текст анонса» (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() безопаснее.

Материалы по теме

Что почитать дальше по этой теме

Инструкция Вывести количество элементов в разделе (Список новостей) Как в компоненте «Список новостей» 1С-Битрикс посчитать и вывести количество активных элементов внутри раздела инфоблока. Разбираем CIBlockSection::GetSectionElementsCount и учёт вложенных разделов. 7 мин 67 17 января 2017 Инструкция Как вывести определённое поле элемента инфоблока в Битриксе Как в шаблоне компонента 1С-Битрикс вывести одно конкретное поле элемента инфоблока – например счётчик показов SHOW_COUNTER. Разбираем массив FIELDS, служебные поля элемента и безопасный вывод значения. 6 мин 51 18 февраля 2017 Инструкция Получить ID из GET и вывести элементы и свойства инфоблока Как в 1С-Битрикс взять ID элемента из GET-параметра, безопасно его отфильтровать и выбрать поля и свойства элемента инфоблока. Разбираем GetNextElement, защиту от дублей при множественных свойствах и D7-альтернативу. 8 мин 55 19 июля 2019 Инструкция Количество результатов в поиске по новостям (Битрикс) Как изменить количество результатов на странице поиска по новостям в 1С-Битрикс. Меняем параметр PAGE_RESULT_COUNT во вложенном компоненте поиска в шаблоне search.php комплексного компонента «Новости». 5 мин 40 20 февраля 2017