НДС 22% в Битрикс24: Настройка касс и скрипт обновления товаров

В связи с изменением законодательства (ФЗ от 28.11.2025 № 425-ФЗ), с 1 января 2026 года ставка НДС повышается до 22%. В существующих порталах Битрикс24 это изменение не происходит автоматически — ставку нужно обновить вручную, чтобы чеки и налоги считались корректно.
Важно: Если не обновить настройки, система продолжит считать налог по 20% и передавать неверные данные в ОФД.
Процесс состоит из трех шагов.

Обновление ставки

Шаг 1. Обновление ставки в настройках Битрикс24

Вам нужно изменить значение текущей ставки, а не создавать новую. Это делается в одном из двух разделов (они дублируют друг друга):
  1. Путь: CRM → Настройки → Настройки CRM → Налоги → Ставки НДС. (Либо через раздел: Сайты и магазины → Настройки → Экспертные настройки → Налоги).
  2. Найдите в списке ставку 20%.
  3. Нажмите на меню (≡) слева от неё → Редактировать.
  4. Измените значение на 22%.
  5. Сохраните.
Теперь все товары, к которым была привязана старая ставка, автоматически начнут считаться по 22%.

Шаг 2. Настройка Онлайн-касс

Необходимо сообщить кассе, какой код передавать в налоговую для новой ставки.
  1. Путь: CRM → Продажи → Центр продаж → Кассы.
  2. Откройте настройки вашей кассы.
  3. Перейдите в блок НалогообложениеНастройки ставок НДС.
  4. Для ставки 22% укажите код:
  • Для большинства касс (Атол, Эвотор и др.): vat22
  • Для Orange Data: 1 (универсальный код)
Сохраните настройки.

Шаг 3. Настройка Платежных систем (Робочеки / ЮKassa)

Если вы используете встроенную чекизацию от платежных систем, обновите коды там.
  1. Путь: CRM → Продажи → Центр продаж → Платежные системы.
  2. Откройте настройки системы (ЮKassa или Robokassa) и найдите раздел Настройки ставок НДС.
  3. Установите правильный код соответствия:
  • ЮKassa: замените код 4 на 11.
  • Robokassa: впишите код vat22.
Сохраните.

Автоматизация: Как обновить тысячи товаров за 5 минут

Изменение ставки в общих настройках (описанное выше) — это необходимая база. Однако, если у вас в каталоге тысячи позиций, простого изменения настроек может быть недостаточно. Часто требуется «протрясти» базу товаров, чтобы:
  1. Явно прописать новый ID ставки (если вы создали новую, а не редактировали старую).
  2. Убедиться, что флаг «НДС включен в цену» проставлен корректно у всех товаров.
  3. Обновить кэш цен в каталоге.
Делать это вручную — долго. Штатный экспорт/импорт через Excel может вызвать дубли или сбой картинок. Мы подготовили PHP-скрипт, который через REST API аккуратно обновляет товары и их вариации (SKU).
<?php
/**
 * Bitrix24 VAT Updater Tool
 * Скрипт для массового обновления ставки НДС товаров и торговых предложений (SKU).
 * Автоматически определяет ID инфоблоков каталога.
 */

// --- КОНФИГУРАЦИЯ ---
const WEBHOOK_URL  = 'https://ваш-портал.bitrix24.ru/rest/1/ключ/'; // Укажите ваш вебхук
const TARGET_VAT   = 5;   // ID ставки НДС (см. настройки CRM -> Налоги)
const BATCH_SIZE   = 50;  // Количество товаров за один шаг (рекомендуется 50)
const SLEEP_TIME   = 10000; // Пауза между запросами в мкс (анти-DDOS)

// --- СИСТЕМНЫЕ НАСТРОЙКИ ---
ini_set('display_errors', 0);
error_reporting(E_ALL);
ini_set('max_execution_time', 300);

