Авторский курс Елизаровой НаталииAuthor's course by Nataliia Elizarova
Модуль 5 · Урок 05-21 · Новый урокModule 5 · Lesson 05-21 · New lesson

Обновление, правки в дашборде и публикация для командыRefreshing, editing in the dashboard and publishing for the team

Дашборд живёт, пока его обновляют. Каждый месяц приходят новые данные, коллеги вносят правки прогноза, команда открывает файл из общей папки. В этом уроке — порядок обновления одной кнопкой, автопроверки, журнал правок, который не задваивает цифры, выгрузки в Excel по правилам и публикация так, чтобы у всех была одна свежая версия.

A dashboard lives as long as it is refreshed. Every month new data arrives, colleagues make forecast edits, the team opens the file from a shared folder. This lesson covers the one-button refresh order, automated checks, an edit journal that does not double the numbers, Excel exports by the rules and publishing so that everybody has one fresh version.

🆕 Новый урок🆕 New lesson ⏱ 45 минут⏱ 45 minutes 🎮 Тренажёр «Журнал правок»🎮 Simulator: "Edit journal" 📄 Кнопка обновления и скрипт публикации📄 Refresh button and publishing script ✅ Тест из 8 вопросов✅ An 8-question quiz

После урока вы сможетеAfter this lesson you will be able to

  • обновлять дашборд одной кнопкой: загрузка → сборка → проверка → публикация;
  • объяснить, почему после любой правки нужна пересборка, а проверка JSON её не заменяет;
  • вести журнал решений с автором, сливать журналы нескольких людей и мягко удалять правки;
  • выгружать в Excel по правилам: числа числами, имя файла несёт все фильтры;
  • публиковать одну копию для команды с версиями и записью «что изменилось»;
  • передать дашборд коллеге так, чтобы он заработал на её ноутбуке.
  • refresh the dashboard with one button: load → build → check → publish;
  • explain why every edit needs a rebuild and a JSON check does not replace it;
  • keep a decision journal with authors, merge several people's journals and soft-delete edits;
  • export to Excel by the rules: numbers as numbers, the file name carries all filters;
  • publish one copy for the team with versions and a "what changed" note;
  • hand the dashboard over to a colleague so that it works on her laptop.
1

Пять слов урокаFive words of the lesson

ПересборкаRebuildновый HTML из данных и кода; правки в готовый HTML руками не вносятa new HTML from data and code; nobody edits the finished HTML by hand
Журнал решенийDecision journalсписок правок вида «стало 1 150, автор, время, причина» — а не «+50»a list of edits like "became 1,150, author, time, reason" — not "+50"
Мягкое удалениеSoft deleteправка помечена «удалена», но строка остаётся — видно, кто и когдаan edit is marked "deleted" but the row stays — you can see who and when
ПубликацияPublishingкопия HTML и скриптов в общую папку, откуда команда открывает дашбордa copy of the HTML and scripts in the shared folder the team opens the dashboard from
ВерсияVersionдатированная копия и строка «что изменилось», чтобы вернуться назадa dated copy and a "what changed" line, so you can go back
2

На пальцах: газета, а не доска объявленийIn plain words: a newspaper, not a notice board

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

On a notice board everyone pins their own note — a month later nobody knows which one is current. A newspaper is laid out anew every issue from checked material, gets a date and a number, and old issues are archived. A dashboard should live like a newspaper.

Формула урокаThe lesson formula Правка → пересборка → проверка → публикация. Никаких ручных правок в готовом HTML. Правки людей — в журнал решений, который читает сборщик; выпуск — одной копией в общей папке, с датой и строкой «что изменилось». Edit → rebuild → check → publish. No manual edits in the finished HTML. People's edits go into a decision journal that the builder reads; the issue goes out as one copy in the shared folder, with a date and a "what changed" line.
3

Порядок обновления одной кнопкойThe one-button refresh order

ШагStepСкриптScriptЕсли ошибкаOn error
1. Загрузить закрытые месяцы1. Load closed monthsload_exports.py (урок 05-20)(lesson 05-20)стоп, дальше не идёмstop, go no further
2. Собрать HTML2. Build the HTMLbuild_dashboard.py (урок 05-19)(lesson 05-19)стопstop
3. Проверить дашборд3. Check the dashboardcheck_dashboard.pyстоп, не публиковатьstop, do not publish
4. Опубликовать4. Publishpublish.pyсказать честно, что не записаноsay honestly what was not written

