Свод Концепт-прототип · не действующий продукт

Сквозная аналитика продаж без хранилища

Данные из 1С, ПРОДАТЫ и Тотема сводятся автоматически в тот же слой, который читает DataLens. Дашборды перестают быть просроченными, а поверх слоя можно спросить что угодно — обычными словами.

3 человека
ML 1 · Backend 1 · PM 0,5, на третьем месяце PM 1 · Backend 0,5
3 месяца
два на слой, который наполняется сам, один на бота-аналитика
Слой
продукт — сведённые данные, а не агент над ними
DataLens
работает как работал, менять ничего не надо

Что меняется

Сегодня сведение делает человек

База под DataLens наполняется руками — поэтому аналитика всегда отстаёт и всегда стоит чьей-то недели.

Как сейчас

Неделя аналитика уходит на сборку

Выгрузки из трёх систем по очереди, сведение в сотнях экселей, сопоставление товаров и клиентов вручную — и только потом загрузка в базу под DataLens. Соответствия живут в голове одного человека. Любой новый разрез — это новая ручная сборка, то есть день или больше.

Как станет

Сборка идёт сама, человек проверяет

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

Как устроено

Три слоя, и дорогой из них один

Хранилище не строим. Считаем на стороне источников, сводим в одном процессе, пишем результат туда, откуда его уже читает DataLens.

Периметр компании
Источник
1С
Первичные продажи, отгрузки, номенклатура
Источник
ПРОДАТА
Вторичные продажи, дистрибуция по точкам
Источник
Тотем
Третий контур данных по продажам
воспроизводим те выгрузки, которые человек уже делает — считаем на источнике, забираем агрегаты
Доступ
MCP · шаблонные тулзы на чтение
Не универсальные коннекторы, а конкретные выгрузки. Свободный SQL по схеме источника не пускаем — только параметризованные вызовы.
сводим в одном процессе
Ядро · здесь вся стоимость
Аналитический слой · DuckDB
Федерация и вычисления поверх нескольких источников без хранилища. Пять-десять чистых таблиц с описанными полями.
Соответствия
SKU и клиенты между тремя системами. То, что сейчас живёт в голове аналитика.
Определения метрик
Первичка, вторичка, дистрибуция, gross и net — каждая описана один раз.
Агрегаты
Зерно SKU × канал × неделя. Полный пересчёт каждый прогон, без историзации.
два выхода из одного слоя — поэтому цифры не могут разойтись
Выход
Агент
Тонкий, поверх слоя. Схема маленькая и документированная — свободные запросы по ней работают надёжно, вопросы заранее предусматривать не нужно.
Выход
База под DataLens
Пишем в ту же базу, что и человек сегодня. Дашборды продолжают работать без изменений, просто перестают отставать.
DuckDB читает базы и файлы напрямую и джойнит их в одном процессе — ни сервера, ни схемы, которую надо вести. Именно поэтому здесь нет ETL в привычном смысле: нет пайплайнов, нет историзации, нет бэкфилла. Если пересчёт разошёлся, слой выбрасывается и собирается заново.
Прототип · три экрана

Как это выглядит в работе

Первый — что видит бизнес. Второй — то, что мы на самом деле строим. Третий — то, благодаря чему первым двум начинают верить.

Фронтенда в кейсе нет и он не нужен: дашборды остаются в DataLens и продолжают работать как работали, «Спросить» — чат в том, чем демонд-планеры уже пользуются, а «Слой» и «Сверка» — служебные страницы, их пишет бэкенд.

ЭКРАН 01

Вопрос обычными словами

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

svod.internal / вопрос
Где за июль первичка разошлась со вторичкой по Oral Health? Покажи по сетям, где разрыв больше 10%.
Ответ

Разрыв больше 10% у четырёх сетей из девятнадцати. В трёх случаях отгрузили заметно больше, чем продали конечному потребителю — то есть товар осел в канале. В «Аптеке 36,6» обратная картина: продали больше, чем отгрузили в июле, значит распродаются июньские запасы.