// --- ОБРАБОТКА AJAX ЗАПРОСА ---
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    while (ob_get_level()) ob_end_clean();
    header('Content-Type: application/json');

    try {
        $input = json_decode(file_get_contents('php://input'), true);
        $lastId = intval($input['lastId'] ?? 0);
        $offersIblockId = intval($input['offersIblockId'] ?? 0);
        $mainIblockId = intval($input['mainIblockId'] ?? 0);
        $logs = [];

        // 1. Автоматический поиск ID инфоблоков, если они не переданы
        if ($mainIblockId === 0) {
            $ids = getCatalogIds();
            $mainIblockId = $ids['main'];
            $offersIblockId = $ids['offers'];

            if ($mainIblockId > 0) {
                $logs[] = ['type' => 'info', 'msg' => "ℹ️ Основной каталог: ID <b>{$mainIblockId}</b>"];
            } else {
                throw new Exception("Не удалось определить ID каталога товаров.");
            }

            if ($offersIblockId > 0) {
                $logs[] = ['type' => 'info', 'msg' => "ℹ️ Каталог SKU: ID <b>{$offersIblockId}</b>"];
            }
        }

        // 2. Получение списка товаров (пагинация по ID)
        $filter = [
            '>id' => $lastId,
            'iblockId' => $mainIblockId
        ];

        $params = [
            'filter' => $filter,
            'select' => ['id', 'iblockId', 'name', 'parentId'],
            'order'  => ['id' => 'ASC'],
            'start'  => 0,
            'limit'  => BATCH_SIZE
        ];

        $response = callB24('catalog.product.list', $params);

        if (isset($response['error'])) {
            throw new Exception("API Error: " . ($response['error_description'] ?? $response['error']));
        }

        $products = $response['result']['products'] ?? $response['result'] ?? [];

        // Если товары закончились
        if (empty($products)) {
            echo json_encode(['finished' => true, 'logs' => $logs]);
            exit;
        }

        $currentLastId = $lastId;

        foreach ($products as $product) {
            $id = $product['id'] ?? $product['ID'];
            if (!$id) continue;

            $currentLastId = $id;

            // Пропускаем SKU, если они случайно попали в выборку (обрабатываем только родителей)
            if (!empty($product['parentId'] ?? $product['PARENT_ID'])) {
                continue;
            }

            $name = $product['name'] ?? $product['NAME'] ?? "Без названия ($id)";
            $logs[] = ['type' => 'head', 'msg' => "📦 <b>#{$id}</b> " . htmlspecialchars($name)];

            // Обновляем Родителя
            $resParent = updateProduct($id, TARGET_VAT);
            $logs[] = ['type' => 'row', 'msg' => "Родитель: " . $resParent];

            // Обновляем SKU (если есть)
            $skuHtml = processSku($id, TARGET_VAT, $offersIblockId);
            if ($skuHtml) {
                $logs[] = ['type' => 'row', 'msg' => $skuHtml];
            } else {
                $logs[] = ['type' => 'info', 'msg' => "↳ Вариаций нет."];
            }
        }

        echo json_encode([
            'finished' => false,
            'nextId' => $currentLastId,
            'offersIblockId' => $offersIblockId,
            'mainIblockId' => $mainIblockId,
            'logs' => $logs
        ]);

    } catch (Exception $e) {
        echo json_encode(['finished' => true, 'logs' => [['type' => 'error', 'msg' => "Error: " . $e->getMessage()]]]);
    }
    exit;
}

// --- ФУНКЦИИ ---

function getCatalogIds() {
    $res = callB24('catalog.catalog.list', []);
    $catalogs = $res['result']['catalogs'] ?? $res['result'] ?? [];
    
    $mainId = 0;
    $offersId = 0;

    // Ищем связку каталогов
    foreach ($catalogs as $cat) {
        if (isset($cat['productIblockId']) && $cat['productIblockId'] > 0) {
            $offersId = $cat['iblockId'] ?? $cat['id'];
            $mainId = $cat['productIblockId']; 
            break;
        }
    }

    // Если SKU каталог не найден, берем первый попавшийся простой каталог
    if ($mainId === 0 && !empty($catalogs)) {
        foreach ($catalogs as $cat) {
             if (!isset($cat['productIblockId']) || $cat['productIblockId'] == 0) {
                 $mainId = $cat['iblockId'] ?? $cat['id'];
                 break;
             }
        }
    }
................................Получить полную версию скрипта по ссылке ниже
Результат работы скрипта по обновлению цен в Битрикс24 в товарах и вариациях

Возможности скрипта

Безопасный пошаговый режим: Скрипт обрабатывает товары пачками (по 2–5 штук за шаг) и автоматически перезагружает страницу. Это исключает ошибку «Time Limit» (превышение времени выполнения) на сервере.
Глубокая обработка: Обновляет не только простые товары, но и заходит внутрь каждого родительского товара, чтобы обновить все его торговые предложения (цвета, размеры и т.д.).
Обход лимитов API: Встроены паузы (usleep), чтобы Битрикс не заблокировал запросы за превышение частоты обращений.

Инструкция по запуску

Для работы скрипта вам понадобится локальный веб-сервер (OpenServer, XAMPP) или любой хостинг с поддержкой PHP.
Получите вебхук В вашем Битрикс24 перейдите: Разработчикам → Другое → Входящий вебхук. В правах доступа выберите: CRM (crm). Скопируйте полученный URL (он выглядит как https://portal.bitrix24.ru/rest/1/key/).
Настройте скрипт Создайте файл update_vat.php и вставьте в него код. В начале файла измените настройки:
$webhookUrl = 'https://ваш-портал.bitrix24.ru/rest/1/xxxx/'; // Ваш вебхук
$targetVatId = 5; // ID нужной ставки (см. ниже, как узнать)

Как узнать ID ставки ($targetVatId)?

Самый простой способ: зайдите в редактирование любого товара, откройте инструменты разработчика в браузере (F12), нажмите на поле выбора НДС и посмотрите value у нужного процента. Либо создайте тестовый товар с нужным НДС и посмотрите его данные через API.

Запуск

Откройте файл в браузере: http://localhost/update_vat.php. Вы увидите лог работы. Не закрывайте вкладку, пока не появится сообщение: «ОБРАБОТКА ЗАВЕРШЕНА».
⚠️ Важно: Перед запуском массовых операций всегда делайте резервную копию базы товаров (экспорт в CSV), чтобы иметь возможность отката изменений.

Нужна помощь с обновлением НДС?

Оставьте заявку на доработки Битрикс
Made on
Tilda