Кнопка — файл RUN_update.bat: двойной клик, меню «что обновить?», шаги по порядку. Ошибка любого шага останавливает цепочку — устаревший дашборд лучше неверного.

The button is the RUN_update.bat file: a double click, a "what to update?" menu, steps in order. An error at any step stops the chain — an outdated dashboard is better than a wrong one.

Кириллица ломает .batCyrillic breaks .bat Командная строка Windows читает .bat побайтно, и русские буквы превращаются в кашу или ломают команды. Поэтому .bat — только латиница, а весь русский текст меню живёт в .py-файле. The Windows command line reads a .bat byte by byte, and Cyrillic letters turn into garbage or break commands. So the .bat is Latin only, and all the Russian menu text lives in the .py file.
4

Скачайте кнопку обновления и публикациюDownload the refresh button and publishing

Положите четыре файла в папку проекта рядом с load_exports.py и сборщиком. В publish_config.txt впишите, куда публиковать — путь от папки скрипта. Шаг, которого нет в папке, меню пропустит.

Put the four files into the project folder next to load_exports.py and the builder. In publish_config.txt write where to publish — a path from the script folder. The menu skips a step that is not in the folder.

RUN_update.batкнопка: двойной кликthe button: double click
update_menu.pyменю и шаги по порядкуthe menu and steps in order
publish.pyкопия в общую папку, версии, «что изменилось»copy to the shared folder, versions, "what changed"
publish_config.txtкуда публиковатьwhere to publish
Показать тексты файловShow the file texts
@echo off
rem Dashboard update. Only Latin letters here: Cyrillic breaks .bat files.
chcp 65001 >nul
cd /d "%~dp0"
set PY=python
if exist ".venv\Scripts\python.exe" set PY=.venv\Scripts\python.exe
%PY% update_menu.py %1
if errorlevel 1 echo ERROR - read the messages above
pause
# -*- coding: utf-8 -*-
"""Меню обновления дашборда: спрашивает, что обновить, и запускает шаги по порядку.
Dashboard update menu: asks what to update and runs the steps in order.
Русский текст живёт здесь, в .py; .bat только запускает этот файл (кириллица ломает .bat).
Шаг, которого нет в папке, пропускается. Ошибка шага останавливает цепочку.
"""
import subprocess
import sys
from pathlib import Path
HERE = Path(__file__).resolve().parent
STEPS = [("1", "Загрузить данные / load data", "load_exports.py"),
         ("2", "Собрать дашборд / build the dashboard", "build_dashboard.py"),
         ("3", "Проверить дашборд / check the dashboard", "check_dashboard.py"),
         ("4", "Опубликовать для команды / publish for the team", "publish.py")]
def run(script):
    path = HERE / script
    if not path.exists():
        print(f"  нет файла {script} - шаг пропущен")
        return 0
    print(f"--- {script}")
    return subprocess.call([sys.executable, str(path)], cwd=str(HERE))
def main():
    print("Что обновить? / What to update?")
    for key, name, _ in STEPS:
        print(f"  {key} - {name}")
    print("  5 - всё по порядку / everything in order")
    choice = (sys.argv[1] if len(sys.argv) > 1 else input("Номер / number: ")).strip()
    todo = STEPS if choice == "5" else [s for s in STEPS if s[0] == choice]
    if not todo:
        print("Нет такого пункта / no such option")
        return 1
    for key, name, script in todo:
        code = run(script)
        if code != 0:
            print(f"ОСТАНОВЛЕНО на шаге {key} ({script}), код {code}. Дальше не идём / stopped.")
            return code
    print("Все шаги прошли / all steps passed")
    return 0
if __name__ == "__main__":
    sys.exit(main())
