Мы разрабатываем кастомные отчёты по маркировке на 1С-Битрикс, которые закрывают пробелы стандартного инструментария. В типовом проекте у клиента из 5000 SKU ежемесячно выводится из оборота до 20000 кодов — ошибка в 1% оборачивается потерями до $540–780 на штрафах и сверках. Без внятной отчётности контролировать этот поток невозможно: расхождения с Честным Знаком и риск санкций. Мы решаем задачу через кастомные административные панели на базе данных интеграции. За плечами более 50 интеграций с ЧЗ и ЕГАИС, опыт работы с Битрикс — свыше десяти лет. Экономия от внедрения нашей отчётности достигает $2.7k–3.9k в год за счёт снижения ручного труда и штрафов.
Какие данные нужны для отчётности по маркировке?
Все данные по маркировке хранятся в кастомных таблицах, созданных в процессе интеграции:
-
local_marking_codes— коды маркировки, их статусы, привязка к заказам -
local_cz_documents— документы, отправленные в Честный Знак (вывод из оборота, возвраты) -
local_egais_documents— документы ЕГАИС (для алкоголя)
Отчёты строятся SQL-запросами к этим таблицам с присоединением к стандартным таблицам Битрикс (b_sale_order, b_catalog_product). Если в вашей системе ещё нет интеграции с ЧЗ, сначала потребуется её реализовать — это отдельный этап, занимающий 2–4 недели.
Как мы настраиваем отчётность: пошагово
- Анализ данных и проектирование таблиц. Проверяем состав интеграции, определяем необходимые поля и индексы. Часто добавляем недостающие связи для ускорения запросов.
- Разработка SQL-запросов. Создаём агрегации для операционных, аналитических и сверочных отчётов. Используем прямые SQL-запросы — их производительность в 1.3 раза выше, чем через ORM, что критично при объёме свыше 100 000 записей.
- Создание админ-панели. Генерируем страницы с фильтрами, таблицами и экспортом в XLSX. Добавляем алёрты на критические ситуации (зависшие коды, ошибки ЧЗ).
Как строятся операционные отчёты?
Операционный отчёт показывает количество выведенных кодов за день, возвраты, ошибки. В основе — агрегирующий SQL-запрос:
SELECT mc.STATUS, COUNT(*) as cnt, COUNT(DISTINCT mc.ORDER_ID) as orders_cnt
FROM local_marking_codes mc
WHERE mc.WITHDRAWAL_DATE BETWEEN ? AND ?
GROUP BY mc.STATUSДля визуализации используем стандартные админ-страницы Битрикс с фильтрами по дате, статусу и товару.
Как мы реализуем административные отчёты?
В Битрикс административные отчёты добавляются через модуль 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';
| Подход | Производительность | Гибкость | Время разработки |
|---|---|---|---|
| Прямой SQL | Высокая | Максимальная | 1–2 дня |
| ORM Битрикс | Средняя | Ограниченная | 2–3 дня |
Прямой SQL в 1.3 раза быстрее ORM Битрикс для агрегаций на больших объёмах.
Почему сверочный отчёт критически важен?
| Тип отчёта | Содержание | Периодичность |
|---|---|---|
| Операционный | Количество выведенных кодов, возвраты, ошибки | Ежедневно |
| Аналитический | Динамика выбытия по категориям, доля возвратов, время обработки ЧЗ | Еженедельно / ежемесячно |
| Сверочный | Расхождения между остатками Битрикс и кодами | По запросу |
Сверочный отчёт — самый важный. Выявляет товары, где количество кодов не совпадает с остатками:
-- Расхождение между остатками Битрикс и зарезервированными/выведенными кодами
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
Расхождения сигнализируют о потерянных кодах или ошибках в цепочке интеграции. При отклонении более 5% инициируем инвентаризацию.
Экспорт в 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% — срочная инвентаризация
Уведомления через CEvent на email ответственного сотрудника. Алёрты настраиваются под ваш бизнес-процесс с индивидуальными порогами срабатывания.
Что входит в работу и сроки?
- Разработка административных страниц с фильтрами и таблицами
- Агрегационные SQL-запросы: операционные, аналитические, сверочные отчёты
- Экспорт в Excel
- Настройка алёртов на критические ситуации
- Документирование для пользователей и передача доступов
Сроки: от 2 недель при наличии рабочей интеграции с ЧЗ/ЕГАИС. Всё делаем под ключ — вы получаете готовую панель отчётности.
Типичные ошибки при настройке
- Не учтены задержки подтверждения ЧЗ — код может висеть в
pendingдо суток. Устанавливайте адекватный порог тревоги. - Смешение данных при использовании
ON DELETE CASCADE— аккуратно с внешними ключами. - Отсутствие индексов на полях
WITHDRAWAL_DATEиSTATUS— запросы на больших объёмах тормозят. - Игнорирование дублей кодов — при повторном выводе возможны расхождения.
Свяжитесь с нами для оценки вашего проекта — мы предложим оптимальное решение. Закажите разработку отчётности и возьмите маркировку под полный контроль.







