Сценарии «что если»
Сценарии «что если»: копия фрагмента для варианта сети — правка, расчёт и сравнение с основой.
Возможности
- «Новый сценарий» — копия выбранного фрагмента-основы под своим названием и с пояснением «Что проверяем (необязательно)». Копию видит и десктоп — как обычный фрагмент.
- Список сценариев: основа, дата, автор; флажок «Архив» показывает и архивные.
- «Отличия сети» — плитки по видам отличий (изменено, добавлено, удалено в сценарии; конфликт; изменения основы после создания сценария) и таблица: объект, поле «основа → сценарий». Щелчок по плитке оставляет в таблице только этот вид, перекрестие в строке показывает объект на карте. «Сравнить заново» перечитывает отличия.
- «Режим по расчётам» — два расчёта, основы и сценария: недотоп потребителей, «Стали недотоп», «Отключены (без расчёта)», перегруженные участки, расход потребителей с разницей к основе и список изменений; «Excel» выгружает сравнение.
- «Работать в сценарии» — на карте остаётся только копия, редактор правит её; «Показать основу» возвращает фрагмент-основу.
- «Перенести в основу» — предпросмотр (что изменится, конфликты, проверка связности), выбор по каждому конфликту «основа» или «сценарий», перенос одной операцией с «Отменить» в уведомлении.
- Значок архива — убрать сценарий в архив и вернуть; фрагмент-копия при этом остаётся.
Как это работает
Копия. Сценарий создаётся так же, как десктоп копирует фрагмент: объекты основы выгружаются в формат .tgid и загружаются новыми номерами в новый фрагмент. Запись о сценарии хранится в tgid_scenario, соответствие «объект копии → объект основы» и отпечаток каждой строки основы на момент создания — в tgid_scenario_object. Создание — одна операция журнала отмены топологии SCENARIO_CREATE; крупный фрагмент копируется до минуты.
Сравнение трёхстороннее. В момент создания копия равна основе. Если отпечаток строки копии не совпадает с сохранённым — объект правили в сценарии; если не совпадает отпечаток основы — объект правили в основе после создания; если оба — конфликт. Сравниваются те же колонки, что выгружает .tgid; ссылки переводятся в номера основы, поэтому новые номера копии отличием не считаются. В списке отличий — не больше 500 строк, числа на плитках — полные.
Режим по расчётам. Сценарий считается как любой фрагмент. Потребители сравниваются по узлу присоединения: располагаемый напор, теплообеспеченность (ниже 100 % — недотоп), расход сетевой воды. Участки — по расходу, скорости и удельным потерям. Заметными считаются изменения напора от 0,5 м, теплообеспеченности от 1 п. п., расхода участка от 1 т/ч и не меньше 5 %. Объект, который есть в расчёте основы, но не сценария, — «не рассчитан» (отключённая часть сети). По умолчанию берутся последний расчёт сценария и расчёт основы с той же температурой наружного воздуха и режимом; если они разные, окно предупреждает, что сравнение может быть некорректным.
Перенос в основу. Изменённые объекты основы получают значения сценария (у узлов и участков — вместе с геометрией), добавленные вставляются в основу новыми номерами, удалённые узлы и участки помечаются снятыми. Конфликты по умолчанию не переносятся. Изменения основы после создания сценария не трогаются. Перед записью — тот же перенос с откатом: отчёт и проверка правил связности области. Перенос — одна операция журнала отмены SCENARIO_MERGE.
Удаление сценария. Отдельной кнопки нет: сценарий с копией удаляет отмена операции создания («Отменить» редактора топологии или «История правок»), пока копию не правили; иначе — архив.
Что нужно для работы
- Смотреть сценарии, отличия и сравнение режима — любой вошедший; «Excel» — право «Выгрузки и отчёты».
- «Новый сценарий», архив — общее право «Импорт сети» и «Участки: Создание», включённая запись топологии на сервере (
TOPOLOGY_MUTATIONS_ENABLED=true,MUTATIONS_ENABLED=true). - «Перенести в основу» — предпросмотр с теми же правами; запись — права «Перемещение и изломы» и «Удаление» с охватом «все» для участков и узлов.
- Сравнение режима — расчёты обоих фрагментов: «Расчёт» выполняет фоновая очередь Celery сервера.
Шаги
Откройте «Инструменты» и наберите в поиске «Сценарии «что если»» — пункт выделен рамкой.

Нажмите пункт — откроется окно.

Выберите сценарий в списке слева: справа — его основа и отличия сети от основы (что изменено, добавлено, удалено). Перекрестие в строке показывает объект на карте.

