Настройка отчётности по маркировке на 1С-Битрикс
Обязательная маркировка создаёт не только операционную нагрузку (гасить коды, оформлять возвраты), но и потребность в отчётности: сколько кодов выведено из оборота за период, какой статус по каждому документу в ЧЗ, есть ли расхождения между данными Битрикс и Честным Знаком. Стандартный инструментарий Битрикс не включает отчётов по маркировке — их нужно разрабатывать отдельно на базе данных, которые накапливаются в процессе интеграции с ЧЗ/ЕГАИС.
Источники данных для отчётов
Все данные по маркировке хранятся в кастомных таблицах, созданных в ходе интеграции:
-
local_marking_codes— коды маркировки, их статусы, привязка к заказам -
local_cz_documents— документы, отправленные в Честный Знак (вывод из оборота, возвраты) -
local_egais_documents— документы ЕГАИС (для алкоголя)
Отчёты строятся SQL-запросами к этим таблицам с присоединением к стандартным таблицам Битрикс (b_sale_order, b_catalog_iblock_element).
Реализация административных отчётов
В Битрикс административные отчёты добавляются через модуль main.ui.grid или кастомные страницы в /local/php_interface/admin/. Второй вариант даёт полный контроль над фильтрацией и выводом.
// /local/php_interface/admin/marking_report.php
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_before.php';
$APPLICATION->SetTitle('Отчёт по маркировке');
$filter = [];
$dateFrom = $_REQUEST['date_from'] ?? date('Y-m-01');
$dateTo = $_REQUEST['date_to'] ?? date('Y-m-d');
if ($dateFrom && $dateTo) {
$filter['>=WITHDRAWAL_DATE'] = $dateFrom . ' 00:00:00';
$filter['<=WITHDRAWAL_DATE'] = $dateTo . ' 23:59:59';
}
// Агрегация по статусам
$stats = \Bitrix\Main\Application::getInstance()
->getConnection()
->query("
SELECT
mc.STATUS,
COUNT(*) as cnt,
COUNT(DISTINCT mc.ORDER_ID) as orders_cnt,
COUNT(DISTINCT mc.PRODUCT_ID) as products_cnt
FROM local_marking_codes mc
WHERE mc.WITHDRAWAL_DATE BETWEEN ? AND ?
GROUP BY mc.STATUS
", [$dateFrom . ' 00:00:00', $dateTo . ' 23:59:59'])
->fetchAll();
require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_admin_after.php';
Ключевые показатели отчётности
Операционный отчёт (ежедневный):
- Количество кодов, выведенных из оборота за день
- Количество возвратов в оборот
- Ошибки вывода (коды с ошибкой по ответу ЧЗ)
- Документы в статусе ожидания (не обработаны ЧЗ более 30 минут)
Аналитический отчёт (еженедельный/месячный):
- Динамика выбытия по категориям товаров
- Доля возвратов в разрезе SKU
- Время обработки документов ЧЗ (от отправки до подтверждения)
Сверочный отчёт:
-- Расхождение между остатками Битрикс и зарезервированными/выведенными кодами
SELECT
ce.ID as PRODUCT_ID,
ce.NAME as PRODUCT_NAME,
cp.QUANTITY as STOCK_QUANTITY,
COUNT(CASE WHEN mc.STATUS = 'in_stock' THEN 1 END) as CODES_AVAILABLE,
cp.QUANTITY - COUNT(CASE WHEN mc.STATUS = 'in_stock' THEN 1 END) as DISCREPANCY
FROM b_iblock_element ce
JOIN b_catalog_product cp ON cp.ID = ce.ID
LEFT JOIN local_marking_codes mc ON mc.PRODUCT_ID = ce.ID
WHERE ce.IBLOCK_ID = 5 -- каталог маркируемых товаров
GROUP BY ce.ID, ce.NAME, cp.QUANTITY
HAVING DISCREPANCY != 0
ORDER BY ABS(DISCREPANCY) DESC
Расхождения сигнализируют о потерянных кодах или ошибках в цепочке интеграции.
Экспорт в Excel
Для выгрузки данных аудиторам или регулятору — экспорт через PHPSpreadsheet:
public function exportToXlsx(array $data, string $filename): void
{
$spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$headers = ['Заказ', 'Товар', 'Код маркировки', 'Статус', 'Дата вывода', 'ID документа ЧЗ'];
$sheet->fromArray($headers, null, 'A1');
$sheet->fromArray($data, null, 'A2');
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
$writer->save($filename);
}
Уведомления и алёрты
Критичные ситуации, требующие немедленной реакции:
- Код в статусе
pendingболее 1 часа — ЧЗ не подтвердил вывод - Ошибка вывода кода (
ERRORстатус от ЧЗ) — код, возможно, уже выведен через другой канал - Расхождение остатков более 5% — инициировать инвентаризацию
Уведомления через CEventLog::Add() + email через CEvent::Send() для ответственного сотрудника.
Состав работ
- Разработка административных страниц с фильтрами и таблицами
- Агрегационные SQL-запросы: операционные и сверочные отчёты
- Экспорт в Excel
- Настройка алёртов на критические ситуации
- Документирование для пользователей
Сроки: 2–3 недели при наличии рабочей интеграции с ЧЗ/ЕГАИС.







