Розробка блока «Новинки» для 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, єдиний шаблон карточки товара. Ніяких зайвих, працює швидко, оновлюється автоматично.