# -*- coding: utf-8 -*-
"""Публикация дашборда для команды: HTML + скрипты в общую папку, копия версии и запись «что изменилось».
Publishing the dashboard for the team: HTML + scripts to the shared folder, a version copy and a 'what changed' note.
publish_config.txt рядом со скриптом / next to the script:
  html=Dashboard.html              # что публикуем / what to publish
  target=..\\Shared\\Dashboard      # куда: путь от папки скрипта / where: path relative to the script folder
Запуск / run:  python publish.py "что изменилось / what changed"
"""
import datetime
import shutil
import sys
from pathlib import Path
HERE = Path(__file__).resolve().parent
KEEP = ("*.py", "*.bat", "README.md", "code_map.csv", "city_map.csv")   # скрипты и справочники едут вместе с HTML
def config():
    cfg = {}
    for line in (HERE / "publish_config.txt").read_text(encoding="utf-8-sig").splitlines():
        if "=" in line and not line.strip().startswith("#"):
            k, v = line.split("=", 1)
            cfg[k.strip()] = v.split("#")[0].strip()
    return cfg
def copy_checked(src, dst):
    """Копирует и проверяет размер: «готово» только если файл правда на месте."""
    shutil.copy2(src, dst)
    if not dst.exists() or dst.stat().st_size != src.stat().st_size:
        raise OSError(f"не скопировался {src.name}")
def main():
    cfg = config()
    html = HERE / cfg["html"]
    target = (HERE / cfg["target"]).resolve()
    if not html.exists():
        print(f"СТОП: нет {html.name} - сначала соберите дашборд")
        return 1
    if not target.parent.exists():
        print(f"СТОП: нет папки {target.parent} - проверьте target в publish_config.txt")
        return 1
    stamp = datetime.datetime.now().strftime("%Y-%m-%d_%H%M")
    (target / "versions").mkdir(parents=True, exist_ok=True)
    errors = []
    try:
        copy_checked(html, target / html.name)
        copy_checked(html, target / "versions" / f"{html.stem}_{stamp}{html.suffix}")
    except OSError as e:                      # файл открыт у коллеги / file open on a colleague's PC
        errors.append(f"{html.name}: {e}")
    (target / "scripts").mkdir(exist_ok=True)
    for pattern in KEEP:
        for f in HERE.glob(pattern):
            try:
                copy_checked(f, target / "scripts" / f.name)
            except OSError as e:
                errors.append(f"{f.name}: {e}")
    note = sys.argv[1] if len(sys.argv) > 1 else "обновление данных / data refresh"
    with open(target / "CHANGES.md", "a", encoding="utf-8") as fh:
        fh.write(f"- {stamp}: {note}\n")
    if errors:
        print("НЕ ВСЁ опубликовано / not everything published:")
        for e in errors:
            print("  " + e)
        return 1
    print(f"ГОТОВО: {html.name} -> {target}")
    return 0
if __name__ == "__main__":
    sys.exit(main())
# What to publish and where. Paths are relative to this folder.
# Что публиковать и куда. Пути - от этой папки.
html=Dashboard.html
target=..\Shared\Dashboard

Файлы проверены: RUN_update.bat запущен в командной строке Windows, меню прошло все шаги, publish.py положил дашборд, скрипты, копию версии и строку в CHANGES.md в тестовую общую папку.

The files were tested: RUN_update.bat was run in the Windows command line, the menu went through all steps, publish.py put the dashboard, scripts, a version copy and a CHANGES.md line into a test shared folder.

5

Пересборка после каждой правкиA rebuild after every fix

Исправили ошибку в загрузчике — проверили data.json — цифры верные. Но дашборд у команды показывает старые цифры: HTML собран вчера, до правки. Проверка JSON подтверждает данные, а люди смотрят на HTML.

You fixed a bug in the loader — checked data.json — the numbers are right. But the team's dashboard shows the old numbers: the HTML was built yesterday, before the fix. A JSON check confirms the data, while people look at the HTML.

ПравилоRule Правка в загрузчике или в коде → пересборка → проверка готового HTML → публикация. Всегда до конца цепочки, даже если правка «маленькая». A fix in the loader or the code → rebuild → check the finished HTML → publish. Always to the end of the chain, even if the fix is "small".
6

Автопроверки готового дашбордаAutomated checks of the finished dashboard

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

