Настройка учета НДС на 1С-Битрикс
Интернет-магазин показывает цену с НДС, счёт формируется без НДС, а 1С получает третью сумму — всё это признак того, что НДС настроен в трёх разных местах без единой точки правды.
Где хранятся ставки НДС
Ставки НДС в Битриксе — записи в b_catalog_vat. Каждая запись: ID, NAME (например, "НДС 20%"), RATE (число, 20), ACTIVE. Привязка ставки к товару — поле VAT_ID в b_iblock_element_property или напрямую в b_catalog_product через поле VAT_ID.
Включение НДС в цену управляется полем VAT_INCLUDED в b_catalog_product: Y — цена включает НДС, N — НДС сверху. Это поле часто игнорируют при настройке, и тогда система считает НДС дважды или не считает вообще.
Получение ставки для товара:
$product = \Bitrix\Catalog\ProductTable::getById($productId)->fetch();
$vat = \Bitrix\Catalog\VatTable::getById($product['VAT_ID'])->fetch();
// $vat['RATE'] — числовое значение ставки
// $product['VAT_INCLUDED'] — включён ли НДС в цену
Отображение НДС в корзине и заказе
Компонент bitrix:sale.basket.basket отображает НДС если в его параметрах включён SHOW_VAT. Но даже при включённом параметре сумма НДС может считаться неверно — это происходит когда часть товаров имеет VAT_INCLUDED = Y, а часть N.
Правильный расчёт суммы НДС для позиции корзины:
// VAT_INCLUDED = Y: НДС = PRICE * RATE / (100 + RATE)
// VAT_INCLUDED = N: НДС = PRICE * RATE / 100
Битрикс хранит финальную сумму НДС по позиции в b_sale_basket — поле VAT_RATE (ставка) и VAT_SUM (сумма). При создании заказа эти значения копируются в b_sale_order_basket.
Налоговые исключения и 0%
Для товаров, освобождённых от НДС, создаётся отдельная ставка с RATE = 0 в b_catalog_vat. Это важно: не оставлять VAT_ID = NULL, а явно указывать нулевую ставку. При NULL разные версии Битрикса ведут себя по-разному — одни применяют дефолтную ставку магазина, другие пропускают НДС совсем.
Дефолтная ставка магазина задаётся в b_option, модуль sale, параметр default_vat_rate. Именно она используется как fallback.
Счёт и печатные формы
Стандартная печатная форма счёта в Битриксе (/bitrix/modules/sale/lang/ru/documents/) берёт данные из b_sale_order и связанных таблиц. НДС в счёте отображается корректно только если в заказе заполнены VAT_RATE и VAT_SUM по каждой позиции.
Для кастомных печатных форм (PDF через mpdf или tcpdf) нужно явно вычислять суммы:
$basket = \Bitrix\Sale\Basket::loadItemsForOrder($order);
$totalVat = 0;
foreach ($basket as $item) {
$totalVat += $item->getField('VAT_SUM') * $item->getQuantity();
}
Передача НДС в 1С
При выгрузке заказов в 1С через CommerceML (sale.crm.order) НДС передаётся в элементе <ЦенаЗаЕдиницу> с атрибутом ЦенаВключаетНДС и отдельным элементом <Налог>. Если в 1С суммы расходятся с сайтом, первое что проверяется — соответствие VAT_INCLUDED на стороне Битрикса и настроек номенклатуры в 1С. Второй источник расхождений — округление: Битрикс округляет до 2 знаков на позицию, 1С может считать суммарно по всему заказу, давая разницу в копейки.







