Схемы Что нового

Оборудование

NAS-серверы, коммутаторы, IPTV-приставки и настройки СОРМ — всё сетевое оборудование, которым управляет биллинг.

Модуль «Карта сети» — на сайте продукта
Содержание раздела

Оборудование

Раздел меню «Оборудование» объединяет всё сетевое и абонентское оборудование, через которое работает биллинг.

NAS

URL: /admin/equipment/Nas/

NAS (Network Access Server) — устройство, через которое клиент попадает в сеть: BRAS, MikroTik, коммутатор с авторизацией. Для биллинга это одновременно RADIUS-клиент (шлёт Access-Request и Accounting) и цель управляющих команд (CoA Disconnect, SSH). На проде 12 устройств.

Что такое NAS для биллинга

- NAS
  - Идентификация
    - IP и маска
    - RADIUS secret
    - Тип устройства
    - Организации
  - Роль RADIUS
    - Access-Request
    - Accounting
    - Пулы адресов
    - Параметры тарифа
  - Управление
    - CoA Disconnect
    - SSH fallback
    - Развёртывание конфигов
    - Перезапуск FreeRADIUS
  - Наблюдение
    - UP DOWN
    - Онлайн-сессии
    - Простой за сутки
    - SLA и алерты

Из этой карты следует главное: NAS — не просто запись в справочнике. Ошибка в secret рвёт авторизацию всем клиентам устройства, а неверный IP делает CoA бесполезным — команда уйдёт в никуда, и заблокированный клиент останется в сети.

Как проходит авторизация