The check script opens the built HTML in a headless browser and walks through it as a person would. The minimum set:

ПроверкаCheckЧто ловитWhat it catches
Все листы × состояния фильтровAll sheets × filter statesлист, который падает только при одном фильтреa sheet that breaks only with one filter
Ошибки JavaScript в консолиJavaScript errors in the consoleпустую страницу «без причины»a blank page "for no reason"
Сверка цифрNumber reconciliationитог на экране ≠ итогу data.jsonthe on-screen total ≠ the data.json total
Повторные объявленияDuplicate declarationsдва const с одним именем — пустая страница; две функции — молча работает последняяtwo const with one name — a blank page; two functions — the last one silently wins

Такой скрипт ассистент пишет по заданию за один заход — пример проверки лежит в образце дашборда (урок 05-18).

An assistant writes such a script from a brief in one go — a sample check is in the sample dashboard (lesson 05-18).

7

Правки в дашборде: журнал решений, а не измененийEdits in the dashboard: a journal of decisions, not changes

Пусть сок в Каменске в базе — 1 000. Планер поднял до 1 100, канальный менеджер позже — до 1 150. Как записать?

Say juice in Kamensk has a baseline of 1,000. The planner raised it to 1,100, the channel manager later to 1,150. How to record it?

Журнал измененийJournal of changesЖурнал решенийJournal of decisions
ЗаписьRecord+100, +50«стало 1 100», «стало 1 150»"became 1,100", "became 1,150"
ИтогResultбаза + сумма измененийbaseline + sum of changesпоследнее действующее решениеthe latest active decision
Запись пришла дваждыA record arrived twice+100 сложится дважды: 1 250+100 adds twice: 1,250повтор по ID не считается: 1 150a repeat by ID does not count: 1,150
Удалить правкуDelete an editтолько обратной записью — её забываютonly by a reverse record — people forget itпометка «удалена», строка остаётсяa "deleted" mark, the row stays

Каждая запись несёт автора, время и причину. Когда правка задаёт итог суббренда или города, её раскладывают на SKU по долям — и пишут в журнал уже разложенные решения.

Every record carries the author, time and reason. When an edit sets the total of a subbrand or a city, it is split to SKUs by shares — and the split decisions go into the journal.

8

Тренажёр: журнал правок двух людейSimulator: an edit journal of two people

Планер (журнал A) и канальный менеджер (журнал B) правят три пары «товар · город». Подключайте журналы, загружайте B второй раз, удаляйте правку и переключайте способ записи.

The planner (journal A) and the channel manager (journal B) edit three product · city pairs. Connect the journals, load B a second time, delete an edit and switch the recording method.

9

Слияние журналов, удаление и порогMerging journals, deleting and the threshold

У каждой правки IDEvery edit has an IDпри слиянии повтор с тем же ID не считается — сколько раз ни загружайwhen merging, a repeat with the same ID does not count — however many times it is loaded
В силе — последняя по времениThe latest by time is in forceпо каждой паре «товар · город» действует самое свежее не удалённое решениеfor each product · city pair the newest non-deleted decision applies
Удаление мягкоеDeletion is softудалить можно любую правку, но строка остаётся с пометкой — история не теряетсяany edit can be deleted, but the row stays marked — history is not lost
Порог согласованияApproval thresholdправка больше порога к базе (пример — 20 %) требует подтверждения владельцаan edit bigger than the threshold vs baseline (example — 20%) needs the owner's confirmation
10

Где хранить журналWhere to keep the journal

Журнал — обычная книга .xlsx в общей папке. Дашборд пишет в неё правки через File System Access (Chrome, Edge — урок 05-20), а в других браузерах — скачивает файл правок, который человек кладёт в папку. Сборщик при следующем обновлении читает все файлы журналов, сливает по ID и показывает итог. Если книга открыта у коллеги, запись не пройдёт — дашборд обязан сказать «не записано».

The journal is an ordinary .xlsx workbook in the shared folder. The dashboard writes edits into it via File System Access (Chrome, Edge — lesson 05-20), and in other browsers downloads an edits file that a person puts into the folder. On the next refresh the builder reads all journal files, merges them by ID and shows the result. If a colleague has the workbook open, writing fails — the dashboard must say "not written".