Откройте вкладку «Режим по расчётам»: выберите расчёт основы и расчёт сценария — плитки покажут недотоп, перегрузку участков и расход потребителей с разницей к основе, ниже — список изменений. «Excel» выгружает сравнение.

Чтобы править копию, нажмите «Работать в сценарии» — карта переключится на фрагмент сценария; «Показать основу» возвращает исходный фрагмент.
Примеры
Копия Алматы: сценарий «Перспектива 2035 (+34.58 Гкал/ч)». Основа — «Маг. сети для расчета НС» (#74), копия — фрагмент #117. «Отличия сети»: 60 обобщённых потребителей «Изменено» — в копии подняты нагрузки, например отопление 1,211 → 1,510 Гкал/ч. «Режим по расчётам»: копия и основа посчитаны при tн −25 °C (расчёт сценария №2, основы — №3). Недотоп у 429 потребителей — как в основе, новых недотопов нет; перегруженных участков 67 — на 5 больше, расход потребителей 40,7 тыс. т/ч — на 522 т/ч больше. Изменений по участкам 556, в списке первые 300: например, участок №326200 — расход 218,8 → 255 т/ч, скорость 1,15 → 1,3 м/с. Без расчёта копии вкладка пишет «Сценарий ещё не рассчитан» — сначала выполните «Расчёт» для фрагмента-копии.
Та же копия: полный цикл на маленьком фрагменте. Сценарий от «СВЭР Толстого,6б» (#42) — копия из 14 узлов и 10 участков. Групповой установщик поставил шероховатость 1,5 мм десяти участкам копии; «Сравнить заново» — плитка «Изменено» 10, в строках «Паспорт участка» значение «2 → 1.5» (у поля шероховатости в окне пока нет русской подписи — показано имя поля базы tuberoughness). Предпросмотр переноса — «Паспорт участка: изменить 10», проверка связности без замечаний. После возврата значений и отмены создания сценарий и копия исчезли из списка.
Если не получается
- Вкладка «Режим по расчётам» пустая — нет расчёта основы или сценария: выполните «Расчёт» для обоих фрагментов.
- «Перенести в основу» неактивна — в сценарии нет правок.
- «Разная температура наружного воздуха…», «Разные режимы расчёта…» — выбраны несопоставимые расчёты; выберите расчёт основы с той же Tн и режимом.
- «Переносить нечего: правок сценария нет.» — правок нет или остались только конфликты, которые вы оставили за основой.
- У сценария пометка «копия удалена» — фрагмент-копию удалили (например, в десктопе); сценарий можно только убрать в архив.
- «Не удалось создать сценарий», «Не удалось сравнить сценарий с основой», «Не удалось подготовить перенос», «Отменить перенос нельзя» — с текстом ответа сервера: отмену не даёт, например, правка объектов после переноса.
- «Применение — права «Перемещение» и «Удаление» всех участков и узлов» — у пользователя нет охвата «все»; перенос делает тот, у кого он есть.
Для администратора
- Флаги:
MUTATIONS_ENABLED,TOPOLOGY_MUTATIONS_ENABLED. Таблицы сценариевtgid_scenario,tgid_scenario_objectсоздаёт миграцияsql/migrations/20261029_scenarios.sql. - Создание и перенос пишутся в журнал отмены топологии и
audit_log; после них сбрасываются кеши топологии и моделирования отключений. - Копии сценариев — обычные фрагменты: их видят десктоп, расчёт и выгрузки. Архив не удаляет копию.
Для разработчика
- API (
routers/scenarios.py; логика —database/scenarios.py,database/scenario_compare.py,database/scenario_merge.py, отчёт Excel —database/scenario_report.py):GET /api/v1/scenarios?include_archived=,POST /api/v1/scenarios(base_fileid,nameдо 60 символов,note),GET /api/v1/scenarios/{id}/diff?limit=,GET /api/v1/scenarios/{id}/compare?base_calculation_id=&scenario_calculation_id=,GET /api/v1/scenarios/{id}/compare.xlsx,POST /api/v1/scenarios/{id}/merge(dry_run,resolutions—{"таблица:id копии": "scenario"|"base"}),POST /api/v1/scenarios/{id}/status(active|archived). Отмена создания и переноса —POST /api/v1/topology/undo. - Веб:
components/ScenariosDialog.vue,components/ScenarioMergeDialog.vue,utils/scenarios.ts, запросы —services/api/fragments.ts. - Тесты: API —
tests/test_scenarios.py,tests/test_scenario_report.py; веб —tests/utils/scenarios.spec.ts; e2e —e2e/functions/source-data.spec.ts(«Сценарий «что если»»: создание из окна, правка копии, отличия, перенос в основу и его отмена из уведомления, удаление отменой создания).
