Настройка ограничения времени продажи товаров (алкоголь) 1С-Битрикс
Российское законодательство запрещает продажу алкоголя в ночное время — с 23:00 до 08:00 (федеральный закон №171-ФЗ). Регионы могут устанавливать более строгие ограничения: например, в Чечне и Ингушетии продажа алкоголя ограничена сильнее. Интернет-магазин обязан блокировать возможность оформления заказа с алкогольными товарами в запрещённое время.
Точки блокировки в Битрикс
Ограничение нужно применять в нескольких местах одновременно — иначе покупатель либо обойдёт его, либо увидит непонятную ошибку на последнем шаге:
- Кнопка «Купить» на карточке товара — скрыть или заблокировать в запрещённое время
-
Добавление в корзину — обработчик события
OnSaleBasketItemAdd -
Оформление заказа — проверка перед сохранением заказа в
OnBeforeSaleOrderSaved
Определение временного окна
Ключевой вопрос — по какому часовому поясу считать время. Три подхода:
- По серверному времени — просто, но неверно: сервер в Москве, покупатель во Владивостоке
- По часовому поясу покупателя — через геолокацию IP (база MaxMind GeoIP или аналог)
- По времени доставки — для курьерской доставки актуально время в городе получателя
Наиболее правильный подход для интернет-магазина с доставкой — определять часовой пояс по IP покупателя. В Битрикс для этого используется модуль sale.location или сторонняя база геолокации.
Простая проверка по московскому времени (UTC+3):
function isAlcoholSaleAllowed(): bool {
$hour = (int)date('H', time() + 3 * 3600); // московское время
return ($hour >= 8 && $hour < 23);
}
Пометка алкогольных товаров
В инфоблоке каталога создаётся свойство UF_IS_ALCOHOL (тип «Да/Нет»). Или используется привязка к разделу: если раздел «Алкоголь» имеет флаг UF_TIME_RESTRICTED, все товары в нём подпадают под ограничение.
Проверка принадлежности товара к ограниченной категории:
function isTimeRestrictedProduct(int $productId): bool {
$element = CIBlockElement::GetByID($productId)->Fetch();
if ($element['PROPERTY_UF_IS_ALCOHOL_VALUE'] === 'Y') return true;
// Проверяем раздел
$section = CIBlockSection::GetByID($element['IBLOCK_SECTION_ID'])->Fetch();
return $section['UF_TIME_RESTRICTED'] === '1';
}
Обработчик добавления в корзину
AddEventHandler('sale', 'OnSaleBasketItemAdd', function(&$arFields) {
if (!isTimeRestrictedProduct($arFields['PRODUCT_ID'])) return;
if (!isAlcoholSaleAllowed()) {
$arFields['ERROR_MESSAGE'] =
'Продажа алкоголя разрешена с 08:00 до 23:00 по московскому времени';
return false;
}
});
Визуальная блокировка на фронтенде
На карточке товара и в каталоге кнопка «Купить» заменяется сообщением о временных ограничениях. JavaScript проверяет время клиента — но это не замена серверной проверке, а дополнение к ней:
const hour = new Date().getHours();
if (isAlcoholProduct && (hour < 8 || hour >= 23)) {
document.querySelector('.buy-btn').disabled = true;
document.querySelector('.buy-btn').textContent = 'Продажа с 08:00 до 23:00';
}
Региональные ограничения
Если магазин работает с регионами, где ограничения строже федеральных, часовой пояс и временное окно определяются динамически по геолокации IP. База данных регионов с их ограничениями хранится в отдельной таблице.
Что входит в настройку
- Создание свойства
UF_IS_ALCOHOLилиUF_TIME_RESTRICTEDв инфоблоке - Серверная проверка времени с учётом часового пояса покупателя
- Обработчик
OnSaleBasketItemAddс блокировкой алкогольных товаров - Проверка перед сохранением заказа в
OnBeforeSaleOrderSaved - Визуальная блокировка кнопки «Купить» в запрещённое время
- При необходимости — поддержка региональных ограничений