11

Выгрузка в Excel по правиламExcel exports by the rules

ПравилоRuleПочемуWhy
Числа — числами, с разделителем разрядовNumbers as numbers, with thousand separatorsтекст не складывается и не сортируетсяtext does not sum or sort
Формат — классом в <style>, без заливокFormat via a class in <style>, no fillsфайл открывается чистым, его можно дальше считатьthe file opens clean and can be worked on
Формула — текстом в ячейке, если нужнаA formula as the text of a cell, if neededвидно, как посчитаноyou can see how it was calculated
Имя файла = что + все активные фильтрыFile name = what + all active filtersчерез неделю понятно, что внутри, без открытияa week later you know what is inside without opening it
Автор в свойствах файла — ваше имяThe author in the file properties — your nameфайл ходит по почте, автор не теряетсяthe file travels by mail, the author is not lost

12

Слайды из дашбордаSlides from the dashboard

В образце дашборда (урок 05-18) есть колода слайдов для встречи: заголовок-вывод, график, светофор, решения. Слайд сохраняется картинкой (html2canvas) или целой презентацией .pptx (PptxGenJS). Правило то же, что для Excel: слайд собирается из тех же проверенных цифр, а имя файла несёт цикл и фильтры.

The sample dashboard (lesson 05-18) has a slide deck for the meeting: a conclusion headline, a chart, a traffic light, decisions. A slide is saved as a picture (html2canvas) or a whole .pptx deck (PptxGenJS). The rule is the same as for Excel: a slide is built from the same checked numbers, and the file name carries the cycle and filters.

13

Публикация: одна копия для всехPublishing: one copy for everybody

  1. Одно место. Команда открывает дашборд из одной общей папки (OneDrive, SharePoint). Копии «у себя на рабочем столе» не рассылаем.
  2. HTML и скрипты вместе. publish.py кладёт рядом с дашбордом скрипты и справочники — тогда собрать его может любой.
  3. Версии. Каждая публикация — датированная копия в versions и строка в CHANGES.md: что изменилось.
  4. Всегда после пересборки. Пересобрали — сразу опубликовали, без вопроса «а надо ли».
  5. «Готово» — только после проверки копии. Скрипт сравнивает размер скопированного файла с исходным.
  1. One place. The team opens the dashboard from one shared folder (OneDrive, SharePoint). No "on my desktop" copies are sent around.
  2. HTML and scripts together. publish.py puts the scripts and master data next to the dashboard — then anybody can build it.
  3. Versions. Every publication is a dated copy in versions and a line in CHANGES.md: what changed.
  4. Always after a rebuild. Rebuilt — published right away, without asking "is it needed".
  5. "Done" only after checking the copy. The script compares the copied file's size with the source.
14

Доступ и данныеAccess and data

🔑

Никаких ключей в HTMLNo keys in the HTML

HTML-файл может прочитать любой, кто его открыл. Пароли, токены, ключи API к ИИ-сервисам в дашборд не кладём.

Anyone who opens an HTML file can read it. Passwords, tokens, API keys to AI services do not go into the dashboard.

🧭

«Откуда цифра» — внутри файла"Where the number comes from" — inside the file

Вместо подключения к ИИ — объяснение, которое считает сам дашборд: из чего сложена цифра и из какого файла она пришла.

Instead of connecting to AI — an explanation the dashboard calculates itself: what the number is made of and which file it came from.

👥

Кто видит — решают права папкиFolder rights decide who sees it

Все данные лежат внутри HTML. Если коллеге нельзя видеть цифры другой страны — нужен отдельный дашборд, а не скрытая вкладка.

All data sits inside the HTML. If a colleague must not see another country's numbers — a separate dashboard is needed, not a hidden tab.

15

