Налаштування обліку ПДВ у 1C-Bitrix
Інтернет-магазин показує ціну з ПДВ, рахунок формується без ПДВ, а 1C отримує третю суму — все це свідчить про те, що ПДВ налаштовано в трьох різних місцях без єдиного джерела істини.
Де зберігаються ставки ПДВ
Ставки ПДВ у Bitrix — записи в 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: ПДВ = ЦІНА * СТАВКА / (100 + СТАВКА)
// VAT_INCLUDED = N: ПДВ = ЦІНА * СТАВКА / 100
Bitrix зберігає фінальну суму ПДВ на позицію у b_sale_basket — поле VAT_RATE (ставка) та VAT_SUM (сума). При створенні замовлення ці значення копіюються в b_sale_order_basket.
Податкові виключення та 0%
Для товарів, звільнених від ПДВ, створюється окрема ставка з RATE = 0 у b_catalog_vat. Це важливо: не залишати VAT_ID = NULL, явно вказувати нульову ставку. При NULL різні версії Bitrix ведуть себе по-різному — одні застосовують дефолтну ставку магазину, інші пропускають ПДВ повністю.
Дефолтна ставка магазину задається в b_option, модуль sale, параметр default_vat_rate. Саме вона використовується як fallback.
Рахунок та друковані форми
Стандартна друкована форма рахунку у Bitrix (/bitrix/modules/sale/lang/uk/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();
}
Передача ПДВ у 1C
При виванченні замовлень до 1C через CommerceML (sale.crm.order) ПДВ передається в елементі <ЦенаЗаЕдиницу> з атрибутом ЦенаВключаетНДС та окремим елементом <Налог>. Якщо у 1C суми розходяться з сайтом, перше що перевіряється — відповідність VAT_INCLUDED на стороні Bitrix та налаштувань номенклатури в 1C. Другий джерело розбіжностей — округлення: Bitrix округлює до 2 знаків на позицію, 1C може розраховувати в цілому по всьому замовленню, давши різницю у копійки.







