Настройка выгрузки остатков из 1С в 1С-Битрикс
Остатки товаров — часть стандартного обмена CommerceML. Передаются в файле offers.xml как элемент <Количество> для каждого торгового предложения. Но в большинстве проектов стандартного обмена недостаточно: нужна более частая синхронизация, разбивка по складам или частичное обновление без полной выгрузки каталога.
Как остатки попадают в Битрикс
При стандартном обмене остаток записывается в поле QUANTITY таблицы b_catalog_product. Это значение связано с торговым предложением через PRODUCT_ID = b_iblock_element.ID.
Если в 1С настроен склад, остатки могут передаваться в разбивке по складам. В Битрикс склады — это модуль catalog с таблицей b_catalog_store и b_catalog_store_product. Для отображения «наличие в магазине X» нужно использовать именно складской учёт.
Раздельная синхронизация остатков
Стандартный обмен выгружает весь каталог — при большом количестве товаров это может занимать минуты. Для частых обновлений остатков (раз в 5–15 минут) используют отдельный механизм:
Вариант 1: отдельный XML-файл. 1С формирует облегчённый XML только с остатками (без описаний и картинок) и отправляет его на отдельный эндпоинт Битрикс. На стороне Битрикс — кастомный обработчик, который читает XML и обновляет b_catalog_product.QUANTITY.
Вариант 2: REST API / HTTP-обработчик. 1С отправляет POST-запрос с JSON или POST-параметрами: sku → quantity. Обработчик на стороне Битрикс принимает, валидирует, обновляет остатки. Быстрее XML-парсинга, проще в отладке.
Вариант 3: через 1С как инициатор + агент Битрикс. 1С пишет остатки в промежуточную таблицу (или файл на сервере). Агент Битрикс раз в N минут читает промежуточные данные и обновляет каталог. Подходит, если прямой HTTP-запрос из 1С затруднён.
Обновление остатка в Битрикс
// По XML_ID товара найти PRODUCT_ID
$element = CIBlockElement::GetList(
[],
['XML_ID' => $xmlId, 'IBLOCK_ID' => OFFERS_IBLOCK_ID],
false,
['nTopCount' => 1],
['ID']
)->Fetch();
if ($element) {
CCatalogProduct::Update($element['ID'], ['QUANTITY' => $newQuantity]);
}
При большом количестве товаров (тысячи позиций) прямое обновление через цикл медленное — лучше использовать пакетный UPDATE через $DB->Query() или \Bitrix\Main\Application::getConnection()->query().
Складской учёт
Если в магазине несколько складов, включаем складской учёт: Каталог → Склады. В таблице b_catalog_store_product хранятся остатки по каждому складу для каждого товара. Обновление:
\Bitrix\Catalog\StoreProductTable::update(
['PRODUCT_ID' => $productId, 'STORE_ID' => $storeId],
['AMOUNT' => $newAmount]
);
При включённом складском учёте b_catalog_product.QUANTITY становится агрегированным (суммой по всем складам) и обновляется автоматически.
Частые ошибки
-
Остаток уходит в 0 при каждом полном обмене — 1С не передаёт остатки в
offers.xml. Нужно включить выгрузку остатков в настройках обмена 1С. -
Остатки обновляются, но на сайте товар показывается как «нет в наличии» — проверить логику компонента: возможно, учитывается не
QUANTITY, а пользовательское свойство «В наличии». -
Отрицательные остатки — 1С позволяет уходить в минус. В обработчике Битрикс ограничиваем:
max(0, $quantity).