Передать дашборд коллегеHanding the dashboard over to a colleague

  1. README в папке: что это, откуда данные, как обновить (одна кнопка), кому писать.
  2. Скрипты без абсолютных путей и имени ноутбука — проверьте, запустив на чужом ноутбуке.
  3. Python в PATH или окружение .venv рядом — RUN_update.bat найдёт любой из двух.
  4. Справочники и журнал — в общей папке, а не у вас на диске.
  5. Одно обновление вместе: коллега жмёт кнопку, вы смотрите.
  1. A README in the folder: what it is, where the data comes from, how to refresh (one button), whom to contact.
  2. Scripts without absolute paths or a laptop name — check by running on someone else's laptop.
  3. Python in PATH or a .venv environment next to it — RUN_update.bat finds either.
  4. Master data and the journal — in the shared folder, not on your disk.
  5. One refresh together: the colleague presses the button, you watch.
16

Руками ↔ как называетсяBy hand ↔ what it is called

Как вы делаете рукамиWhat you do by handКак это называетсяWhat it is called
каждый месяц копируете файлы и жмёте «обновить»every month copy files and press "refresh"конвейер обновления (pipeline)a refresh pipeline
пролистываете все вкладки после обновленияscroll through every tab after a refreshдымовой тест (smoke test)a smoke test
пишете в письме «что поменялось»write "what changed" in an emailжурнал изменений (changelog)a changelog
храните «Дашборд_старый_2.html»keep "Dashboard_old_2.html"версионированиеversioning
записываете, кто какую цифру поправилwrite down who changed which numberжурнал аудита (audit trail)an audit trail
17

Визуальная проверка обязательнаVisual check is a must

Визуальная проверка обязательна. Автопроверка подтверждает, что дашборд открывается и цифры сходятся с data.json. Что цифры правдоподобны, видит только человек: откройте опубликованную копию — именно её, а не свою — и посмотрите дату обновления, последний месяц и пару знакомых цифр.

Visual check is a must. An automated check confirms the dashboard opens and the numbers match data.json. Whether the numbers are plausible only a person sees: open the published copy — that one, not yours — and look at the refresh date, the last month and a couple of familiar numbers.

18

Что нового в 2025–2026What is new in 2025–2026

🤖

Агенты в ExcelAgents in Excel

29.09.2025 Microsoft объявил режим агента в Excel: ассистент сам строит листы и формулы по заданию. Это ускоряет черновик отчёта — но проверки и правила выгрузки остаются вашими (урок 02-08).

On 29.09.2025 Microsoft announced Agent Mode in Excel: the assistant builds sheets and formulas from a brief. It speeds up a report draft — but checks and export rules stay yours (lesson 02-08).

🗂️

Запись в файл из браузера — только ChromiumWriting a file from the browser — Chromium only

File System Access по-прежнему работает только в Chrome и Edge (урок 05-20). Журнал правок держите с запасным путём «скачать файл правок».

File System Access still works only in Chrome and Edge (lesson 05-20). Keep the edit journal with a "download the edits file" fallback.

Правило для любой новинкиThe rule for any novelty Новый способ обновления или публикации берём, только если на ваших данных он даёт те же цифры, что проверенный старый, — сверка итога «как год назад» по каждому месяцу. Adopt a new refresh or publishing method only if on your data it gives the same numbers as the checked old one — reconcile the total "as last year" for every month.

Источники: GeekWire, 29.09.2025, режим агента в Excel; web.dev и Web Platform features explorer — File System Access.

Sources: GeekWire, 29.09.2025, Agent Mode in Excel; web.dev and Web Platform features explorer — File System Access.

19

Как это бывает в жизниHow it happens in real life

Три случая из работы планера в компании-производителе напитков. Названия изменены.

Three cases from planning work at a beverage manufacturer. Names are changed.

1. «Готово», которого не было1. "Done" that never happened

Что случилосьWhat happened
Скрипт обновления написал «готово», а в общей папке лежал вчерашний дашборд.The refresh script said "done", while the shared folder held yesterday's dashboard.
Что на самом делеWhat was really going on
Один из файлов был открыт в Excel, запись упала, а следующий шаг — копирование — даже не начался. Ошибка утащила за собой соседний шаг, но «готово» печаталось в конце в любом случае.One file was open in Excel, writing failed, and the next step — copying — never started. The error dragged the neighbouring step down, but "done" was printed at the end anyway.
ПравилоRule
Каждый файл — в своей проверке; «готово» — только после того, как копия правда на месте.Each file in its own check; "done" only once the copy is really in place.

