Представьте: ваш товар с НДС 20% попадает в корзину покупателя из Казахстана, где ставка 12%. Если налоги считаются по единой российской ставке, вы теряете конкурентоспособность или платите лишнее. Это частая боль при выходе на международные рынки. Мы решаем такие задачи с помощью штатных механизмов Битрикс без костылей. За 9 лет настроили налоги для 50+ интернет-магазинов, и в 80% случаев проблема кроется в несогласованности флагов VAT_INCLUDED и IS_IN_PRICE.
Проблемы, которые решаем
Типичная ситуация: магазин на Битрикс выходит на экспорт, но налоги продолжают считаться по единой ставке. Или товары с НДС 0% для Казахстана попадают в корзину с российским НДС 20%. Корень проблем — неправильная настройка налоговых групп и отсутствие привязки к региону покупателя. Аудит выявляет до 15% товаров с неправильными настройками. Мы это чиним.
Как устроены налоговые группы в Битрикс
Битрикс реализует региональные ставки через механизм групп налогоплательщиков (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', ]); Как налоги привязываются к заказу?
Определение применяемой ставки происходит в момент расчёта корзины. Битрикс читает адрес покупателя из свойств заказа (b_sale_order_props_value) — ищет свойство с типом LOCATION или TEXT с кодом страны/региона. Привязка налоговой группы к магазину настраивается в /bitrix/admin/sale_tax.php. Каждая группа может быть активна для конкретного сайта (LID). При расчёте корзины модуль sale вызывает \Bitrix\Sale\Tax::getList() с фильтром по LID и применяет первую подходящую ставку по стране/региону из адреса.
Почему важно согласовать VAT_INCLUDED и IS_IN_PRICE?
Если в каталоге цены с НДС (VAT_INCLUDED = Y), а региональная ставка ниже (например, 0% для экспорта), корзина должна пересчитать цены. Битрикс это делает автоматически через механизм налогов модуля 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'; Все найденные позиции нужно привести к единому правилу перед настройкой региональных ставок. Экономия от правильной настройки составляет от $100–500 в месяц.
| Тип товара | VAT_INCLUDED | IS_IN_PRICE ставки | Результат |
|---|---|---|---|
| С НДС | Y | Y | Цена с НДС, ставка применяется |
| С НДС | Y | N | НДС начисляется сверху — двойной налог |
| Без НДС | N | Y | НДС не вычитается — цена без налога |
Как автоматически определить регион покупателя?
Проблема: покупатель не всегда заполняет адрес до расчёта корзины. Для автоматического определения региона по IP используем модуль seo — класс \Bitrix\Seo\Ip2Location. Он опрашивает сервис геолокации и возвращает страну/регион. Обработчик подставляет код страны в свойство заказа, и налоги рассчитываются верно. Автоматическое определение в 5 раз быстрее ручного выбора из списка и исключает ошибки.
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']); } } }); Типичные ошибки при настройке региональных налогов
| Ошибка | Причина | Решение |
|---|---|---|
| Налог не пересчитывается при смене региона | Ставка не привязана к региону в b_sale_tax_rate | Добавить записи с REGION или CITY |
| Двойной НДС в корзине | VAT_INCLUDED товара и IS_IN_PRICE ставки не совпадают | Синхронизировать флаги через SQL-запрос |
| 0% НДС для экспорта не применяется | Не создана отдельная налоговая группа для экспорта | Создать группу с RATE=0 и привязать к стране |
Как мы это делаем: реальный кейс из нашей практики
У нашего клиента, магазина электроники, была задача: продажи в России и Казахстане. В Казахстане НДС 12% (льготная ставка), но корзина считала 20%. После аудита выяснили: налоговая группа одна, ставка привязана только к России. Добавили ставку для Казахстана с RATE=12 и привязали к COUNTRY_ID='KZ'. Дополнительно настроили автоматическое определение региона через IP. Результат: налоги рассчитываются корректно для каждого покупателя, экономия на переплате составила до $140–200 в месяц для клиента.
Процесс работы
- Аналитика — разбираем текущие налоговые настройки и торговые сценарии.
- Проектирование — схема налоговых групп и ставок под вашу географию.
- Реализация — создание групп, настройка автоматического определения региона, интеграция с 1С (если нужен обмен через CommerceML).
- Тестирование — проверка расчётов для каждого региона в тестовом окружении.
- Деплой — применение изменений на боевом сайте, обучение персонала.
Что входит в услугу
- Аудит текущей налоговой конфигурации
- Создание до 10 налоговых групп и ставок
- Настройка автоматического определения региона по IP
- Интеграция с 1С УТ/ЕРП через CommerceML
- Документация по изменениям
- Бесплатная поддержка 1 месяц после сдачи
Оценка стоимости и сроков
Стоимость рассчитывается индивидуально в зависимости от количества стран, ставок и сложности интеграции. Ориентировочные сроки — от 2 до 7 рабочих дней. Если вы хотите избавиться от ошибок в расчёте НДС — свяжитесь с нами. Мы проведём аудит и предложим оптимальное решение. Получите консультацию бесплатно.







