Настройка виконання остатків з 1С в 1С-Bitrix
Остатки товарів — частина стандартного обміну CommerceML. Передаються у файлі offers.xml як елемент <Количество> для кожного торгового пропозиції. Але в більшості проектів стандартного обміну недостатньо: потрібна частіша синхронізація, розбивка по складах або часткове оновлення без повної виконки каталога.
Як остатки потрапляють в Bitrix
При стандартному обміні остаток записується в поле QUANTITY таблиці b_catalog_product. Це значення пов'язане з торговим пропозицією через PRODUCT_ID = b_iblock_element.ID.
Якщо в 1С настроєний склад, остатки можуть передаватися в розбивці по складах. У Bitrix склади — це модуль catalog з таблицею b_catalog_store та b_catalog_store_product. Для відображення «наявність у магазині X» потрібно використовувати саме складській облік.
Окрема синхронізація остатків
Стандартний обмін виконує весь каталог — при великій кількості товарів це може займати хвилини. Для частих оновлень остатків (раз у 5–15 хвилин) використовують окремий механізм:
Варіант 1: окремий XML-файл. 1С формує облегшений XML тільки з остатками (без описів та картинок) та відправляє на окремий endpoint Bitrix. На стороні Bitrix — користувацький обробник, який читає XML і оновлює b_catalog_product.QUANTITY.
Варіант 2: REST API / HTTP-обробник. 1С надсилає POST-запит з JSON або POST-параметрами: sku → quantity. Обробник на стороні Bitrix приймає, валідує, оновлює остатки. Швидше XML-парсингу, простіше в відладці.
Варіант 3: через 1С як ініціатор + агент Bitrix. 1С пише остатки в проміжну таблицю (або файл на сервері). Агент Bitrix раз у N хвилин читає проміжні дані і оновлює каталог. Підходить, якщо прямий HTTP-запит з 1С затруднений.
Оновлення остатку в Bitrix
// За 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С дозволяє уходити в мінус. В обробнику Bitrix обмежуємо:
max(0, $quantity).







