Решение показывает, как сохранить Excel привычным рабочим окном финансового аналитика, но вынести из отдельных файлов саму модель: данные, правила расчёта, структуру статей, календарь и запись изменений. Пользователь продолжает работать с ячейками — строит отчёт, вводит факт, раскрывает кварталы и статьи, — а полная многомерная координата, расчётные правила и история неподтверждённых изменений ведутся в единой панели EPM.
Фактически приложенный контур состоит из двух частей. Сценарий build.mjs задаёт отдельный куб xls_plan для бюджета 2026 года, детерминированный набор исходных сумм и четыре правила план-факт расчёта. Отчёт PREV-GENERATOR.md описывает реализованный модуль VBA версии 2026.08.07.2, в котором объединены построение представления, ввод, контроль конфликтов, редактор правил и работа с иерархиями. Статическая проверка этого модуля завершена без ошибок и предупреждений.
Граница результата при этом существенна. Независимый аудит подтвердил исходные суммы и обе иерархии, но не принял расчётный слой: отсутствующий факт сейчас считается нулём, отклонения создаются одновременно под версиями «План» и «Факт», а частично заполненный месяц способен сформировать фиктивный итог. В приложенном архиве также нет самой книги Excel, модуля .bas, манифеста фактической серверной сборки, ответов чтения ячеек и журнала успешного сквозного прогона. Поэтому кейс описывает то, что подтверждено материалами: построенную структуру рабочего места, воспроизводимый набор данных и выявленные пределы текущего расчёта, а не полностью принятую промышленную модель.
Демо охватывает один управленческий отчёт о прибылях и убытках за 2026 год. В нём семь исходных статей: выручка от продукции, выручка от услуг, материалы, труд, персонал, аренда и маркетинг. Расходы хранятся с отрицательным знаком, поэтому выручка, себестоимость, валовая прибыль, операционные расходы и EBITDA формируются обычным сложением по дереву статей.
План рассчитывается для всех двенадцати месяцев. Для каждой листовой статьи задана базовая месячная сумма, которая умножается на единый сезонный коэффициент месяца и округляется до двух знаков до загрузки. Последовательность коэффициентов с января по декабрь: 0,92; 0,95; 1,02; 1,00; 1,03; 1,06; 0,98; 0,94; 1,05; 1,08; 1,02; 0,95. Их сумма равна 12, поэтому годовой план совпадает с двенадцатью базовыми месяцами.
Факт создан только за первые восемь месяцев. Он получается умножением уже рассчитанного месячного плана на постоянный коэффициент конкретной статьи: продукция — 1,04, услуги — 0,97, материалы — 1,06, труд — 1,01, персонал — 1,02, аренда — 1,00, маркетинг — 1,12. В результате загружено 84 плановых адреса и 56 фактических, всего 140 строк. На сентябрь–декабрь приходится ещё 28 сочетаний «статья × месяц», для которых фактического значения нет.
Платформа должна выполнять три вида расчёта:
По самим исходным данным годовой план составляет 72 000,00 тыс. ₽ выручки, 36 360,00 тыс. ₽ валовой прибыли и 11 760,00 тыс. ₽ EBITDA. На сопоставимой базе января–августа плановая EBITDA равна 7 742,00 тыс. ₽, фактическая — 7 182,68 тыс. ₽, отклонение — −559,32 тыс. ₽, или −7,224490 %.
Пользовательский слой, согласно приложенному отчёту о поставке, не ограничивается чтением отчёта. В одной панели реализованы режимы анализа и ввода, инспектор полной координаты выбранной ячейки, список неподтверждённых изменений, сравнение исходного, серверного и локального значения при конфликте, редактор базового правила вместе с обязательным правилом свода, проверка формул и менеджер версий дерева. Однако работа этих функций в настоящем Excel и против текущего стенда в составе данного архива повторно не воспроизводится: соответствующие исполняемые файлы и ответы сервера не приложены.
| Бизнес-объект | Физический объект | Фактически заданное содержание |
|---|---|---|
| Статьи управленческого отчёта | xls_item | 12 элементов: 7 листовых статей и 5 итоговых узлов. Дерево: EBITDA → валовая прибыль и операционные расходы; валовая прибыль → выручка и себестоимость; выручка → продукция и услуги; себестоимость → материалы и труд; операционные расходы → персонал, аренда и маркетинг. |
| Календарь | xls_month | 17 элементов: 12 месяцев, 4 квартала и итог «2026 год». Иерархия «год → кварталы → месяцы». |
| Версия данных | xls_version | 2 элемента: PLAN — «План» и FACT — «Факт». Иерархии нет; при отсутствии версии на оси или в листовом фильтре значения складываются. |
| Куб бюджета | xls_plan | Три измерения: статья × месяц × версия. Название в сценарии сборки — «Бюджет 2026 — ввод из Excel». |
| Исходная сумма | мера amount | Загружаемая сумма в тыс. ₽. План присутствует по 7 статьям и 12 месяцам; факт — по 7 статьям и 8 месяцам. |
| Абсолютное отклонение | мера var_abs | Вычисляемая мера «факт минус план». В текущей реализации создаётся и под PLAN, и под FACT, что приводит к двойному счёту при свёртке версии. |
| Процентное отклонение | мера var_pct | Вычисляемое отношение var_abs / PLAN × 100. Для затрат положительный процент означает рост отрицательной суммы расхода, а не благоприятный результат. Отдельного признака «благоприятно/неблагоприятно» нет. |
| Правила расчёта | 4 правила куба | Базовое и агрегирующее правило для абсолютного отклонения, базовое и агрегирующее правило для процента. Предложенная позднее безопасная схема из 6 мер и 8 правил в build.mjs не внедрена. |
| Исходный набор | результат buildRows() | 140 строк: 84 PLAN и 56 FACT; дубликатов адресов нет, суммы имеют не более двух знаков после запятой. |
| Рабочее место Excel | модуль VBA 2026.08.07.2 | По отчёту о поставке — 4 851 физическая строка, 229 процедур, 41 именованный диапазон и 6 служебных листов; статический прогон дал errors: [] и warnings: []. Сам модуль в текущий архив не включён. |
Модель намеренно узкая. В ней нет организации, подразделения, центра финансовой ответственности, продукта как отдельного измерения, валюты, сценария прогноза или нескольких лет. Это демонстрационный куб двусторонней работы Excel с одним отчётом за один год, а не готовая корпоративная модель бюджетирования.
| Шаг | Бизнесовый смысл и фактическая реализация |
|---|---|
| 1. Задание базового месячного плана | Для семи листовых статей заданы суммы: продукция 4 200, услуги 1 800, материалы −1 850, труд −1 120, персонал −1 450, аренда −320, маркетинг −280 тыс. ₽. |
| 2. Применение сезонности | Базовая сумма умножается на коэффициент месяца. Один и тот же профиль сезонности применяется ко всем семи статьям. |
| 3. Округление до загрузки | Каждый адрес округляется до двух знаков в генераторе, поскольку в языке правил платформы нет функции округления. |
| 4. Формирование факта | За январь–август план каждой статьи умножается на её постоянный коэффициент факта. Сентябрь–декабрь остаются без фактических строк. |
| 5. Сложение отчёта по статьям | Отрицательные расходы позволяют получить Выручка, Себестоимость, Валовая прибыль, Операционные расходы и EBITDA обычным сложением по иерархии. Отдельные формулы для этих пяти строк не нужны. |
| 6. Сложение по времени | Месяцы агрегируются в кварталы и год по календарной иерархии. Для денежной суммы такое сложение корректно. |
| 7. Абсолютное отклонение | Текущее базовое правило рассчитывает amount[FACT] − amount[PLAN]. Отдельное правило складывает результат по деревьям статей и времени. |
| 8. Процентное отклонение | Текущее правило делит абсолютное отклонение на план и умножает на 100. На родительских узлах процент должен пересчитываться из итоговых числителя и знаменателя, а не складываться из процентов листьев. |
| 9. Ввод из Excel | Пользователь меняет входную сумму, видит старое и новое значение и отправляет набор изменений. Вычисляемые меры должны быть заблокированы для ручного ввода и перечитаны после серверного пересчёта. |
| 10. Конкурентная запись | Перед отправкой клиент перечитывает координату. Если другой пользователь уже изменил значение, показывается сравнение «исходное / серверное / локальное», после чего аналитик выбирает, какое значение сохранить. |
| 11. Изменение формул и дерева | Базовое правило и правило свода представлены как один расчёт меры; формулы проходят локальную и серверную проверку. Для дерева проверяются циклы, дубликаты, неизвестные родители, самоссылки и изменение состава. |
| 12. Контроль результата | Исходные строки независимо пересчитываются по всем месяцам, кварталам, году и обеим версиям. В текущем архиве такой контроль подтвердил суммы и иерархии, но выявил ошибки расчётных мер. |
Текущие четыре правила не различают настоящий ноль и отсутствие факта: язык правил не умеет проверять пустое значение, а отдельная загружаемая мера наличия факта отсутствует. Поэтому открытые месяцы включаются в отклонение как нулевой факт. Кроме того, правила не ограничены координатой версии PLAN, из-за чего одинаковый результат записывается под обеими версиями и удваивается при их свёртке.
Предложенная в PREV-RASCHET.md исправленная логика — явный признак наличия факта, сопоставимый план, сопоставимый факт и восемь связанных правил — является проектом доработки, а не фактически собранным состоянием build.mjs. Контроля полноты месяца также нет: система не проверяет, заполнены ли все семь обязательных статей до расчёта итоговой EBITDA.
Подтверждённые суммы исходного набора, тыс. ₽:
| Показатель | План на 2026 год | Сопоставимый план январь–август | Факт январь–август | Отклонение | Отклонение, % |
|---|---|---|---|---|---|
| Выручка | 72 000,00 | 47 400,00 | 48 300,60 | +900,60 | +1,900000 |
| Себестоимость | −35 640,00 | −23 463,00 | −24 428,38 | −965,38 | +4,114478 |
| Валовая прибыль | 36 360,00 | 23 937,00 | 23 872,22 | −64,78 | −0,270627 |
| Операционные расходы | −24 600,00 | −16 195,00 | −16 689,54 | −494,54 | +3,053659 |
| EBITDA | 11 760,00 | 7 742,00 | 7 182,68 | −559,32 | −7,224490 |
Годовая плановая валовая рентабельность равна 50,5 %, плановая рентабельность по EBITDA — 16,333333 %. Эти доли одинаковы во всех месяцах, поскольку один сезонный коэффициент одновременно применяется к выручке и всем расходам. Фактическая рентабельность по EBITDA за январь–август составляет 14,870788 %; это расчётное следствие подтверждённых сумм 7 182,68 / 48 300,60.
На уровне исходных статей фактические отклонения заданы постоянными коэффициентами: выручка от продукции +4 %, выручка от услуг −3 %, материалы +6 %, труд +1 %, персонал +2 %, аренда 0 %, маркетинг +12 %. Для затрат знак процента требует пояснения: например, +6 % по материалам означает, что расход стал на 6 % больше по модулю; абсолютное отклонение при этом отрицательное.
Расхождения, выявленные в текущем расчётном слое:
| Срез EBITDA | Что показывает текущее правило | Сопоставимый результат по имеющемуся факту |
|---|---|---|
| Сентябрь | −1 029,00; −100 % | Факта нет; отклонение не должно рассчитываться как нулевой факт. |
| III квартал | −1 164,94; −40,024050 % | −135,94; −7,224702 % по июлю–августу. |
| IV квартал | −2 989,00; −100 % | Факта нет; сопоставимые суммы равны нулю. |
| 2026 год | −4 577,32; −38,922789 % | −559,32; −7,224490 % по январю–августу. |
Из 204 сочетаний «12 статей × 17 календарных элементов» абсолютное отклонение неверно на 84 срезах: по всем статьям за сентябрь–декабрь, III квартал, IV квартал и год. При свёртке версии отклонение дублируется: например, для выручки от продукции за январь правильные 154,56 тыс. ₽ и 4 % превращаются в 309,12 тыс. ₽ и 8 %. Свёрнутая исходная сумма EBITDA за год становится 18 942,68 тыс. ₽, то есть складывает полный план 11 760,00 и неполный факт 7 182,68.
Есть и риск частичного ввода. Если в сентябре первой записать только фактическую выручку от продукции 4 586,40 тыс. ₽, а остальные шесть статей ещё не заполнить, текущая модель немедленно покажет фактическую EBITDA 4 586,40 тыс. ₽, отклонение +3 557,40 тыс. ₽ и +345,714286 %. Это не финансовый результат периода, а следствие сложения одной введённой строки с отсутствующими затратами.
В целевой организации работы Excel не хранит самостоятельные формулы отчёта. Клиент получает из куба координаты и значения, раскладывает их по листу и сохраняет служебное соответствие между видимой ячейкой и адресом «статья × месяц × версия × мера». Благодаря этому перестановка строк или колонок не превращает адрес Excel вроде G17 в часть серверной формулы.
| Витрина или рабочая область | Источник | Что получает финансовый директор | Подтверждённая граница |
|---|---|---|---|
| Управленческий отчёт | xls_plan, иерархии xls_item и xls_month | Выручку, себестоимость, валовую прибыль, операционные расходы и EBITDA по месяцам, кварталам и году; план, факт и отклонения. | Исходные суммы и иерархические итоги воспроизведены независимо. Расчёт отклонений для открытых месяцев и свёрнутой версии неверен. |
| Сетка ввода | Плоское представление «статья × месяц × версия», меры в колонках | Листовые значения amount, доступные для ввода; var_abs и var_pct как вычисляемые поля. | В build.mjs тест представления использует measures.position.index = 0 при пустых колонках. В api.md такой запрос зафиксирован как ошибочный; рабочее значение — 1. Ошибка только записывается в замечания и не останавливает сборку. |
| Инспектор ячейки | Скрытая карта координат книги | Полный многомерный адрес, происхождение значения и причину, по которой ячейка разрешена или запрещена для ввода. | Функция заявлена реализованной в отчёте о модуле; исполняемый модуль в архиве отсутствует. |
| Набор изменений | Исходное, серверное и локальное состояния | Все неподтверждённые правки, старое и новое значение, дельту и конфликт с изменением другого пользователя. | Статическая проверка кода пройдена; сквозная запись против стенда в приложенном комплекте не показана. |
| Редактор расчёта меры | Реестр правил куба | Базовую формулу и связанную политику свода на одном экране, локальные предупреждения, позицию серверной ошибки и безопасную публикацию с восстановлением исходного правила при неудаче. | Реализация описана в отчёте о модуле; числового предварительного расчёта до публикации сервер не предоставляет. |
| Менеджер справочника и дерева | Элементы и версии иерархий | Добавление элемента, редактирование атрибутов, перенос ветки, сравнение и публикацию версии дерева с проверкой циклов и потери элементов. | Реализация описана в отчёте; фактический журнал изменения справочника не приложен. |
| Проверка модели | Локальные правила контроля и серверная проверка формул | Ошибки синтаксиса, неизвестные объекты, отсутствие правила свода, опасное деление, неполный VIEW и другие известные ограничения движка. | Статические проверки модуля прошли; проверка числового результата текущего куба выявила блокирующие дефекты. |
По отчёту о поставке модуль предусматривает два видимых листа — EPM и EPM_View — и четыре скрытых служебных листа для состояния, координат, исходных значений и журнала. Однако отдельная готовая книга Excel, её снимки и журнал установки в приложенном архиве отсутствуют. Поэтому в кейсе заявляется логика формирования рабочего места и подтверждённые расчётные срезы, но не окончательно принятый внешний вид книги.
Первое — Excel остаётся привычным инструментом, но перестаёт быть единственным хранилищем логики. Финансовый аналитик работает в знакомой сетке, а данные, структура статей и правила расчёта находятся в централизованной модели. Это снижает зависимость от копий файлов и скрытых формул в отдельных ячейках.
Второе — ввод становится управляемым. Каждая редактируемая ячейка связана с полной многомерной координатой. Перед записью можно увидеть набор изменений, сравнить исходное, серверное и локальное значение и отдельно разрешить конфликт двух пользователей, не теряя остальные правки.
Третье — формула и способ её свода рассматриваются как одно целое. Для финансовых показателей это принципиально: деньги можно складывать, процент нужно пересчитывать из итоговых числителя и знаменателя, остаток по времени — брать на конец периода. Реализованный редактор направлен именно на то, чтобы правило верхнего уровня нельзя было забыть или случайно заменить суммой процентов.
Четвёртое — структура отчёта изменяется контролируемо. Элементы и дерево редактируются с проверкой циклов, дубликатов, неизвестных родителей и потери состава. Версионность дерева позволяет отделить подготовку изменения от его публикации.
Пятое — исходный набор полностью воспроизводим. Генерация не зависит от текущего времени, 140 строк повторяются детерминированно, дубликатов адресов нет, а все пять итоговых строк сходятся на месяцах, кварталах и году. Это даёт понятную основу для приёмочных тестов Excel-клиента и платформы.
Шестое — независимая проверка выявляет ошибки, которые обычное равенство итогов не показывает. В этом демо исходные суммы и общий отчёт сходятся, но 84 план-факт среза отвечают на неправильный вопрос, а свёртка версии удваивает расчёт. Такая проверка полезна именно тем, что отделяет арифметически сбалансированную модель от экономически корректной.
Текущий контур нельзя представлять заказчику как завершённый промышленный план-факт процесс. До повторной приёмки необходимо внедрить явный признак наличия факта и контроль полноты семи статей месяца, заменить три меры и четыре правила на безопасный набор из шести мер и восьми правил, считать расчётные показатели только в одной версии, исправить конфигурацию плоского представления, сделать ошибки представления фатальными, перечитывать контрольные ячейки после публикации и запретить свёртку amount без листового выбора версии. Дату закрытого периода также нужно параметризовать: в исходнике от 7 августа 2026 года постоянная CLOSED_MONTHS = 8 уже считает август закрытым. Для реалистичной демонстрации потребуется и менее синтетический профиль данных: сейчас одна сезонность применяется ко всем статьям, а месячные рентабельности плана постоянны.
Ценность уже построенного результата — не в безусловной готовности расчёта, а в проверенной архитектуре рабочего места и в том, что граница между исходными данными, платформенными правилами, пользовательским вводом и контролем ошибок стала явной. После исправления перечисленных дефектов тот же подход может дать финансовому директору единое управляемое окно для анализа, ввода и изменения модели без возврата к разрозненным Excel-файлам.
Мы построили прототип, в котором Excel остаётся рабочим местом финансового аналитика, а данные и расчётная логика находятся в централизованной модели EPM. Пользователь может сформировать управленческий отчёт, ввести факт, увидеть полную координату ячейки, проверить набор изменений, разрешить конфликт с правкой другого пользователя и работать с формулами и деревом статей из единой панели.
В демонстрационном кубе бюджета 2026 года используются 12 статей отчёта, 17 элементов календаря и две версии — план и факт. Загружено 140 исходных строк: 84 плановых значения за двенадцать месяцев и 56 фактических значений за январь–август. Годовой план показывает выручку 72,00 млн ₽, валовую прибыль 36,36 млн ₽ и EBITDA 11,76 млн ₽.
На сопоставимой базе января–августа выручка выросла с 47,40 до 48,30 млн ₽, а EBITDA снизилась с 7,742 до 7,183 млн ₽. Отклонение EBITDA составляет минус 559,32 тыс. ₽, или минус 7,224490 %. Исходные суммы, знаки расходов и агрегирование по статьям и календарю независимо воспроизведены.
При этом независимая проверка показала, что текущие правила отклонений ещё не готовы к приёмке: отсутствующий факт за открытые месяцы трактуется как ноль, расчёт дублируется под двумя версиями, а частично заполненный месяц способен показать фиктивную EBITDA. В приложенном комплекте также нет книги Excel и серверного снимка ячеек, поэтому мы не выдаём проектный замысел и статическую проверку клиента за подтверждение полного сквозного процесса.
Для заказчика уже продемонстрирован сам принцип: Excel может быть управляемым окном к единой модели, а не местом, где логика размножается по файлам и формулам. Следующий обязательный шаг — исправить правила сопоставимости, добавить контроль полноты периода и подтвердить запись и перечитывание контрольных ячеек на стенде. После этого решение сможет надёжно объединить анализ, ввод, расчёт, изменение формул и управление структурой отчёта в одном рабочем контуре.