Розробка звітів по залишках товарів 1С-Бітрікс
Завдання «покажи що закінчується на складі» в 1С-Бітрікс вирішується по-різному залежно від структури обліку: один склад або кілька, синхронізація з 1С або автономний облік, торгові пропозиції або прості товари. Стандартні засоби 1С-Бітрікс дають лише базові фільтри в адміністративній частині. Для операційної роботи потрібні спеціалізовані звіти.
Структура зберігання залишків
Залишки в 1С-Бітрікс зберігаються в кількох таблицях залежно від режиму обліку:
-
b_catalog_product— полеQUANTITY(сумарний залишок),QUANTITY_RESERVED(зарезервовано) -
b_catalog_store_product— залишки за складами (store_id,product_id,amount,quantity_reserved)
При роботі з торговими пропозиціями (SKU): базовий товар (b_iblock_element типу товар) не має залишку — залишки задаються на рівні SKU (b_catalog_product.product_id = sku_element_id).
Ключові запити для звітів
Звіт «товари з критичним залишком»:
SELECT
ie.id,
ie.name,
prop_art.value AS article,
sect.name AS section,
cp.quantity AS stock,
cp.quantity_reserved AS reserved,
cp.quantity - cp.quantity_reserved AS available
FROM b_catalog_product cp
JOIN b_iblock_element ie ON ie.id = cp.id
LEFT JOIN b_iblock_element_property prop_art
ON prop_art.iblock_element_id = ie.id
AND prop_art.iblock_property_id = :article_prop_id
LEFT JOIN b_iblock_section sect ON sect.id = ie.iblock_section_id
WHERE ie.iblock_id = :iblock_id
AND ie.active = 'Y'
AND (cp.quantity - cp.quantity_reserved) <= :min_stock_threshold
ORDER BY (cp.quantity - cp.quantity_reserved) ASC;
Залишки за складами з деталізацією (для багатоскладського обліку):
SELECT
ie.name AS product_name,
prop_art.value AS article,
cs.title AS store_name,
cs.address AS store_address,
csp.amount AS store_amount,
csp.quantity_reserved AS store_reserved
FROM b_catalog_store_product csp
JOIN b_catalog_store cs ON cs.id = csp.store_id AND cs.active = 'Y'
JOIN b_iblock_element ie ON ie.id = csp.product_id
LEFT JOIN b_iblock_element_property prop_art
ON prop_art.iblock_element_id = ie.id
AND prop_art.iblock_property_id = :article_prop_id
WHERE ie.iblock_id = :iblock_id
AND csp.amount > 0
ORDER BY ie.name, cs.sort;
Звіт по SKU (торгових пропозиціях):
SELECT
parent.name AS product_name,
sku.name AS sku_name,
prop_color.value AS color,
prop_size.value AS size,
cp.quantity AS stock
FROM b_iblock_element sku
JOIN b_iblock_element parent ON parent.id = sku.wf_parent_id -- для старого API
-- Або через b_catalog_product_offer для D7:
JOIN b_catalog_product_offer cpo ON cpo.id = sku.id
JOIN b_iblock_element parent ON parent.id = cpo.owner_id
JOIN b_catalog_product cp ON cp.id = sku.id
LEFT JOIN b_iblock_element_property prop_color
ON prop_color.iblock_element_id = sku.id AND prop_color.iblock_property_id = :color_prop_id
LEFT JOIN b_iblock_element_property prop_size
ON prop_size.iblock_element_id = sku.id AND prop_size.iblock_property_id = :size_prop_id
WHERE sku.iblock_id = :sku_iblock_id AND sku.active = 'Y'
ORDER BY parent.name, sku.name;
Кейс: звіт для байєра в fashion e-commerce
Магазин одягу, 3 000 SKU (товар × колір × розмір), 2 склади (Москва та Санкт-Петербург), синхронізація з 1С раз на годину. Байєр щоранку перевіряв Excel із залишками — файл оновлювався вручну раз на день.
Завдання: автоматичний звіт «критичні залишки» з розсилкою на email о 8:00 ранку.
Реалізація:
- SQL-запит по таблицях
b_catalog_store_product+b_iblock_element_property(колір, розмір) - Генерація XLSX через PhpSpreadsheet з умовним форматуванням: червоний — залишок 0–1, жовтий — 2–5
- Агент 1С-Бітрікс, що запускається раз на добу о 7:45, генерує файл і зберігає в
/upload/reports/ - Відправка листа через
\Bitrix\Main\Mail\Event::send()з вкладенням байєру та директору
// Агент генерації звіту
function GenerateLowStockReport(): string
{
$generator = new StockReportGenerator();
$file = $generator->generateLowStock(threshold: 5);
$savedPath = '/upload/reports/low_stock_' . date('Y-m-d') . '.xlsx';
copy($file, $_SERVER['DOCUMENT_ROOT'] . $savedPath);
\Bitrix\Main\Mail\Event::send([
'EVENT_NAME' => 'LOW_STOCK_REPORT',
'LID' => 's1',
'C_FIELDS' => [
'REPORT_DATE' => date('d.m.Y'),
'FILE_PATH' => $savedPath,
],
]);
unlink($file);
return __FUNCTION__ . '();';
}
Звіт скоротив час підготовки даних байєром з 30 хвилин до нуля — файл чекає в пошті.
Інтеграція з інтерфейсом
Для менеджерів без доступу до /bitrix/admin/ звіт доступний через сторінку в закритому розділі з формою фільтрів (період, склад, розділ каталогу, мінімальний залишок) і кнопкою «Вивантажити Excel».
Терміни
| Конфігурація | Термін |
|---|---|
| Звіт по критичних залишках (SQL + XLSX) | 1–2 дні |
| Звіт по складах з деталізацією за SKU | 2–4 дні |
| Автогенерація + розсилка + UI-фільтри | 4–7 днів |







