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