Skip to main content

Данные об остатках/складах из 1С — количество товара на сайте

18 мая, 2020 19:52
Просмотров 1128
Section background

Как правило, одной из основных задач, которые требуется решить в рамках задачи обмена с 1С, является соответствие наличия на сайте с данными в системе учета. Безусловно, это требуется не всегда, поэтому плагин имеет настройки, для управление этим поведением, то есть скрывать или оставлять доступными для покупки товары без остатка.

Данные об остатке товара, поступают в выгрузке информации о торговых предложениях и могут содержать остатки, как с разбиением по складам (в таком случае поступает еще и информация по складам), так и без, то есть только информацию о суммарном остатке. В независимости от того, с разделением по складам или нет, в остаток товара на сайте будет записано суммарное значение, так как в WooCommerce нет разделения по складам.

Пример данных по остаткам из выгрузки (без разбиения)

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

Если данные поступают с разделением по складам, то кроме самих остатков, поступает еще и общая информация о складах (плагин сохраняет данные по складам в опцию — all_1c_stocks, чтобы вы имели возможность организовать вывод на сайте).

Кроме общего остатка для товара, информация о разделении сохраняется в метаданные товара по ключу — _separate_warehouse_stock. Таким образом, используя основную информацию о складах и информацию из товара вы можете организовать отображение этой информацию пользователю.

Пример данных с общей информацией о складах из выгрузки

Данные об остатках с разбиением, могут быть в нескольких вариантах схем, то есть структура xml отличается.

Пример данных об остатках с разбиением из выгрузки

Еще пример данных об остатках с разбиением из выгрузки

Также есть еще вариант с узлом «Предложение ->КоличествоНаСкладах»,  похожей на скриншот выше, но с другим именованием.
 

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


Возможная проблема: по остатку в 1С товар кончился, а на сайте он все еще в наличии

Такое поведение, как правило, может являться следствием нескольких вариантов.

Вариант 1: В настройках узла обмена настроено правило для того, чтобы выгружать только при положительном остатке. Таким образом, как только по остатку становится 0, то информация о позиции номенклатуры, как и предложение для нее, в выгрузку больше не попадает.

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

Итог: 0 будет установлен (то есть товар может быть скрыт и помечен, как нет в наличии), если в выгрузке поступит 0 (то есть будет предложение для товара с информацией о нулевом остатке). В данном же случае, никакой информации не поступает, таким образом сайт не узнает, что остаток поменялся.

Представьте абстрактную ситуацию: есть склад и есть полка в магазине с числом, при изменении количества на складе, сотрудник подходит к полке и ставит нужное число, предположим остаток на складе изменился на 2, сотрудник склада пришел и поставил 2, через некоторое время, по каким-то причинам, остаток на складе стал 0, но сотрудник решил не ходить к полке и в итоге на ее счетчике значение не было установлено в 0.

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


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

Предположим, в выгрузке есть 3 склада — «Склад 1», «Склад 2» и «Склад 3», также есть простой товар и перед нами стоит задача отобразить данные по остаткам этого товара на складах во вкладке на его странице.

// (1) добавим нашу вкладку в набор вкладок товара
\add_filter('woocommerce_product_tabs', function ($tabs) {
$tabs['woocommerce1cStockTab'] = [
'title' => __('Вкладка с остатками', 'child-theme'),
'priority' => 50,
'callback' => 'woocommerce1cStockTab'
];

return $tabs;
});

// (2) метод, который формирует содержимое нашей вкладки
function woocommerce1cStockTab() {
// получим набор складов
$stocks = \get_option('all_1c_stocks', []);

// получим данные по остаткам в товаре
$productStockData = \get_post_meta(\get_the_ID(), '_separate_warehouse_stock', true);

echo '<ul>';

// пробежим по набору складов и отобразим каждый в виде названия
// и значения остатка в этом товаре
foreach ($stocks as $guid => $warehouse) {
echo '<li>'
. '<strong>'
. esc_html($warehouse['Наименование'])
. '</strong>: '
. (isset($productStockData[$guid]) ? $productStockData[$guid] : 0)
. ' шт.</li>';
}

echo '</ul>';
}

Таким образом, мы получим результат в виде вкладки на странице товара и данных по складам и остаткам этого товара в содержимом вкладки, то есть похожее на скриншот ниже (конечно вид зависит от вашей темы, а также это вообще может не сработать, если в теме не работает стандартный фильтр `woocommerce_product_tabs` для набора вкладок).


Пример отображения информации с остатками по складам для вариативного товара

Предположим, в выгрузке есть 3 склада — «Склад 1», «Склад 2» и «Склад 3», также есть вариативный товар и перед нами стоит задача отобразить данные по остаткам вариации на складах при выборе характеристик.

//(1) Нам необходимо подготовить html, который будет отображаться.
\add_filter('woocommerce_available_variation', function ($variation) {
// получим набор складов
$stocks = \get_option('all_1c_stocks', []);

// получим данные по остаткам в вариации
$variationStockData = \get_post_meta($variation['variation_id'], '_separate_warehouse_stock', true);

$variation['variation_stock_info'] = '<hr><h4>Наличие в магазинах</h4>';

// пробежим по набору складов и отобразим каждый в виде названия
// и значения остатка в этой вариации
foreach ($stocks as $guid => $warehouse) {
$variation['variation_stock_info'] .= '<div>'
. '<strong>'
. esc_html($warehouse['Наименование'])
. '</strong>: '
. (isset($variationStockData[$guid]) ? $variationStockData[$guid] : 0)
. ' шт.</div>';
}

return $variation;
});

/* (2) Необходимо добавить отображение этой информации в шаблон вариации.
*
* Шаблон - single-product/add-to-cart/variation.php
*
* Если в вашей теме его нет, то его нужно переопределить - https://docs.woocommerce.com/document/template-structure/
*
* Сделаем в шаблоне вывод нашего html с информацией по складам, добавив следующее:
*
* <div class="woocommerce-variation-stock-info">{{{ data.variation.variation_stock_info }}}</div>
*/

Таким образом, мы получим результат в виде меняющейся информации по складам и остаткам при выборе характеристик, то есть похожее на скриншот ниже (конечно вид зависит от вашей темы, а также это вообще может не сработать, если в теме не работает стандартный фильтр `woocommerce_available_variation` для данных вариации).


Поделиться: