Перейти к содержимому

Остатки из 1С - сопоставление складов и приём количества

Настраиваем приём складских остатков из учётной системы и разбираемся, почему после обмена везде нули.

Решение

Сверяем склады сайта и их внешние коды:

use Bitrix\Main\Loader;
Loader::includeModule('catalog');
$res = CCatalogStore::GetList([], [], false, false, ['ID', 'TITLE', 'XML_ID', 'ACTIVE']);
while ($store = $res->Fetch()) {
printf("%-5s %-24s код=%-20s активен=%s\n",
$store['ID'], $store['TITLE'], $store['XML_ID'] ?: 'ПУСТО', $store['ACTIVE']);
}

Пустой внешний код у склада означает, что остатки для него приехать не смогут: учётная система присылает количество с кодом своего склада, а сопоставить его не с чем. Названия складов при сопоставлении не используются вообще никак.

Смотрим, что приехало в файле предложений:

Окно терминала
# остатки лежат в том же файле, что и цены
grep -c '<Количество>' /home/bitrix/www/upload/1c_catalog/offers*.xml
grep -o '<Склад[^>]*>' /home/bitrix/www/upload/1c_catalog/offers*.xml | head -5
# в узле склада стоит его код: он и должен совпасть с кодом склада на сайте

Отсутствие узлов с количеством в файле означает, что разбирать нужно выгрузку, а не приём. Сайт не придумывает остатки самостоятельно: он записывает ровно то, что пришло в файле.

Проверяем остатки товара после обмена:

$res = CCatalogStoreProduct::GetList([], ['PRODUCT_ID' => $productId], false, false,
['STORE_ID', 'AMOUNT']);
while ($row = $res->Fetch()) {
printf("склад %-5s остаток %s\n", $row['STORE_ID'], $row['AMOUNT']);
// строки нет вовсе - пара «товар и склад» ни разу не приезжала
}
// отсутствие строк и строка с нулём - разные состояния

Отсутствие строки означает, что остаток по этому складу вообще никогда не приезжал. Строка с нулём означает, что учётная система прислала этот ноль осознанно: товар кончился на складе. Разница между двумя состояниями важна: в первом случае разбирают обмен, во втором - закупку.

Смотрим общее количество товара:

$product = CCatalogProduct::GetByID($productId);
printf("количество=%s учёт по складам=%s\n",
$product['QUANTITY'], COption::GetOptionString('catalog', 'default_use_store_control'));

При включённом складском учёте общее количество складывается из остатков по складам и правке не поддаётся. При выключенном - приходит одним числом, и склады в обмене не участвуют вовсе.

Нулевые остатки при непустой выгрузке почти всегда упираются именно в коды складов. Это первое, что стоит проверять, и только потом смотреть настройки товара и права пользователя обмена.

Резерв под текущие заказы живёт на стороне сайта и в обмен не уезжает. Учётная система присылает физический остаток склада, а доступное к продаже количество сайт считает сам, вычитая из него зарезервированное.

Частота обмена остатками обычно отличается от частоты обмена самим каталогом. Остатки меняются постоянно, а структура каталога - редко, поэтому их обычно выгружают отдельным частым обменом только по файлу предложений.

Типичные проблемы

После обмена везде нулевые остатки.

Склады сайта не сопоставлены с чужими по внешнему коду. Количество приезжает с кодом незнакомого склада, и записать его попросту некуда.

Остатки не меняются вообще.

Файл предложений не выгружается либо обмен идёт только по каталогу. Остатки едут именно в файле предложений, а не в каталоге.

Общее количество не совпадает с суммой по складам.

Включён складской учёт, а общее количество правили руками. Оно пересчитывается из остатков по складам и ручную правку теряет.

Часть складов не получила остатков.

У этих складов пустой внешний код либо они помечены неактивными. Неактивный склад в обмене не участвует вовсе.

Остатки отстают от учётной системы на день.

Обмен остатками идёт вместе с полным каталогом раз в сутки. Остатки правильнее выгружать отдельным частым обменом.

Частые вопросы

Можно ли выгружать только остатки, без цен?

Они едут одним файлом предложений, и разделить их штатно нельзя. Отдельным обменом выгружают этот файл целиком - вместе с ценами.

Как часто обменивать остатки?

На магазине с быстрым оборотом - каждые несколько минут, на спокойном - раз в час. Ориентируются на то, как быстро товар кончается.

Что делать с товарами, которых нет ни на одном складе?

Их либо скрывают с витрины, либо показывают под заказ. Решение зависит от бизнеса, а не от техники: платформа умеет и то, и другое.

Почему количество на витрине больше реального?

На витрине показывается остаток без учёта резерва под текущие заказы. Доступное количество меньше складского на величину резерва.

Смежное

Первоисточник