Интернет-магазин запустил продажу охотничьих товаров — и тут же получил письмо от Роспотребнадзора. Дело не в контенте, а в отсутствии механизма ограничения доступа к категории. Мы, инженеры с 10-летним опытом, знаем, что возрастные ограничения на уровне категорий — это не просто юридическая формальность, а архитектурная задача.
Например, каталог из 10 000 товаров в категории «Оружие» требует проверки возраста 18+. Без правильной настройки рискуете не только штрафом до $4.5k–6.5k., но и блокировкой сайта. Мы предлагаем решение под ключ за 2–3 дня. В этой статье разберём техническую реализацию на базе 1С‑Битрикс.
Как работает проверка возраста?
Проверка возраста начинается с момента, когда пользователь заходит на страницу раздела с ограничением. Битрикс загружает раздел, считывает UF-поле UF_AGE_LIMIT, сравнивает с возрастом, сохранённым в сессии. Если возраст не подтверждён — редирект на специальную страницу с формой подтверждения. После подтверждения возраст запоминается на время сессии. Это минимальная схема.
«Для корректной работы каталога рекомендуется использовать пользовательские свойства разделов инфоблоков» — документация 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-поля для разделов с нужными значениями.
- Реализация проверки возраста на витрине и в корзине.
- Каскадное наследование ограничений.
- Настройка редиректов и страницы подтверждения возраста.
- Тестирование на всех этапах.
- Документация и обучение ваших менеджеров.
Типичные ошибки и как их избежать
| Ошибка | Последствие | Решение |
|---|---|---|
| Отсутствие проверки в API-запросах | Возможность обхода ограничения | Добавить проверку на бэкенде |
| Игнорирование кэширования | Устаревшие данные | Сбрасывать кэш при изменении сессии |
| Неправильное наследование | Нарушение закона | Реализовать каскад |
| Скрытие товаров от поисковых роботов | Выпадение из индекса | Не блокировать ботов |
Сроки выполнения
| Объём работ | Срок |
|---|---|
| UF-поле + проверка для одного каталога | 4–8 часов |
| Каскадное наследование + фильтрация в поиске | 1–2 дня |
| Полная система с сессиями, редиректами и UI | 2–3 дня |
Настройка возрастных ограничений для категорий — задача, где детали важнее общей схемы. Правильно реализованная система не замедляет загрузку каталога (время загрузки не растёт более чем на 5%) и не ломает SEO-индексацию закрытых товаров. Наши инженеры имеют более 50 успешных проектов по внедрению возрастных ограничений. Свяжитесь с нами для консультации — оценим ваш проект бесплатно. Закажите аудит безопасности вашего каталога сегодня.