2. Исправили, но забыли пересобрать2. Fixed, but forgot to rebuild

Что случилосьWhat happened
Ошибку в загрузке нашли и исправили, проверили данные — всё верно. Через день коллеги снова спросили про ту же ошибку.A loading bug was found and fixed, the data was checked — all correct. A day later colleagues asked about the same bug again.
Что на самом делеWhat was really going on
Проверяли файл с данными, а HTML не пересобрали — у команды остался старый.The data file was checked, but the HTML was not rebuilt — the team still had the old one.
ПравилоRule
Правка → пересборка → проверка HTML → публикация. Всегда до конца.Fix → rebuild → check the HTML → publish. Always to the end.

3. Правка, которая сложилась дважды3. An edit that added up twice

Что случилосьWhat happened
Несколько человек правили прогноз в одном файле по очереди. После слияния у одного товара прогноз вырос сильнее, чем кто-либо правил.Several people edited the forecast in one file in turns. After merging, one product's forecast grew more than anybody had edited.
Что на самом делеWhat was really going on
Журнал хранил изменения («+»), а одна правка пришла из двух копий файла и сложилась дважды.The journal stored changes ("+"), and one edit came from two copies of the file and was added twice.
ПравилоRule
Журнал решений с ID и автором: повтор не считается, удаление мягкое.A decision journal with ID and author: a repeat does not count, deletion is soft.
20

Практика в ExcelExcel practice

В книге оба журнала из тренажёра на одном листе и формулы, которые решают, какая правка в силе: повтор, действует, последняя по времени, порог согласования. Лист «итог» сравнивает журнал решений с журналом изменений, лист «имя файла» собирает имя выгрузки из фильтров.

The workbook has both journals from the simulator on one sheet and formulas that decide which edit is in force: duplicate, active, latest by time, approval threshold. The "result" sheet compares the decision journal with the journal of changes, the "file name" sheet builds the export name from filters.

ЗаданияTasks

  1. Какой итог у трёх пар по журналу решений и по журналу изменений? Откуда разница?
  2. Какая правка требует согласования при пороге 20 %? А при 10 %?
  3. Снимите удаление с E3 (колонка «Удалено» = 0). Изменится ли итог чая? Почему?
  4. Поменяйте на листе «параметры» страну и лаг. Как изменилось имя файла?
  1. What is the result for the three pairs by the decision journal and by the journal of changes? Where does the difference come from?
  2. Which edit needs approval at a 20% threshold? And at 10%?
  3. Remove the deletion from E3 ("Deleted" = 0). Does the tea result change? Why?
  4. Change the country and lag on the "parameters" sheet. How did the file name change?
ОтветыAnswers

1. Журнал решений: сок 1 150, вода 760, чай 650. Журнал изменений: 1 250, 760, 890. Сок: E1 (+100) пришла дважды. Чай: удалённая E3 (+240) осталась в сумме, а E5 записана как +50 к тому, что видел канальный менеджер (600), хотя итог уже был 840.
2. При 20 % — только E3 (+40 %). При 10 % — E3 и E4 (+15 %); E1 ровно +10 % порог не превышает.
3. Нет, чай останется 650: E3 сделана 28.10 в 15:00, E5 — 29.10 в 16:00, в силе последняя по времени.
4. Имя меняется сразу, например «Точность_Страна-1_Цикл-10_M-1_SKU×город_тыс.л_2026-10-30.xlsx».

1. Decision journal: juice 1,150, water 760, tea 650. Journal of changes: 1,250, 760, 890. Juice: E1 (+100) arrived twice. Tea: the deleted E3 (+240) stayed in the sum, and E5 was logged as +50 to what the channel manager saw (600), though the total was already 840.
2. At 20% — only E3 (+40%). At 10% — E3 and E4 (+15%); E1 at exactly +10% does not exceed the threshold.
3. No, tea stays 650: E3 was made on 28.10 at 15:00, E5 on 29.10 at 16:00; the latest by time is in force.
4. The name changes at once, e.g. "Accuracy_Country-1_Cycle-10_M-1_SKU×city_k.L_2026-10-30.xlsx".

21

Частые вопросыFrequently asked questions

