Налаштування вікових обмежень для категорій товарів 1С-Бітрікс
Інтернет-магазин запустив продаж мисливських товарів — і одразу отримав лист від контролюючого органу. Справа не в контенті, а у відсутності механізму обмеження доступу до категорії. Вікові обмеження на рівні категорій — це не просто юридична формальність, а архітектурна задача, яку 1С-Бітрікс дозволяє вирішити кількома способами залежно від вимог бізнесу.
Де живуть налаштування: структура інфоблоків та розділів
У ядрі Бітрікс категорії каталогу — це розділи інфоблока (b_iblock_section). Вікове обмеження найзручніше зберігати як користувацьку властивість розділу (UF-поле), а не як окрему таблицю. Це дає можливість керувати обмеженням прямо в адміністративній панелі без додаткового інтерфейсу.
Схема реалізації:
-
Створити UF-поле для розділу через
Налаштування → Користувацькі поляабо програмно черезCUserTypeManager. Тип поля — список (enumeration) або ціле число. Приклад значень:0,16,18,21. -
Прив'язати обмеження до дочірніх елементів. При виведенні каталогу компонент
catalogзвертається до методуCIBlockSection::GetList(). Тут додається логіка: якщо у розділу виставлений віковий поріг — перевірити сесію користувача. -
Зберігати підтверджений вік у сесії (
$_SESSION['AGE_CONFIRMED']або через механізм Бітрікс\Bitrix\Main\Application::getInstance()->getSession()). Після верифікації користувач не проходить перевірку повторно в межах однієї сесії.
$sectionFields = CIBlockSection::GetByID($sectionId)->Fetch();
$ageLimit = (int)$sectionFields['UF_AGE_LIMIT'];
if ($ageLimit > 0) {
$session = \Bitrix\Main\Application::getInstance()->getSession();
$confirmedAge = (int)$session->get('USER_CONFIRMED_AGE');
if ($confirmedAge < $ageLimit) {
LocalRedirect('/age-confirm/?required=' . $ageLimit . '&back=' . urlencode($requestUri));
}
}
Каскадне успадкування обмежень
Складний момент — багаторівневі категорії. Якщо батьківський розділ має обмеження 18+, чи повинні дочірні успадковувати його автоматично? За замовчуванням — ні. Потрібна явна логіка.
Варіант 1: при збереженні розділу через обробник події OnBeforeIBlockSectionAdd / OnBeforeIBlockSectionUpdate рекурсивно проставити UF-поле дочірнім розділам.
Варіант 2: при перевірці підніматися вгору по ланцюжку розділів (IBLOCK_SECTION_ID) і брати максимальне значення обмеження з усієї гілки. Цей варіант гнучкіший — дочірні розділи можуть мати власні, вищі обмеження.
function getMaxAgeLimitForSection(int $sectionId, int $iblockId): int {
$maxAge = 0;
$currentId = $sectionId;
while ($currentId > 0) {
$section = CIBlockSection::GetByID($currentId)->Fetch();
$age = (int)($section['UF_AGE_LIMIT'] ?? 0);
$maxAge = max($maxAge, $age);
$currentId = (int)$section['IBLOCK_SECTION_ID'];
}
return $maxAge;
}
Відображення в каталозі та фільтрація
Товари з обмежених категорій не повинні просто «ламатися» — вони мають коректно відображатися або ховатися залежно від бізнес-вимог. Два підходи:
Приховувати з видачі повністю — через GetList з фільтром по розділах, де UF_AGE_LIMIT <= підтверджений вік користувача. Працює для пошуку та вітрини одночасно.
Показувати з блокуванням — товари видно, але кнопка «Купити» замінюється на «Підтвердіть вік». Реалізується через шаблон компонента bitrix:catalog.element з перевіркою UF-поля розділу.
Мітки категорій з обмеженням (піктограма «18+») додаються в шаблон bitrix:catalog.section.list — беремо UF_AGE_LIMIT з $arSection і умовно виводимо бейдж.
Адміністративне управління
У розділі каталогу в адміністративній панелі з'явиться нове поле. Менеджер обирає обмеження зі списку при редагуванні розділу. Важливо: якщо магазин використовує D7 та компоненти на основі Bitrix\Iblock\Component\Base, логіку перевірки віку потрібно додавати в обробник події OnBeforeComponentInit або перевизначати метод getAdditionalFilter() у класі компонента.
Терміни виконання
| Обсяг робіт | Термін |
|---|---|
| UF-поле + перевірка для одного каталогу | 4–8 годин |
| Каскадне успадкування + фільтрація в пошуку | 1–2 дні |
| Повна система з сесіями, редиректами та UI | 2–3 дні |
Налаштування вікових обмежень для категорій — задача, де деталі важливіші за загальну схему. Правильно реалізована система не сповільнює завантаження каталогу і не ламає SEO-індексацію закритих товарів.







