Налаштування податкових ставок за регіонами у 1C-Bitrix
Магазин працює на Беларусь та Росію з різними ставками ПДВ. Або продає цифрові товари в ЄС, де ПДВ залежить від країни покупця. Стандартна одна ставка на весь каталог тут не працює — потрібна регіональна логіка.
Групи платників податків
Bitrix реалізує регіональні ставки через механізм груп платників податків (tax groups). Таблиця b_sale_tax зберігає податкові групи, b_sale_tax_rate — ставки всередину груп з привʼязкою до регіону.
Структура b_sale_tax_rate: TAX_ID (посилання на групу), COUNTRY_ID, REGION, CITY, RATE, IS_PERCENT (Y/N), IS_IN_PRICE (Y/N — аналог VAT_INCLUDED), ACTIVE.
Створення податкової групи з регіональними ставками:
// Створити групу
$taxResult = \Bitrix\Sale\Tax::add([
'NAME' => 'ПДВ',
'ACTIVE' => 'Y',
'LID' => 's1',
]);
$taxId = $taxResult->getId();
// Ставка для Беларуси
\Bitrix\Sale\TaxRate::add([
'TAX_ID' => $taxId,
'COUNTRY_ID' => 'BY',
'RATE' => 20,
'IS_PERCENT' => 'Y',
'IS_IN_PRICE' => 'Y',
'ACTIVE' => 'Y',
]);
// Ставка для Росії
\Bitrix\Sale\TaxRate::add([
'TAX_ID' => $taxId,
'COUNTRY_ID' => 'RU',
'RATE' => 20,
'IS_PERCENT' => 'Y',
'IS_IN_PRICE' => 'Y',
'ACTIVE' => 'Y',
]);
Привʼязка податків до властивостей замовлення
Визначення застосовуваної ставки відбувається в момент розрахунку кошика. Bitrix читає адресу покупця з властивостей замовлення (b_sale_order_props_value) — шукає властивість з типом LOCATION або TEXT з кодом країни/регіону.
Привʼязка податкової групи до магазину — налаштування в /bitrix/admin/sale_tax.php. Кожна група може бути активна для конкретного сайту (LID). При розрахунку кошика модуль sale викликає \Bitrix\Sale\Tax::getList() з фільтром за LID та застосовує першу відповідну ставку за країною/регіоном з адреси.
Визначення регіону покупця
Проблема механізму: покупець не завжди заповнює адресу до розрахунку кошика. Для автоматичного визначення регіону за IP використовується модуль seo — клас \Bitrix\Seo\Ip2Location. Він опитує сервіс геолокації та повертає країну/регіон.
Обробник для автопідстановки країни в кошик:
AddEventHandler('sale', 'OnSaleBasketBeforeSaved', function($basket) {
$order = $basket->getOrder();
if (!$order) return;
$ip = $_SERVER['REMOTE_ADDR'];
$location = \Bitrix\Seo\Ip2Location::getLocationByIp($ip);
if ($location && $location['COUNTRY_CODE']) {
// встановити властивість замовлення з кодом країни
$propertyCollection = $order->getPropertyCollection();
$prop = $propertyCollection->getItemByOrderPropertyCode('COUNTRY');
if ($prop) {
$prop->setValue($location['COUNTRY_CODE']);
}
}
});
Податки та ціни: відображення
Якщо у каталозі ціни з ПДВ (VAT_INCLUDED = Y), а регіональна ставка нижча (наприклад, 0% для експорту), кошик має перерахувати ціни. Bitrix це робить автоматично через механізм податків модуля sale, але лише якщо IS_IN_PRICE = Y у b_sale_tax_rate та VAT_INCLUDED = Y у b_catalog_product узгоджені.
Невідповідність цих полів — головне джерело неправильного ПДВ при регіональних ставках. Перевірочний запит для пошуку неузгоджених товарів:
SELECT cp.IBLOCK_ELEMENT_ID, cp.VAT_INCLUDED, cv.RATE
FROM b_catalog_product cp
LEFT JOIN b_catalog_vat cv ON cp.VAT_ID = cv.ID
WHERE cp.VAT_ID IS NOT NULL
AND cp.VAT_INCLUDED != 'Y';
Усі знайдені позиції потрібно привести до єдиного правила перед налаштуванням регіональних ставок.