Кто что делает: я, Claude, Python?Who does what: me, Claude, Python?

Claude пишет скрипты обновления, проверки и публикации по вашему заданию. Python выполняет их по кнопке. Вы проверяете опубликованную копию глазами и отвечаете за цифры перед командой.

Claude writes the refresh, check and publishing scripts from your brief. Python runs them on the button. You check the published copy with your eyes and answer for the numbers to the team.

Можно обновлять по расписанию ночью?Can it refresh on a schedule at night?

Можно — через запуск по расписанию Windows (Task Scheduler). Но ноутбук должен быть включён и не спать, а результат кто-то должен проверить утром.

Yes — via Windows Task Scheduler. But the laptop must be on and awake, and someone must check the result in the morning.

Зачем публиковать скрипты, если команда смотрит только HTML?Why publish scripts if the team only looks at the HTML?

Чтобы дашборд пережил ваш отпуск: кто угодно из команды обновит его кнопкой.

So the dashboard survives your vacation: anyone on the team can refresh it with the button.

Что делать, если коллега правил в старой версии?What if a colleague edited in an old version?

Ничего страшного для журнала решений: его правки придут с ID и временем, слияние возьмёт последнюю действующую. Именно поэтому журнал хранит решения, а не изменения.

No harm for a decision journal: the edits come with an ID and a time, the merge takes the latest active one. That is exactly why the journal stores decisions, not changes.

22

Упражнение: что делать?Exercise: what to do?

23

Три мифаThree myths

Миф:Myth: проверил данные — значит, дашборд верный.the data was checked — so the dashboard is right.
На самом деле:In fact: люди смотрят на HTML. Без пересборки и публикации правка до них не доходит.people look at the HTML. Without a rebuild and publishing the fix does not reach them.
Миф:Myth: правки удобнее хранить как «+» и «−».edits are easier to store as "+" and "−".
На самом деле:In fact: при слиянии и повторной загрузке изменения складываются дважды. Решения с ID — нет.on merging and reloading, changes add up twice. Decisions with an ID do not.
Миф:Myth: разослать дашборд по почте — тоже публикация.emailing the dashboard is publishing too.
На самом деле:In fact: через неделю у людей пять версий. Одна копия в общей папке — одна правда.a week later people have five versions. One copy in the shared folder — one truth.
24

Внедрение и что запомнить: отметьте галочкойRollout and what to remember: tick it off

25

Проверьте себяCheck yourself

26

Шпаргалка терминовGlossary

Pipelineконвейер обновления: загрузка → сборка → проверка → публикацияthe refresh chain: load → build → check → publish
Smoke testбыстрая проверка, что всё открывается и не падаетa quick check that everything opens and does not crash
Decision journalжурнал решений: новое значение, автор, время, причина, IDnew value, author, time, reason, ID
Soft deleteмягкое удаление: пометка вместо стиранияa mark instead of erasing
Audit trailслед правок: кто, что, когда, почемуwho, what, when, why
ChangelogCHANGES.md: строка «что изменилось» на каждую публикациюCHANGES.md: a "what changed" line per publication
Versioningдатированные копии, чтобы вернуться назадdated copies to go back to
Итог урокаLesson summary Дашборд живёт как газета: каждый выпуск собирается заново из проверенного. Одна кнопка — загрузка, сборка, проверка, публикация; ошибка шага останавливает цепочку. После любой правки — пересборка, проверка JSON её не заменяет. Правки людей — журнал решений с ID и автором: повтор не считается, удаление мягкое, в силе последняя. Выгрузки — числами, имя файла несёт все фильтры. Публикация — одна копия в общей папке с версиями и «что изменилось», без ключей в HTML. И визуальная проверка опубликованной копии — всегда. A dashboard lives like a newspaper: every issue is built anew from checked material. One button — load, build, check, publish; a step error stops the chain. After any fix — a rebuild; a JSON check does not replace it. People's edits — a decision journal with ID and author: a repeat does not count, deletion is soft, the latest is in force. Exports — as numbers, the file name carries all filters. Publishing — one copy in the shared folder with versions and "what changed", no keys in the HTML. And a visual check of the published copy — always.
Made on
Tilda