Система управленческой отчётности с собственным движком сводных таблиц

Система управленческой отчётности с собственным движком сводных таблиц

Приём разнородных выгрузок с проверкой на входе, разбор иерархических таблиц без двойного счёта, сводные таблицы с несколькими мерами и детализацией вглубь, каталог отчётов по отделам, передача среза ссылкой.

Было: отчёт собирали три дня и он устаревал. Стало: тринадцать типов отчётов к утру, срез передаётся ссылкой.

Разработка · Отчётность 13 типов отчётов · в промышленной эксплуатации
Конструктор сводной: поля, меры, строки и график настраиваются без правки кода
Конструктор сводной: поля, меры, строки и график настраиваются без правки кода

Задача

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

Что сделано

  • Приём разнородных выгрузок с проверкой на входе и журналом ошибок
  • Разбор иерархии тремя способами: по уровням группировки, по образцу строки, по объединённым ячейкам
  • Отсев строк-сводок, чтобы итог не складывался дважды с детальными строками
  • Повторная проверка уже загруженных файлов теми же правилами, что и при загрузке
  • Собственный движок сводных таблиц: несколько мер с независимыми агрегатами, детализация вглубь, две оси значений, сохранённые наборы настроек
  • Передача конфигурации отчёта ссылкой — коллега открывает ровно тот срез, который вы видите
  • Каталог отчётов по отделам с перетаскиванием, роли и разграничение доступа

Внутри системы

  • Главный риск иерархических отчётов — двойной счёт. Если в базу попадают и строки-сводки, и детальные строки, любой итог, график и сводная таблица завышаются в полтора-три раза, причём молча: отчёт выглядит правдоподобно. Поэтому отсев сделан при загрузке, а не в интерфейсе, и правило одно для всех путей.
  • Отдельная ловушка — длинные номера-идентификаторы. Номер закупки из восемнадцати цифр, прочитанный как число, теряет точность на уровне последних разрядов: два разных номера превращаются в один и тот же, система объявляет ложный дубль и портит уже загруженные данные. Колонки-идентификаторы поэтому читаются строго как текст.
  • Структура выгрузок меняется от месяца к месяцу — колонки переставляют, листы переименовывают. Поэтому у каждого типа отчёта своя конфигурация разбора, а не общий жёсткий формат; добавление нового типа не трогает разбор существующих.
  • Движок сводных таблиц написан свой: готовые библиотеки не дают ни нескольких независимых мер одновременно, ни двух осей значений, ни передачи среза другому пользователю ссылкой. Настройки отчёта живут и в адресе страницы, и в базе, поэтому ссылка открывает ровно то, что видел отправитель.

Как устроено

Правила проверки и отсева вынесены в общий модуль, который применяется и при загрузке, и при ретроспективной проверке уже загруженных файлов. Иначе правило, исправленное в загрузчике, не доходит до данных, попавших в базу до исправления.

Результат

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

Следующая работа
Оценка и отбор квартир для инвестиционного фонда