СетьПервичка, уп.Вторичка, уп.Разрыв
Ригла184 200142 800+29,0%
Планета Здоровья121 50098 300+23,6%
Апрель96 40084 100+14,6%
Аптека 36,672 90083 600−12,8%
Откуда числа
Первичка1С · отгрузки, июль · период закрыт 05.08
ВторичкаПРОДАТА · выгрузка от 12.08 · покрытие 94% точек
Метрикаупаковки, без возвратов · определение подписано 21.02
Сети19 из 19 сопоставлены
SKU31 из 33 сопоставлены · 2 не учтены
Требует внимания

Две новые позиции появились в 1С 14 июля и пока не сопоставлены с ПРОДАТОЙ — они исключены из расчёта. Это около 1,2% объёма категории.

ЭКРАН 02

Слой — то, что мы строим на самом деле

Агент делается быстро и почти ничего не стоит. Дорого стоит вот это: свежесть источников, соответствия между системами и зафиксированные определения метрик. Именно поэтому количество типов вопросов на срок проекта не влияет — они все ходят в одну и ту же схему.

svod.internal / слой

Состояние слоя

Последний полный пересчёт — сегодня в 06:20, занял 4 мин 10 сек
DataLens актуален
Источники
1С · отгрузки и номенклатура
4 выгрузки · период закрыт 05.08
Сегодня 06:04
1,4 млн строк
ПРОДАТА · вторичка и дистрибуция
2 выгрузки · данные до 10.08
Сегодня 06:09
3,1 млн строк
Тотем
Выгрузка не обновлялась третий день — данные в ответах помечаются как устаревшие
18.08, 06:11
820 тыс. строк
Соответствия
SKU сопоставлено1 284 из 1 302
Клиенты и сети417 из 417
Требуют решения18
Добавлено за неделю23

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

Определения метрик
Первичка
Отгрузки из 1С, упаковки, за вычетом возвратов
Вторичка
Продажи конечному потребителю, ПРОДАТА, упаковки
Численная дистрибуция
Доля точек с продажами SKU за период
Net
Gross за вычетом торговых условий и промо-инвестиций

Каждая описана один раз и подписана. Агент не считает по формуле, придуманной в моменте.

ЭКРАН 03

Сверка с ручной сборкой

То, что человек залил руками за прошлые месяцы, — готовый эталон. Гоняем слой параллельно с ним и сравниваем строка в строку. Расхождения не прячем: почти всегда они вскрывают не ошибку кода, а неписаное правило, которое человек применял по памяти. Так проект получает доверие без единого слайда про надёжность ИИ.

svod.internal / сверка

Параллельный прогон · июнь–июль

Слой против ручной сборки · 2 месяца, 9 метрик, 19 сетей
Сходится 96,4% 3 расхождения
Метрика и периодРукамиСлойΔПричина
Первичка · июнь1 842 3001 842 300 0—
Вторичка · июнь1 611 4001 618 900 +0,5% Человек брал выгрузку до 28-го, слой берёт полный месяц
Net · июнь412,8 млн398,1 млн −3,6% Ретро-бонусы разносились по факту начисления, а не по периоду продаж
Дистрибуция · июнь61,2%61,2% 0—
Первичка · июль1 903 7001 903 700 0—
Вторичка · июль1 674 2001 652 800 −1,3% Две новые позиции ещё не сопоставлены
Что делать с расхождением

По ретро-бонусам расходится не расчёт, а правило. Человек разносил их по периоду начисления, потому что так приходят документы; для анализа продаж корректнее относить к периоду продаж. Нужно решение владельца метрики — и после него определение Net фиксируется в слое, а не восстанавливается по памяти каждый месяц.

Итог сверки
Метрик проверено9
Сходится точно6
Расхождение из-за правил2
Расхождение из-за данных1
Ошибок расчёта0
Команда по месяцам

Кто что делает три месяца

Два месяца — слой, который наполняется сам, третий — бот-аналитик поверх него.

PMMLBackend
Месяц 1слой
Месяц 2слой
Месяц 3бот-аналитик
Результат
первая выгрузка забрана
DataLens актуален
бот-аналитик
PM
½Разбор рядом с аналитиком
½Определения метрик, сверка
1Вопросы планеров, проверка бота
ML
1Соответствия SKU и клиентов
1Слой DuckDB, агрегаты
1Бот над слоем
Backend
1Доступы, выгрузки
1Запись в DataLens, расписание
½Бот в мессенджере
С вашей стороны. доступы к трём источникам · аналитик, который наполняет базу, — в команде · владельцы метрик.