flowchart LR
    AB["Клиент
подключается"] --> NAS["NAS"] NAS -->|"Access-Request
+ secret"| RAD["FreeRADIUS"] RAD --> CHK{"Клиент известен?
clients.conf"} CHK -->|"нет"| DROP["Пакет отброшен"] CHK -->|"да"| USR{"Учётка и
тариф есть?"} USR -->|"нет"| REJ["Access-Reject"] USR -->|"да"| BAL{"Баланс и
блокировки"} BAL -->|"заблокирован"| REJ BAL -->|"ок"| ACC["Access-Accept
+ IP + шейпер"] ACC --> SESS["Сессия в
USERS_RADIUSAUTH"] SESS --> ONL["Колонка «Онлайн»
в списке NAS"]

clients.conf генерируется из таблицы NAS при старте контейнера FreeRADIUS. Поэтому после добавления устройства или смены secret нужен перезапуск RADIUS — иначе новый NAS для демона не существует. Список сам показывает предупреждение, когда конфигурация изменилась.

Список устройств

Список NAS с KPI, чипами-фильтрами и колонкой организации
Список NAS с KPI, чипами-фильтрами и колонкой организации

Адрес установки сокращается многоточием: полный остаётся в подсказке. Так таблица помещается в экран без горизонтальной прокрутки — а она в списке оборудования особенно мешает, потому что взгляд идёт по строке до колонки «Состояние».

Мультиорганизация

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

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

Что видит сотрудник чужой организации
flowchart LR
    REQ["Запрос сотрудника"] --> T{"К чему обращается"}
    T -->|"список NAS"| OPEN["Виден весь
парк устройств"] T -->|"сессии, панель клиентов"| SCOPE["Фильтр по
организации клиента"] T -->|"отключить, IP, resync"| GUARD["Проверка клиента"] T -->|"перезапуск RADIUS"| PERM{"Админ сети?"} GUARD -->|"чужой"| E404["404"] GUARD -->|"свой"| DO["Действие выполняется"] PERM -->|"нет"| E403["403"] PERM -->|"да"| RST["Перезапуск"]

Ответ на чужого клиента — 404: одинаковая реакция на «нет такого» и «есть, но не ваш» не даёт перебором выяснить, какие клиенты существуют. Перезапуск RADIUS отвечает 403 — здесь скрывать нечего, а причина отказа должна быть понятной.

Карточка устройства

Карточка NAS — вкладка Основное с выбором организаций
Карточка NAS — вкладка Основное с выбором организаций

Шесть вкладок. Сверху — полоса статистики (активных / максимум / последняя авторизация) и чекбоксы организаций.

RADIUS
Карточка NAS — вкладка RADIUS
Карточка NAS — вкладка RADIUS

RADIUS secret — общий ключ с устройством; при несовпадении демон молча отбрасывает пакеты, и клиенты просто не авторизуются. CoA пароль и порт (по умолчанию 3799) нужны для команды Disconnect. Флаг «Не использовать CoA» переводит разрыв сессий на SSH-fallback — медленнее, но работает там, где CoA не включён.

Авторизация
Карточка NAS — вкладка Авторизация
Карточка NAS — вкладка Авторизация

Правила выдачи доступа: тип авторизации, привязка к MAC и порту, поведение при переподключении. Здесь же — «Отправлять подключение если заблокирован»: для схем с walled-garden, где заблокированного клиента пускают на страницу-заглушку вместо полного отказа.

IP-пулы
Карточка NAS — вкладка IP-пулы
Карточка NAS — вкладка IP-пулы

Пулы динамических и белых адресов, NAT, hotspot, DNS и «следующий NAS» для цепочек. Из этих пулов выдаётся адрес при авторизации; свободный ищет ip_allocation с проверкой занятости по трём источникам сразу.

Онлайн-сессии
Список онлайн-сессий устройства
Список онлайн-сессий устройства

Открывается кликом по числу в колонке «Онлайн». Поиск по логину, ФИО, договору и IP; подгрузка по мере прокрутки. Клик по имени открывает боковую панель клиента поверх списка — оператор смотрит карточку, не теряя разобранный список сессий.

Панель клиента поверх списка сессий
Панель клиента поверх списка сессий

Состояние NAS

URL: /admin/equipment/nas_status/

Дашборд состояния NAS с алертом, sparkline и SLA
Дашборд состояния NAS с алертом, sparkline и SLA

Страница для дежурного: что сейчас лежит и насколько это больно.

Обновление стоит дёшево: JSON отдаётся за ~24 мс при четырёх запросах к базе, поэтому режим «каждые 30 секунд» можно держать включённым весь день.

Опасные операции

Перезапуск FreeRADIUS перегенерирует clients.conf и поднимает демона заново. На эти секунды авторизация не работает на всей сети — новые подключения не проходят, действующие сессии не рвутся.

Поэтому операция спрятана в отдельное меню и доступна только администраторам сети: superuser и группам из настройки NAS_ADMIN_GROUPS (по умолчанию root,network). Остальным кнопка не показывается, а прямой запрос отвечает 403.

Признак «конфигурация изменена» появляется в списке автоматически после сохранения или удаления NAS — чтобы перезапуск не забыли.

Мобильная версия

Список NAS на телефоне
Список NAS на телефоне

На телефоне остаются три колонки: название, состояние и онлайн — то, ради чего в список заходят с телефона во время аварии. IP, RADIUS, SSH, адрес и время последней авторизации скрыты, горизонтальной прокрутки нет.

Список сессий на телефоне
Список сессий на телефоне

В списке сессий на телефоне остаются клиент и IP: номер строки и логин на 390 px только отнимают место. ФИО не переносится — иначе одна строка растягивалась на три-четыре ряда и список переставал читаться; полное имя доступно в подсказке.

Тёмная тема

Endpoints

URLМетодНазначение
/admin/equipment/Nas/GETСписок устройств
/admin/equipment/nas_status/GETДашборд состояния (?json=1 — данные для авто-обновления)
/admin/equipment/nas_status/export/GETИстория в CSV (?period=24h|7d|30d)
/admin/equipment/nas_modal/[<id>/]GET / POSTКарточка: чтение, сохранение, удаление
/admin/nas_api/<id>/online/GETОнлайн-сессии устройства (скоуп по организации клиента)
/admin/nas_api/<id>/abonents/GETПанель клиентов устройства (скоуп по организации)
/admin/nas_api/<id>/ping/POSTTCP-проверка доступности
/admin/nas_api/<id>/sync/POSTСинхронизация сессий
/admin/nas_api/abonent-disconnect/<id>/POSTРазрыв сессий клиента (проверка организации)
/admin/nas_api/allocate-ip/<user_id>/POSTВыдача свободного IP (проверка организации)
/admin/nas_api/restart-radius/POSTПерезапуск FreeRADIUS (только админы сети)

Кэш авторизаций (Redis fast-path для FreeRADIUS)

Виджет на дашборде «Состояние NAS». Решает проблему массового падения NAS: когда тысячи клиентов одновременно переавторизуются, FreeRADIUS не успевает обрабатывать пакеты из-за серии SQL-запросов на каждый Access-Request.

Без кэша один authorize() делал 5 SQL-запросов: Users + abonent + nas + NasRadiusParams + TarifRadiusParams + VpnConst, суммарно 5–15 ms на пакет. При 1000 пакетов/сек FreeRADIUS не успевал, очередь max_requests=16384 заполнялась за 16 сек, NAS retry'ил пакеты, БД захлёбывалась.

С кэшем: при штатной авторизации (не заблокирован, NAS назначен, IP в пуле) ответ строится из снапшота в Redis — 1 ms вместо 10 ms, SQL не выполняется. Эффективная capacity FreeRADIUS Python module растёт в 5–10 раз.

Архитектура
Fast-path vs Slow-path

Fast-path (новый, без БД) активируется только при штатных условиях: enabled=True, abonent_enabled=True, есть пароль и NAS, ip в пулах NAS. Иначе срабатывает slow-path с ORM — для блокированных клиентов (нужна логика soft-block), OPT82, auto-assign NAS/IP, cache miss. После успешного slow-path снапшот пишется в кэш для следующих пакетов.

flowchart LR
    REQ["Access-Request
от NAS"] --> CACHE{"Снапшот
в Redis?"} CACHE -->|"hit"| CHKFAST{"Штатные
условия?"} CACHE -->|"miss"| PWD{"Пароль
верный?"} CHKFAST -->|"да · fast-path 1 ms"| OK["RLM_MODULE_OK
+ Framed-IP
+ Rate-Limit"] CHKFAST -->|"нет"| PWD PWD -->|"нет"| REJ["REJECT"] PWD -->|"да · slow-path ~10 ms"| TARIF{"tarif_id?"} TARIF -->|"NULL"| REJT["REJECT
no tariff"] TARIF -->|"есть"| BLOCK{"Заблоки-
рован?"} BLOCK -->|"да"| SOFT["soft-block
блок-пул"] BLOCK -->|"нет"| WRITE["Снапшот → Redis
TTL 5 мин"] WRITE --> OK OK --> AB(("Клиент
в сети")) style REQ fill:#1e3a5f,stroke:#5BA89D,color:#fff style CHKFAST fill:#14532d,stroke:#16a34a,color:#fff style OK fill:#43b77a,stroke:#2d9a5f,color:#fff style REJ fill:#7f1d1d,stroke:#dc2626,color:#fff style REJT fill:#7f1d1d,stroke:#dc2626,color:#fff style SOFT fill:#78350f,stroke:#d97706,color:#fff style AB fill:#134e4a,stroke:#43b77a,color:#fff
Инвалидация

5 Django signals (post_save) сбрасывают соответствующие ключи:

МодельЧто сбрасывается
UsersСвой ключ
AbonentsВсе ключи учёток клиента
AbonentsBlockВсе ключи учёток клиента
NasRadiusParamsВсе ключи users этого NAS
TarifRadiusParamsВсе ключи users на этом тарифе

Дополнительно — TTL 5 минут гарантирует протухание даже без сигналов (защита от рассинхрона при ручном UPDATE через psql).

Метрики и UI

Виджет «Кэш авторизаций» на дашборде «Состояние NAS» показывает:

Endpoint: GET /admin/equipment/radius_cache_stats/ возвращает JSON с метриками. POST /admin/equipment/radius_cache_flush/ сбрасывает весь кэш (только superuser).

Реальная статистика рабочего сервера через 5 минут после деплоя при штатной нагрузке ~10–20 авторизаций/сек: hits=838, misses=92, hit ratio=90.1%. При hit ratio 90% среднее время authorize() снизилось с 10 ms до ~2 ms, эффективная пропускная способность выросла в ~5 раз без увеличения ресурсов.

RADIUS REJECT без тарифа

Защита от бесплатного интернета у клиентов без тарифа. До фикса клиент с Abonents.TARIF_ID=NULL авторизовывался в RADIUS, получал IP и нерезаную скорость канала (без Mikrotik-Rate-Limit). Параллельно billing_worker его не списывал — у клиента без тарифа нет связанных UsersUsluga.

Симметричная дыра: интернет работал бесплатно, пока кто-то не назначит тариф вручную.

Логика после фикса (radius_python/internet.py::authorize и _try_authorize_from_snapshot):

Quick Add (создание клиента) — валидация на billing/views/abonents.py::abonent_quick_add: поле «Тариф» помечено required, при пустом значении возвращается HTTP 400 с сообщением «Тариф обязателен — выберите тариф для нового клиента».

Management-команда зачистки «осиротевших»:

python manage.py disable_abonents_without_tariff --dry-run
python manage.py disable_abonents_without_tariff --apply

Команда находит активных клиентов с TARIF_ID IS NULL и блокирует их через ab.block(comment='Автоблок: нет назначенного тарифа', flags=['b_sys']). На рабочий сервер 2026-05-13 нашла 72 таких клиента (6 с активной RADIUS-сессией, суммарно ~12 ГБ нерезаного трафика).

Telegram-алерт (опционально): Celery beat-задача раз в час шлёт уведомление, если за последние 24 часа создан клиент с tarif_id IS NULL. Защита на случай если основной REJECT кто-то откатит.

В разделе «Диагностика связи» (карточка клиента) добавлена красная плашка «⚠ Тариф не назначен — RADIUS должен отклонять авторизацию» — оператор видит проблему сразу при открытии карточки.

Мониторинг оборудования

Оборудование → Мониторинг оборудования, URL /admin/equipment/monitoring/. Опрос управляемых коммутаторов по SNMP: состояние (в сети / не отвечает), число активных портов, история падений. Биллинг опрашивает устройства сам, раз в 5 минут, и присылает алерт в Telegram при падении.

Мониторинг оборудования — дашборд состояния коммутаторов
Мониторинг оборудования — дашборд состояния коммутаторов

Как это работает

Каждое устройство опрашивается по стандартному IF-MIB (ifOperStatus, ifSpeed, счётчики ошибок) через утилиты net-snmp. Результат — снимок состояния и событие в истории при смене «в сети ↔ не отвечает». Опрос идёт напрямую из сети сервера, дополнительного ПО на коммутаторах не требуется — достаточно включённого SNMP с community на чтение.

Дашборд состояния

Над таблицей — счётчики Всего / В сети / Не отвечают / Неизвестно. В таблице по каждому устройству:

Ниже — блок «Последние события» с историей падений и восстановлений (время, устройство, событие, длительность простоя).

Добавление устройства

Кнопка «Добавить устройство» открывает окно выбора коммутатора (показываются записи с заполненным IP, ещё не под мониторингом), SNMP community и интервал опроса. После добавления устройство попадает в очередь опроса автоматически.

Отображение на карте сети

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

MAC на портах (кто где подключён)

Кнопка «Снять MAC портов» читает у коммутатора таблицу MAC-адресов по портам и сопоставляет их с MAC-адресами клиентов в биллинге. Совпавшие записи показывают, на каком физическом порту (и в каком VLAN) подключён конкретный клиент. Точность зависит от того, насколько заполнены MAC-адреса в карточках клиентов.

Оптические линии (GPON) и радиосекторы

Сейчас мониторинг охватывает управляемые коммутаторы. Сбор оптического уровня сигнала с OLT (GPON-клиенты) и уровня радиосигнала с базовых станций (радиоклиенты) — следующие этапы; они требуют сетевого доступа сервера к этому оборудованию и доступа на чтение.

IPTV

Тот же список NAS, но отфильтрованный по типу оборудования IPTV-серверы: middleware и stream-серверы провайдера (TVIP Media, LFStream «Смотрёшка»).

IPTV
IPTV

Привязка пакетов IPTV к услугам биллинга настраивается отдельно — в разделе Настройки → IPTV-пакеты (см. 5.6).

Подробная документация — на отдельной странице

Настройка TVIP Media, LFStream и маппинга пакетов — в разделе Интеграция с оборудованием → IPTV.

Коммутаторы

Список всех коммутаторов в сети оператора. Записи используются для:

Коммутаторы
Коммутаторы

В списке доступны поиск, модальное добавление/редактирование/удаление. Колонка «Тип» показывает модель коммутатора (бренд + серия) и скрывается на мобильном.

Типы коммутаторов

Шаблоны типов коммутаторов: бренд, модель, число портов, наличие Opt82. Используется при создании коммутатора чтобы не вводить параметры вручную.

Типы коммутаторов
Типы коммутаторов

Настройки СОРМ

Список конфигураций выгрузки данных в СОРМ-3 на FTP-сервер РКН. Каждая конфигурация определяет: имя оператора СОРМ, FTP-сервер, расписание выгрузки, набор отчётов.

Настройки СОРМ
Настройки СОРМ

Подробная документация — на отдельной странице

Принцип работы СОРМ-3, список интегрированных решений, метаданные UserAttributes, pre-flight валидация и REST API готовности — в разделе Интеграция с СОРМ3.

Открыть документацию СОРМ

Карта сети

Интерактивная GIS-карта сети оператора на Leaflet: узлы (PoP / боксы / муфты / опоры / колодцы / шкафы / NAS), оптические трассы с классами (магистраль / распределение / абонентская), зоны покрытия, точки подключения, лиды CRM и клиенты биллинга, а также заявки Поддержки и мониторинг состояния NAS — всё на одном слоистом полотне. URL: /admin/equipment/netmap/. Меню: Оборудование → 🗺 Карта сети.

Обучающее видео 3:03

Слои тремя группами, поиск и ссылка на объект, карточка со статусом использования, правка с отменой и горячие клавиши, техвозможность заявок с «Закрепить», «Что заполнить», заявки и мониторинг NAS, карта на телефоне и три правила. Кадры — с демо-стенда.

1920×1080 с озвучкой Скачать
Карта сети: узлы-боксы, клиенты иконкой-человечком, тулбар редактора
Карта сети: узлы и клиенты (иконка-человечек) в режиме редактора — тулбар со слоями, «+» и Отменить/Вернуть

Слои и тулбар

Панель карты: слои со счётчиками, поиск и полосы фильтров
Панель карты: десять слоёв со счётчиками, поиск, мониторинг и полосы фильтров «Технология», «Лиды», «Клиенты»

Инструменты карты — в её правом верхнем углу, отдельной панелью поверх полотна: карандаш (режим редактора — рисование и перетаскивание объектов через Geoman: маркер = узел или бокс, линия = трасса, полигон = зона), кнопка «+» (добавить объект, только в режиме редактора), линейка (измерение расстояния по ломаной), «во весь экран» (вернуться к общему плану сети), Отменить/Вернуть (история правок редактора) и обновление данных без перезагрузки страницы. На телефоне те же кнопки остаются в мобильной панели.

Панель инструментов в правом верхнем углу карты
Панель инструментов в правом верхнем углу карты

Добавление объектов, Отменить/Вернуть

Кнопка «+» показывается только в режиме редактора (карандаш) и открывает список, что поставить на карту: Узел сети, Трасса, Зона, Опора. Выбор переключает инструмент рисования Geoman на нужный тип, без похода в меню слоёв.

Меню «+»: добавить узел сети, трассу, зону или опору
Меню «+»: что добавить на карту — узел, трасса, зона или опора

Рядом с «+» — пара Отменить / Вернуть: общая история правок редактора на все типы объектов разом (опоры, узлы, трассы, зоны), а не отдельная кнопка на каждый. Кнопки видны, пока в истории есть действия (правки опор пишут её и вне режима редактора), подсказка называет, что именно отменится. Удаление узла, трассы и опоры мягкое: «Отменить» прямо в уведомлении или Ctrl+Z возвращают объект целиком — с разваркой, волокнами, клиентами и вложением. Перемещение объекта — отдельная кнопка «Переместить» в подсказке узла или опоры (двигает один маркер) и у трассы (тянет всю линию целиком через Geoman layer-drag, а не правку отдельных вершин) — тоже попадает в общую историю.

Горячие клавиши. Ctrl+Z — отменить, Ctrl+Y — вернуть, / — поиск, E — режим редактора, M — линейка, Esc — выйти из любого режима (перемещение узла, трассы или опоры, привязка клиента, линейка, рисование). Пока идут запросы слоёв, вверху карты горит «Загрузка…»; при сбое сети — сообщение, а не пустая карта. Окна узла и трассы спрашивают, прежде чем закрыться с несохранёнными правками. Режим редактора, «+» и «Рестарт RADIUS» видят только те, кто может править карту.

Тулбар редактора: карандаш, «+», линейка, во весь экран, Отменить/Вернуть, обновить
Тулбар в режиме редактора: Отменить/Вернуть — справа от инструментов рисования

Перед сохранением узла или трассы — диалог с перечнем конкретных изменений (что именно поменялось), а не общее «Сохранить изменения?»: кнопка подтверждения неактивна, пока в форме ничего не поменялось.

Полосы фильтров под тулбаром

Под кнопками слоёв — полосы фильтров, каждая появляется вместе со своим слоем и исчезает, когда слой выключен:

Внизу карты — линейка масштаба и переключатель подложки («Как тема» / «Светлая» / «Тёмная»), не зависящий от темы интерфейса: на тёмной подложке хуже читаются названия улиц, и это отдельный выбор. Он запоминается.

Слой «Лиды»

Открытые сделки CRM, у которых выбран дом, — точками на карте сети. Цвет — этап воронки, как на карте лидов. В подсказке точки — название сделки, в карточке — этап, адрес, тариф, дата монтажа и монтажник, ответственный, телефон и вердикт техвозможности, кнопка «Открыть сделку». Слой виден тем, у кого есть доступ к разделу CRM, и только по организациям сотрудника.

Слой «Лиды» поверх трасс: цвет — этап воронки, над картой — полоса этапов и «Без дома»
Слой «Лиды» поверх трасс: цвет — этап воронки, над картой — полоса этапов и «Без дома»

Слой «Клиенты»

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

Слой «Клиенты»: кружки с числом клиентов поверх трасс, над картой — полоса статусов
Слой «Клиенты»: кружки с числом клиентов поверх трасс, над картой — полоса статусов

Клиенты, у дома которых неточная координата (улица или населённый пункт вместо дома), на слой не попадают — иначе они собрались бы в одну точку посреди улицы. Список таких адресов — по кнопке «Неточные адреса» и в разделе «Что заполнить».

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

Попап клиента на карте: узлы с цветными квадратными иконками и кнопкой отвязки
Попап клиента: статус, адрес, тариф и баланс, ниже — привязанные узлы с кнопкой «×» (отвязать)

Правило — один узел каждого типа на клиента одновременно: один бокс, одна муфта, одна ТП и так далее, но бокс и ТП — не конфликтуют и держатся оба сразу. Привязка делается кликом по узлу на карте в режиме «Привязать к узлу» (открывается из попапа клиента). Если у клиента уже есть узел этого же типа, повторная привязка не затирает её молча — диалог подтверждения с именем прежнего узла предупреждает, что это замена, и просит подтвердить. Отвязать узел можно и из попапа клиента (кнопка «×» у строки узла), и из вкладки «Клиенты» самого узла.

flowchart TD
  CLICK["Клик по узлу
в режиме «Привязать к узлу»"] --> CHECK{"Есть ли у клиента
узел ЭТОГО типа?"} CHECK -- "нет" --> LINK["Создать привязку"] CHECK -- "да, другой узел" --> CONFIRM["Диалог: заменить
«узел А» на «узел Б»?"] CONFIRM -- "подтвердил" --> REPLACE["Прежняя привязка удалена,
создана новая"] CONFIRM -- "отменил" --> KEEP["Остаётся как было"] LINK --> RESULT(["Один узел каждого типа
на клиента одновременно"]) REPLACE --> RESULT

Узлы разных типов различаются квадратной цветной иконкой — тот же приём, что у типов узлов сети в справочнике, применён сразу в трёх местах: заголовок сайдбара узла на карте, список привязанных узлов в попапе клиента и вкладка «Узлы» в карточке клиента (общий сайдбар AbDrawer, открывается из любого раздела биллинга — списка, поиска, карточки). Так один и тот же узел узнаётся с первого взгляда везде, где он показан.

Карточка клиента: вкладка «Узлы» с квадратными цветными иконками типа
Карточка клиента (AbDrawer) — вкладка «Узлы»: те же квадратные иконки, что и на карте

В обратную сторону — у самого узла есть вкладка «Клиенты» в боковой панели: таблица всех клиентов, привязанных к этому узлу (ФИО сокращено до «Фамилия И.О.» без переноса строки, цветной индикатор статуса, баланс, IP последней учётной записи). Под координатами узла в модалке редактирования — человекочитаемый адрес, полученный обратным геокодированием DaData по координатам узла; запрос ленивый (только при открытии формы правки) и кэшируется по координатам, не по id узла, — опора, которую подвинули, не покажет адрес с прежнего места.

Сайдбар узла: тип, координаты, вкладка «Клиенты» с таблицей ФИО/статус/баланс/IP
Сайдбар узла — вкладка «Клиенты»: ФИО, статус, баланс и IP всех привязанных абонентов

Откуда берётся каждый слой

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

flowchart LR
  KML["Выгрузка
Google Earth"] --> NODES["Узлы и трассы
NetworkNode, CableRoute"] ROSSETI["Договор с сетевой
организацией"] --> TP["ТП, линии ВЛ
и опоры поштучно"] NAS["Учёт оборудования
Nas, Switch"] --> EQ["Оборудование"] CP["Точки подключения
ConnectionPoints"] --> DOTS["Точки"] SUP["Поддержка
SupportConversation"] --> TICK["Заявки"] CRM["Сделки CRM
с выбранным домом"] --> DEALS["Лиды"] AB["Клиенты биллинга
карта клиентов"] --> ABON["Клиенты"] NODES --> MAP(["Карта сети"]) TP --> MAP EQ --> MAP DOTS --> MAP TICK --> MAP DEALS --> MAP ABON --> MAP MAP --> ORG{{"Скоуп
организации"}} ORG --> VIEW["То, что видит
сотрудник"]

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

Поле поиска в тулбаре ищет одновременно по узлам (название, комментарий), трассам (название, марка кабеля) и адресам клиентов — по улице, ФИО и номеру договора. Результаты сгруппированы значками, выбор центрирует карту и открывает карточку объекта; если объект лежит в выключенном слое, слой включается сам. Для адреса ставится временная метка — видно, куда именно попали. Список управляется с клавиатуры: стрелки, Enter, Escape; клавиша / ставит курсор в поиск с любого места карты.

Поиск по карте: узлы, опоры, адреса
Поиск по карте: узлы, опоры, адреса

Ссылка на объект. Адрес страницы меняется при выборе объекта: ?node=1222, ?route=87 или ?lat=&lon=&z=. Такую ссылку можно скопировать из строки браузера и отправить коллеге — она откроет карту сразу на нужном объекте с раскрытой карточкой. Если объекта нет или он выключен либо принадлежит другой организации, показывается сообщение. Из списка «Узлы и боксы» выключенный узел открывается на своём месте по координатам.

Карта помнит, где вы были. Включённые слои, центр и масштаб сохраняются в браузере и восстанавливаются при следующем заходе — не нужно каждый раз включать «Опоры» и доезжать до своего участка. Кнопка «Показать всю сеть» возвращает общий план. Ссылка на объект приоритетнее запомненного вида.

Измерение расстояния

Кнопка с линейкой включает режим измерения: клики по карте строят ломаную, длина считается нарастающим итогом и показывается в метрах или километрах. Двойной клик завершает измерение, ссылка «сбросить» очищает построенное. Инструмент считает расстояние по прямой между точками — для прикидки длины кабеля с запасом на провис это и нужно.

Измерение расстояния по карте
Измерение расстояния по карте

Импорт схемы из Google Earth

Если схема сети ведётся в Google Earth, её не нужно перерисовывать: выгрузка KMZ или KML загружается командой

manage.py import_netmap_kml --file "сеть.kmz" --org <ID организации> [--dry-run] [--fibers]
manage.py import_netmap_kml --purge-source kmz_smit34_map      # откат импорта

Точки становятся узлами, линии — трассами. Тип объекта и ёмкость кабеля определяются по названию, как их пишет инженер: «муфта оптическая» → муфта, «ТШ Мира 8» → уличный шкаф, «ТП-417» → подстанция, «48ОВ» в названии линии → 48 волокон. Команда идемпотентна: повторный запуск обновляет ранее импортированное, а не плодит дубли, поэтому карту можно переливать после каждой правки в Google Earth.

Фильтр по региону. В выгрузках Google Earth часто лежат демонстрационные метки («Тур по достопримечательностям» — Сидней, Париж, офис Google). Импорт берёт только объекты в границах области, иначе карта растянулась бы на весь мир.

Статус использования

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

Это основа инвентаризации подвеса: участок со статусом «не используем» либо исключается из договора с сетевой организацией, либо демонтируется — и то, и другое дешевле, чем платить за размещение.

Подстанции и договорные опоры

Два слоя описывают не нашу сеть, а чужую инфраструктуру, на которой она висит.

Обучающее видео 2:27

Позиции договора и сумма по ДС, реестр опор с выгрузкой, массовые действия с подтверждением, линии ВЛ, владельцы с договорами, сверка с «Не предлагать» и опоры на карте. С озвучкой. Этот же ролик — первый шаг знакомства с модулем на карте сети.

Реестр договорных опор

«Оборудование → Карта сети → Опоры «Россети»» (/admin/equipment/netmap/poles/) — договор на размещение с сетевой организацией таблицей: позиция, улица и населённый пункт, подстанция, линия ВЛ и напряжение, номера опор (список раскрывается), число опор, кабель, дата начала и плата в месяц. Итоги в шапке — число опор, подстанций и плата в месяц с НДС — совпадают с договором до копейки.

Реестр опор: итоги договора, срезы по напряжению, фильтры и позиции с номерами опор
Реестр опор: итоги договора, срезы по напряжению, фильтры и позиции с номерами опор

Линии ВЛ

Раньше линию ВЛ можно было только выбрать в форме опоры — завести новую или посмотреть, что на ней стоит, было негде. «Оборудование → Линии ВЛ» (/admin/equipment/netmap/lines/) — отдельный реестр линий: название, подстанция, напряжение, владелец, число опор на линии и число позиций договора. Поиск по названию и подстанции, фильтры по владельцу и напряжению.

Линии ВЛ: реестр с подстанцией, напряжением, владельцем и числом опор
Линии ВЛ: название, подстанция, напряжение, владелец, число опор и позиций договора

Если у линии указана ТП и хотя бы одна из её опор поставлена на карту (координата не черновая — «уточнена» инженером, GPS, кандидатом с трассы или импортом «Россетей»), слой «Опоры» рисует саму линию — провод: ломаную от подстанции через опоры по порядку номера, не как они лежат в базе. Номера опор сортируются по-людски («7/1» < «7/2» < «7/10» < «8»), а не по алфавиту, иначе на двузначных номерах провод прыгал бы туда-сюда.

Ответвления рисуются отдельно: опоры «13/1, 13/2» — отпайка от опоры 13, их линия начинается от неё, а магистраль идёт 12 → 13 → 14 без зигзага.

Линия ВЛ нарисована проводом от подстанции через опоры
Линия ВЛ как провод на карте — от подстанции через поставленные опоры этой линии

Провод рисуется только по опорам с уточнённой координатой — опоры, расставленные приблизительно (цепочкой вдоль улицы при массовой раскладке договора), в него не попадают: до уточнения места инженером линия просто короче. На демо-стенде расставлена только часть опор, поэтому большинство из 165 линий реестра пока не рисуются проводом — это ожидаемо, не ошибка; на карте выше показана ровно одна линия, для которой есть и подстанция, и уточнённая опора.

Опоры поштучно: расстановка на карте

Координат опор в реестре нет, поэтому их расставляют на карте. Со слоем «Опоры» и при приближении (масштаб 16 и крупнее) карта предлагает кандидатов — вершины наших трасс рядом с точкой улицы: излом воздушной трассы обычно приходится на опору. Если подключена карта инвентаризации, первыми идут опоры с неё — монтажники отметили их точно на месте, они коричневые. Клик по кандидату открывает выбор позиции договора и номера опоры, после сохранения опора встаёт на своё место. Опору, которой нет в договоре, отмечают отдельно: если рядом проходит наша трасса, она попадает в список «К оформлению».

Пролёты между поставленными опорами считаются на лету по трассам; полоса над картой показывает, сколько опор уже поставлено.

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

Слой «Инвентаризация»: карта монтажников из Яндекса

Монтажники отмечают опоры, PON-боксы, адреса подключений и линии в «Конструкторе карт» Яндекса — с телефона, прямо у опоры. Биллинг читает эту карту по ссылке и показывает её слоем «Инвентаризация» на карте сети. Ничего не переносится руками: что поправили в конструкторе, через несколько часов видно в биллинге.

Обучающее видео 2:04

Цвет метки, подпись и описание, линии, как метка попадает в биллинг и как подключить карту — для монтажников и инженеров. Этот же ролик открывает кнопка «Как это работает?» в полосе слоя «Инвентаризация» на карте сети.

1920×1080 с озвучкой Скачать
Слой «Инвентаризация»: опоры, линии ВЛ и оптика с карты монтажников
Слой «Инвентаризация»: коричневые точки — опоры, серый пунктир — ВЛ-0,4 кВ, красные линии — оптика, зелёные точки — адреса подключений

Вид объекта биллинг определяет по цвету метки в конструкторе и по подписи:

Метка в конструктореНа карте сети
Коричневая #793d0e, подпись — номер (13/6) или опОпора — кандидат для опор реестра
Тёмно-синяя #0e4779, «опора освещения», «0,4 дерево»Опора 0,4 кВ или освещения — тоже кандидат
Голубая #1e98ff, «пон бокс»PON-бокс
Зелёная #56db40 или красная #ed4543 с адресомАдрес подключения
Линия «ВЛ-0,4кВ №3» или серая #595959Линия ВЛ (пунктир)
Линия «оптика 8ов» или красная #ed4543Оптика

Над картой при включённом слое — полоса: «Как это работает?» (ролик выше), название карты, «Открыть в Яндексе» и «Как вести карту» (ведёт на правила ниже). Тем, кто может править карту сети, видны ещё «Обновить» — перечитать карту сейчас, не дожидаясь шести часов, — и «Ссылка на карту».

Подсказка у метки показывает подпись и описание из конструктора. Если на этом месте (ближе 3 м) уже стоит опора реестра, в подсказке — её номер и линия ВЛ. Если нет — напоминание, что опору реестра ставят в слое «Опоры».

Подсказки меток: опора уже в реестре и опора без пары
Слева — метка, на которой уже стоит опора реестра № 3 линии ВЛ-0,4кВ №3 ТП-278; справа — опора 13/1, пары в реестре пока нет
flowchart LR
    M["Монтажник у опоры
ставит метку"] --> Y["Конструктор карт
Яндекса"] Y -->|"раз в 6 часов
или «Обновить»"| B["Биллинг разбирает
цвет и подпись"] B --> L(("Слой
«Инвентаризация»")) B --> C(("Кандидаты мест
для опор реестра")) C -->|"подтвердил
сотрудник"| P["Опора реестра на месте
источник «Карта инвентаризации»"] P -.->|"± 3 м"| L style M fill:#78350f,stroke:#d97706,color:#fff style Y fill:#1e3a5f,stroke:#5BA89D,color:#fff style B fill:#134e4a,stroke:#43b77a,color:#fff style P fill:#43b77a,stroke:#2d9a5f,color:#fff

Как опора реестра встаёт на место. Когда в слое «Опоры» открыт выбор места, метки опор с карты инвентаризации идут первыми среди кандидатов, а метка с тем же номером, что у опоры реестра, — первой в списке. Место сохраняется с источником «Карта инвентаризации», его видно в карточке опоры и в списке опор. Сам биллинг без подтверждения ставил опоры один раз, при подключении карты, и только там, где совпали и номер, и линия ВЛ.

flowchart TD
    A["Опора реестра без места
номер · улица · линия ВЛ"] --> K["Кандидаты рядом с улицей:
метки карты инвентаризации
и вершины трасс"] K --> Q{"Есть метка
с тем же номером?"} Q -->|"да"| F["Она первая в списке"] Q -->|"нет"| S["Метки «оп» и вершины трасс —
выбор по расположению"] F --> OK["Сотрудник подтверждает"] S --> OK OK --> R["Координата = метка
источник «Карта инвентаризации»"] style A fill:#7048e8,stroke:#9775fa,color:#fff style F fill:#43b77a,stroke:#2d9a5f,color:#fff style R fill:#134e4a,stroke:#43b77a,color:#fff

Подключение карты. В конструкторе нажмите «Поделиться» и скопируйте ссылку (подойдёт и ссылка Яндекс Карт с um=constructor%3A…). На карте сети включите слой «Инвентаризация», нажмите «Ссылка на карту», вставьте ссылку и «Сохранить». Биллинг сразу загрузит карту и скажет, сколько на ней точек и линий; если карта не открылась, ссылка не сохраняется и остаётся прежняя. Смена карты записывается в журнал действий.

Полоса слоя «Инвентаризация» с полем ссылки на карту
Полоса слоя: «Открыть в Яндексе», «Как вести карту», «Обновить» и поле ссылки на карту конструктора

Биллинг только читает карту — в Яндекс он ничего не пишет. Если Яндекс не ответил, сутки показывается последняя загруженная копия. На демо-стенде карта не подключена: там слой пуст, пока не вставить ссылку на свою карту.

Как вести карту инвентаризации

От того, как подписана метка, зависит, найдёт ли биллинг нужную опору. Правила для тех, кто ставит метки в конструкторе:

  1. Одна метка — одна опора, точно на месте. Включите «Спутник» и приблизьте карту, чтобы видеть саму опору. Две метки рядом — это две опоры.
  2. Цвет — из палитры конструктора, по таблице выше. Другие цвета попадут в «Другое» и кандидатами не станут.
  3. Подпись опоры — только номер: 13/6, 58, 17а. Можно с «№» или «оп.» — их биллинг отбросит. Дробь — только через /: 13-6 и 13.6 не распознаются. Нет номера — подпишите оп.
  4. В описание — линия и подстанция (ВЛ-0,4кВ №3 ТП 403), материал, особенности («за забором»). Описание видно в подсказке на карте сети.
  5. PON-бокс — подпись «пон бокс», в описании делитель и порты: делитель 1/8, 1: 7569.
  6. Линии рисуйте от опоры к опоре, узлы — на метках. Подпись ВЛ — ВЛ-0,4кВ №3, второй строкой пролёт 4 - 2/9; оптика — оптика 8ов.
  7. Снятую опору удаляйте, повторно таблицу Excel не импортируйте — появятся дубли всех меток.

Подробная памятка для монтажников с примерами — в разделе «Отчёты разработки → Документация» биллинга: «Карта инвентаризации опор в Яндекс Картах».

Опоры списком: фильтры и работа с выделенными

Отдельная страница «Оборудование → Опоры» (/admin/equipment/netmap/poles_list/) показывает опоры по одной, а не позициями договора: номер, линия и подстанция, улица, владелец, статус, координата и то, как она получена. Фильтры — по владельцу, статусу, линии и наличию координаты; поиск идёт по номеру опоры, улице и линии. Набор колонок каждый настраивает под себя, он запоминается в профиле сотрудника.

Опоры списком: срезы, фильтры и колонки
Опоры списком: срезы, фильтры и колонки

Отметив опоры, можно разом сменить владельца, статус или линию либо удалить их. После такой правки час доступна отмена — она возвращает прежние значения, если статус поставили не тем опорам. Отдельную опору правят в её окне: номер, линия, владелец, статус, координата и примечание; то же окно открывается с карты кнопкой «Изменить» в подсказке опоры.

В окне опоры на карте есть блок «Фото»: «Загрузить фото» (с телефона снимок можно сделать камерой прямо у опоры), «Заменить» и «Убрать». Снимок сохраняется сразу, без кнопки «Сохранить», и лежит в закрытом хранилище — открыть его можно только после входа в биллинг. Принимаются JPG, PNG, WEBP и HEIC до 15 МБ. В списке опор у такой опоры рядом с номером значок камеры.

Массовая смена владельца, статуса или линии спрашивает подтверждение с числом опор, а в журнал каждой опоры пишется своя строка. Опоры договора не удаляются и не меняют номер и линию. Номер, введённый вручную, приводится к виду реестра («13 п 1» → «13п/1»), номера сортируются как числа: «2» раньше «10». Координата в строке открывает опору на карте, Excel и CSV выгружают текущий отбор. «Добавить опору», меню строки и массовые действия видны только редакторам карты. Опора, поставленная ближе 2 м к другой, получает предупреждение «не одна ли это опора».

Владельцы опор и их договоры

Опоры принадлежат не только сетевым организациям — кроме электросетевых компаний, городского электротранспорта и наружного освещения встречаются СНТ, предприятия и частные линии. Крупных владельцев немного и они постоянны, мелких много и заводить их приходится по ходу работы, поэтому справочник (/admin/dictionary/pole_owners/) двухуровневый: у владельца «Прочие» живут «СНТ Рассвет» и подобные, и общий список не разрастается.

Карточка владельца: цвет метки, договор и допсоглашения
Карточка владельца: цвет метки, договор и допсоглашения

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

К владельцу прикладывают сам договор и всё, что подписали к нему позже: допсоглашения и прочие документы. У каждого файла свой вид, номер, даты подписания и окончания — истёкший срок в списке помечен, чтобы перед согласованием подвеса было видно, действует ли договор сейчас. Файлы (PDF или снимок, до 25 МБ) лежат в закрытом хранилище и открываются только из биллинга, по ссылке с ограниченным сроком: договор с реквизитами контрагента не должен оказаться в открытом доступе.

Типы узлов сети: свой значок и цвет

Раньше вид узлов на карте был задан в самой странице, и добавить свой тип без разработчика было нельзя. Теперь это справочник (/admin/dictionary/net_node_types/): у каждого типа своё название, значок и цвет, а также подпись для ёмкости — у муфты считают волокна, у шкафа порты. Карточка раскрывается, значок и цвет выбирают из общего набора, правки видны на карте сразу.

Типы узлов сети со значком и цветом
Типы узлов сети со значком и цветом

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

Сверка опор

«Сверка» (/admin/equipment/netmap/poles/reconcile/) сравнивает статус поставленных опор с нашими трассами: наша трасса проходит ближе 15 м к опоре (расстояние меряется до линии кабеля, а не до точек её изгиба) — наш кабель висит на этой опоре.

Сверка опор: сколько поставлено, изменение платы и три списка
Сверка опор: сколько поставлено, изменение платы и три списка

Что заполнить

«Что заполнить» (/admin/equipment/netmap/checklist/) собирает в одном месте всё, без чего карта, проверка техвозможности и план выездов работают вполсилы: дома в открытых заявках, точные координаты домов клиентов, ёмкость боксов и шкафов, подстанции реестра на карте, адреса в обращениях, статус трасс, график монтажников, сверку номеров опор с их количеством и расстановку опор. У каждой проверки — процент готовности; раскрытая строка показывает до 100 объектов со ссылками, где исправить. На отдельную проверку можно дать ссылку вида #ck-<ключ>. Ссылки ведут в уже отобранные списки — «Боксы без ёмкости», «Трассы без статуса»; заявки без дома считаются тем же отбором, что в техвозможности.

Что заполнить: проверки с процентом готовности
Что заполнить: проверки с процентом готовности

Техвозможность заявок

Каждая открытая заявка CRM с домом получает вердикт по карте сети: можно ли её подключить и что для этого нужно. Вердикт ставится сам, когда в сделке выбирают или меняют дом, и хранится в системном доп. поле сделки «Техвозможность», пояснение — в поле «Техвозможность — почему». Его видно в карточке сделки, в попапе слоя «Лиды» и в обзвоне.

flowchart TD
    D["Заявка с домом"] --> C{"В доме уже есть
клиенты?"} C -- да --> OK["Можно"] C -- нет --> R{"Дом только
в зоне радио?"} R -- да --> OK R -- нет --> B{"Бокс или шкаф
ближе 50 м?"} B -- да --> OK B -- нет --> L{"Бокс до 150 м
и наша линия у дома?"} L -- да --> OK L -- нет --> F{"Бокс до 500 м?"} F -- да --> P["Можно с новыми опорами
опора на каждые 50 м отвода"] F -- нет --> Z{"Зона покрытия
или наша линия рядом?"} Z -- да --> I["Нужен осмотр"] Z -- нет --> N["Нельзя"] D -. "дома нет" .-> NA["Нет адреса"] style OK fill:#43b77a,stroke:#2d9a5f,color:#fff style P fill:#0f766e,stroke:#43b77a,color:#fff style I fill:#d97706,stroke:#b45309,color:#fff style N fill:#b02a37,stroke:#dc2626,color:#fff style NA fill:#64748b,stroke:#475569,color:#fff

Страница «Оборудование → Карта сети → Техвозможность» (/admin/equipment/netmap/tech/): сводка, заявки по вердиктам с пояснением и срез «Где не хватает сети» — сколько заявок ждёт у каждого бокса и на каких улицах сети нет вовсе.

Техвозможность: сводка и срезы по вердиктам
Техвозможность: сводка и срезы по вердиктам
«Где не хватает сети»: заявки у боксов и улицы без сети — где строить
«Где не хватает сети»: заявки у боксов и улицы без сети — где строить

Заявки без дома

Заявка без дома не попадает ни на карту, ни в проверку, ни в план выездов. В срезе «Нет адреса» кнопка «Найти дома по тексту заявок» ищет адрес там, где его обычно оставляют: у клиента сделки, в заметке «Адрес: …», в названии и комментарии; координаты из текста переводятся в ближайший дом. Принимается только дом с номером.

Где строить сеть: отчёт раз в неделю

В «Своих отчётах» есть отчёт «Где заявкам не хватает сети (техвозможность)» — заявки, которым нужен осмотр, новые опоры или подключить нельзя, по организациям, районам и улицам, с числом новых за неделю. Его удобно отправлять в рабочий чат раз в неделю: см. параметр «Организация» и отчёты по расписанию.

Зоны покрытия и технологии

Зона покрытия — полигон с указанием технологии абонентской линии: оптика, радио, медь, медь / оптика, «для бизнеса». Технология задаётся отдельным полем, а не подписью, поэтому по ней можно фильтровать карту.

Под тулбаром выводится легенда-фильтр: чип на каждую технологию с её цветом и числом зон. Клик по чипу убирает группу с карты — удобно, чтобы посмотреть, например, только радиопокрытие. Легенда появляется вместе со слоем «Зоны» и прячется вместе с ним. При наведении на полигон всплывает подсказка «название · технология».

Легенда-фильтр зон по технологии
Легенда-фильтр зон по технологии

Перенос из Конструктора Яндекс.Карт. Если карта покрытия велась в Конструкторе, её объекты переносятся командой manage.py import_yandex_zones --um <ID> --org <N> --apply. Без --apply команда только показывает, что будет создано. Технология определяется по подписи полигона — именно по абонентской линии: «аплинк радио, абонентская линия оптика» попадёт в «оптику», потому что подключаемость адреса определяет последняя миля, а не аплинк. Повторный запуск с --replace перезаливает ту же карту.

Оптические волокна и трассировка

Трасса хранит структуру кабеля по стандарту TIA-598 (модули × волокна), панель свойств показывает разварку (splice) на муфтах и узлах. Поддерживается трассировка пути волокна от точки к точке — подсветка участков на карте. Трассировка проходит все ветки сплиттера и обе стороны от узла. Разварка создаётся только в узле на линии трассы и без повторов; удаление разварки освобождает волокна и убирает только свою строку.

Волокна и разварка
Волокна и разварка
Трассировка пути волокна
Трассировка пути волокна

Заявки Поддержки на карте

Слой «Заявки» накладывает геопривязанные тикеты Поддержки СмИТ Биллинг. Клик по маркеру открывает панель тикета: ответ клиенту, Нейроответ (AI-черновик), внутренняя заметка, назначение ответственного, а также drawer карточки клиента. Та же панель работает на карте клиентов.

Вложения. Снимки открываются просмотрщиком прямо в панели: стрелки на экране и клавиши ← → листают вложения заявки, счётчик показывает «N из M», Esc закрывает, кнопка «Скачать» отдаёт оригинал. Раньше клик уводил на отдельную вкладку с голой картинкой, и к следующей приходилось возвращаться назад. Файлы (PDF, таблица, документ, архив) выводятся со значком своего формата — до этого на всём висела скрепка.

Просмотрщик снимков заявки: стрелки листания и счётчик «1 из 5»
Снимок из переписки открыт в панели: стрелки листают вложения, счётчик показывает номер

Прошлые обращения. Список под шапкой открывает выбранную заявку в этой же панели, а в шапке появляется стрелка возврата к предыдущей. Ctrl+клик по-прежнему открывает заявку в новой вкладке раздела Поддержки.

Список прошлых обращений клиента в панели заявки
Прошлые обращения клиента — с номером, темой и датой
Открытое прошлое обращение со стрелкой возврата в шапке
Открытое прошлое обращение: слева от номера — стрелка возврата
Заявки на карте
Заявки на карте
Панель заявки
Панель заявки

Мониторинг NAS

Включённый «Монитор» подсвечивает аварийные NAS, в панели узла доступны действия Ping, Синхронизация, Рестарт RADIUS и список онлайн-клиентов. «Рестарт RADIUS» перезапускает RADIUS целиком, поэтому кнопка есть только у редакторов карты.

Мониторинг NAS на карте
Мониторинг NAS на карте

Слои и источники данных

flowchart LR
    KMZ["Google Earth
KMZ / KML"] -->|"import_netmap_kml"| MAP MAP["Карта Leaflet
10 слоёв"] --> N(("Узлы /
оборуд.")) MAP --> R(("Трассы
(волокна)")) MAP --> Z(("Зоны
покрытия")) MAP --> TP(("ТП и опоры
электросетей")) MAP --> CP(("Точки
подключения")) MAP --> TK(("Заявки
Поддержки")) MAP --> MON(("Монитор
NAS")) MAP --> LD(("Лиды
CRM")) MAP --> AB(("Клиенты
биллинга")) N -->|"редактор"| EDIT["Geoman
CRUD + drag"] R -->|"клик"| FIB["Панель волокон
splice · трассировка"] TP -->|"клик"| DOC["Схема и договор
номера опор"] TK -->|"клик"| TPANEL["Панель тикета
ответ · AI · заметка"] MON -->|"клик NAS"| NAS["Ping · Sync ·
Restart · онлайн"] LD -->|"вердикт"| TECH["Техвозможность
можно · опоры · осмотр · нельзя"] TP -->|"поштучно"| POLES["Реестр · расстановка
сверка опор"] style KMZ fill:#0f766e,stroke:#43b77a,color:#fff style MAP fill:#134e4a,stroke:#43b77a,color:#fff style FIB fill:#1e3a5f,stroke:#5BA89D,color:#fff style DOC fill:#7048e8,stroke:#9775fa,color:#fff style TPANEL fill:#78350f,stroke:#d97706,color:#fff style NAS fill:#7f1d1d,stroke:#dc2626,color:#fff style EDIT fill:#43b77a,stroke:#2d9a5f,color:#fff style TECH fill:#0f766e,stroke:#43b77a,color:#fff style POLES fill:#7048e8,stroke:#9775fa,color:#fff

Связи объектов карты

Узел — универсальный объект с координатами. Он может быть «геопаспортом» уже учтённого оборудования (тогда ссылается на NAS, коммутатор, точку подключения или адрес), либо самостоятельным инфраструктурным объектом (муфта, опора, колодец).

erDiagram
    NETWORK_NODE ||--o{ CABLE_ROUTE : "откуда / куда"
    NETWORK_NODE ||--o{ FIBER_SPLICE : "разварка в узле"
    NETWORK_NODE ||--o{ COVERAGE_ZONE : "покрытие узла"
    NETWORK_NODE }o--|| NAS : "геопаспорт"
    NETWORK_NODE }o--|| SWITCH : "геопаспорт"
    NETWORK_NODE }o--|| HOMES : "адрес"
    NETWORK_NODE }o--|| CONNECTION_POINT : "точка подкл."
    CABLE_ROUTE ||--o{ FIBER : "волокна кабеля"
    FIBER }o--|| ABONENTS : "кому заведено"
    FIBER ||--o{ FIBER_SPLICE : "сварка A/B"
    COVERAGE_ZONE }o--|| NAS : "покрытие NAS"
    ORGANIZATION ||--o{ NETWORK_NODE : "принадлежит"
    ORGANIZATION ||--o{ CABLE_ROUTE : "принадлежит"
    ORGANIZATION ||--o{ COVERAGE_ZONE : "принадлежит"

Справочники значений:

Карта раздела

- Карта сети
  - Слои
    - Узлы
    - Оборудование
    - Трассы
    - Зоны покрытия
    - Подстанции
    - Договорные опоры
    - Точки подключения
    - Заявки Поддержки
    - Лиды CRM
    - Клиенты биллинга
  - Навигация
    - Поиск по узлам и адресам
    - Ссылка на объект
    - Запоминание вида
    - Измерение расстояния
  - Данные
    - Импорт из Google Earth
    - Статус использования
    - Идемпотентный перезалив
  - Оптика
    - Волокна TIA-598
    - Разварка в узлах
    - Трассировка пути
    - Статусы занятости
  - Зоны
    - Технология линии
    - Легенда-фильтр
    - Импорт из Яндекс.Карт
  - Эксплуатация
    - Мониторинг NAS
    - Ping и синхронизация
    - Рестарт RADIUS
    - Онлайн-клиенты
  - Опоры и заявки
    - Реестр договора
    - Расстановка опор
    - Сверка и списки
    - Что заполнить
    - Техвозможность
    - Поиск домов по тексту
  - Доступ
    - Просмотр всем сотрудникам
    - Правка root и network
    - Изоляция по организации

Права и разграничение по организациям

Просмотр карты доступен любому сотруднику, правка топологии — нет. Создавать, менять и удалять узлы, трассы, зоны, волокна и разварки могут только суперпользователь и группы из настройки NETMAP_ADMIN_GROUPS (по умолчанию root,network). Удаление мягкое: узел или трассу «Отменить» возвращает целиком — с разваркой, волокнами и клиентами. Переписку заявок, карточки и баланс клиентов в панели карты видят только те, у кого есть доступ к разделам «Поддержка» и «Клиенты». Схемы и фото узлов и трасс лежат в закрытом хранилище и открываются только после входа в биллинг.

Мультиорганизационность. Узлы, трассы и зоны хранят организацию, и карта показывает сотруднику только то, что входит в его разрешённые организации. Кеш слоёв разделён по этому же признаку, поэтому сотрудник одной организации не может получить закешированный ответ, собранный для другой. Ограничение действует не только на карте: списки «Узлы и боксы» и «Трассы связи», поиск, а также обращение к объекту по прямой ссылке (открытие, правка, удаление, волокна, разварка, трассировка) проверяют принадлежность — чужой объект отвечает «не найдено». Объект по ссылке открывается по правам сотрудника, а не по организации, выбранной в шапке; списки и поиск — по шапке. Журнал правок карты пишется с организацией объекта. Волокно наследует организацию от трассы, разварка — от узла, в котором сварена.

Если у организации своей сети на карте ещё нет, вместо пустого поля показывается подсказка с предложением загрузить схему из Google Earth или нарисовать её в режиме редактора.

Карта без объектов: подсказка вместо пустого поля
Карта без объектов: подсказка вместо пустого поля

Тёмная тема и адаптив

При тёмной теме интерфейса карта становится тёмной: подписи остаются русскими, трассы и узлы сохраняют цвета, zoom-контролы и легенда адаптированы. Подложку можно закрепить независимо от темы переключателем «Как тема / Светлая / Тёмная» — на тёмной подложке хуже читаются названия улиц, и при разборе адресов удобнее светлая карта в тёмном интерфейсе. Всплывающие подсказки маркеров, плашка мониторинга и чипы волокон в тёмной теме тоже тёмные.

На телефоне карте отдан почти весь экран: сводка, поиск, фильтр технологий и легенда переезжают в панель «Фильтры», а в тулбаре остаются только иконки — монитор, редактор, измерение, «вся сеть», обновление и лупа поиска; кнопки не меньше 44 px. Карточка объекта раскрывается во весь экран, как остальные слайд-панели системы.

Карта сети на телефоне
Карта сети на телефоне

Без PostGIS — координаты и геометрия хранятся в JSONField, расстояния считаются по формуле гаверсинуса. Раздел лицензируется модулем netmap.