Разработка блока «Новинки» 1С-Битрикс
Блок «Новинки» кажется простым виджетом, но за ним стоит ряд архитектурных решений, которые определяют, будет ли это живой инструмент продаж или статическая картинка с надписью «NEW». Задача — отображать актуальные новинки автоматически, без ручного обновления, с корректной работой кеша и без деградации производительности на каталогах с десятками тысяч товаров.
Как работает логика определения «новинок»
Есть несколько подходов, и выбор зависит от того, как в конкретном проекте управляют ассортиментом.
По дате добавления. Самый распространённый вариант. Товар считается новинкой, если разница между DATE_CREATE элемента инфоблока и текущей датой не превышает заданного порога (обычно 30–60 дней). Запрос строится через CIBlockElement::GetList или \Bitrix\Iblock\Elements\ElementTable с фильтром по DATE_CREATE:
'>=DATE_CREATE' => date('d.m.Y', strtotime('-30 days'))
По специальному свойству. Менеджер вручную помечает товары флагом «Новинка» через свойство типа «Checkbox» или список. Гибко, но требует дисциплины со стороны контент-команды. Для автоматического снятия флага через N дней добавляется агент, который обходит b_iblock_element_property и сбрасывает значение.
По тегированному признаку. Если в проекте есть редакционный контроль над ассортиментом (вручную определяют, что является новинкой), используют отдельную секцию инфоблока или группу смарт-фильтра. Логика проще, управление прозрачнее.
Компонент: стандартный vs кастомный
Стандартный bitrix:catalog.section умеет выбирать элементы по секции — но не по дате добавления. Для блока новинок правильнее брать bitrix:catalog.items (d7-компонент) или писать собственный компонент поверх \Bitrix\Iblock\Elements\ElementTable.
Кастомный компонент располагается в /local/components/vendor/catalog.new/. Структура:
catalog.new/
component.php — логика выборки
templates/
.default/
template.php — разметка
style.css
script.js
В component.php делаем выборку с кешем. Ключевое требование — тегированный кеш (\Bitrix\Main\Data\TaggedCache), чтобы при изменении любого товара из выборки блок инвалидировался, а не остальные страницы сайта.
$taggedCache = \Bitrix\Main\Application::getInstance()->getTaggedCache();
$taggedCache->startTagCache($cacheDir);
$taggedCache->registerTag('iblock_id_' . CATALOG_IBLOCK_ID);
// ... выборка ...
$taggedCache->endTagCache();
Производительность и кеш
Блок новинок появляется на главной странице, в шапке раздела, на карточке товара — в трёх местах сразу. Без кеша это три одинаковых запроса к БД при каждом хите. Настраиваем:
-
Кеш компонента — стандартный механизм
CBitrixComponent, время кеширования 3600 секунд - Тегированный кеш — автоматическая инвалидация при обновлении товаров через 1С-обмен
- Композитный кеш — если блок показывается неавторизованным пользователям, он попадает в статический HTML-кеш страницы
Проблема с персонализацией: если на сайте есть группы цен (розница, опт, дилеры), новинки для каждой группы могут отличаться. В этом случае ключ кеша включает GROUP_ID текущего пользователя, и для каждой группы формируется отдельный кеш-слой.
Интеграция с 1С-обменом
Если новинки управляются через дату добавления или флаг, который выгружается из 1С — важно проверить маппинг. В CommerceML дата создания может перезаписываться при каждом полном обмене, что «обнуляет» все товары и делает их новинками. Решение: запрет перезаписи DATE_CREATE в обработчике события OnBeforeIBlockElementUpdate или настройка обмена в режиме «не перезаписывать дату».
Отображение: карусель и адаптивность
Блок новинок часто реализуется как горизонтальная карусель с lazy-load. Загружаем 12–24 товара, отображаем 4–6 в зависимости от viewport. Для инициализации слайдера используем JS-обвязку (Swiper.js или собственная реализация). Важно: разметка карточки товара должна быть идентична той, что используется в каталоге — общий шаблон /local/templates/main/components/vendor/catalog.new/.default/item.php. Это позволяет переиспользовать стили и избежать дублирования вёрстки.
Кнопка «В корзину» в блоке новинок работает через AJAX-запрос к BXBuy.AddProductToBasket или напрямую к sale.basket.add REST API (для headless-сценариев). Счётчик корзины обновляется через BX.onCustomEvent('basketUpdated', ...).
Таблица сроков
| Задача | Срок |
|---|---|
| Блок на базе стандартного компонента с кастомным шаблоном | 1–2 дня |
| Кастомный компонент с тегированным кешем и карусель | 3–4 дня |
| + Интеграция с группами цен и персонализация | +1–2 дня |
| + Агент для автоматического снятия флага новинки | +0.5 дня |
Итоговая архитектура: кастомный компонент в /local/, тегированный кеш, ключ кеша включает группу цен пользователя, JS-карусель с lazy-load, единый шаблон карточки товара. Ничего лишнего, работает быстро, обновляется автоматически.







