Налаштування обмеження часу продажу товарів (алкоголь) 1С-Бітрікс
Законодавство забороняє продаж алкоголю в нічний час — з 23:00 до 08:00. Регіони можуть встановлювати суворіші обмеження. Інтернет-магазин зобов'язаний блокувати можливість оформлення замовлення з алкогольними товарами в заборонений час.
Точки блокування в Бітрікс
Обмеження потрібно застосовувати одразу в кількох місцях — інакше покупець або обійде його, або побачить незрозумілу помилку на останньому кроці:
- Кнопка «Купити» на картці товару — приховати або заблокувати в заборонений час
-
Додавання до кошика — обробник події
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 - Візуальне блокування кнопки «Купити» в заборонений час
- За потреби — підтримка регіональних обмежень







