---
type: data-requirements
work_item_id: ET-005
title: "Требования к данным — ET-005: Переключение единиц измерения (км/мили)"
version: 1
status: approved
created_at: 2026-05-21
authors:
  - "agent:architect"
---

# Требования к данным — ET-005

## 1. Резюме

ET-005 не вводит и не изменяет ни одной серверной структуры данных.
Единственное «данное» фичи — пользовательская UI-настройка выбранной
единицы измерения, хранимая на клиенте.

## 2. Серверные данные

| Аспект | Требование |
|--------|------------|
| Изменения схемы SQLite/Spatialite | Нет |
| Новые таблицы / колонки / индексы | Нет |
| Миграции (`migrations/`) | Нет |
| Изменения контракта API | Нет — расстояния и далее отдаются в **метрах** |

## 3. Каноническая единица расстояния

- Внутренняя каноническая единица системы — **метр**. Backend отдаёт
  `route.distance_m` (метры); линейка во фронтенде оперирует километрами
  (`rulerTotal`).
- ET-005 **не меняет** ни хранимые, ни передаваемые значения. Перевод в
  мили выполняется **только в момент форматирования строки для UI**
  (`Units.formatDistance()`).
- Запрещено хранить в рантайм-состоянии значения, конвертированные в
  мили — это исключает накопление ошибок округления при многократном
  переключении (ФТ-3 ТЗ, AC-2, тест TP-04).

## 4. Клиентское хранилище

| Параметр | Значение |
|----------|----------|
| Механизм | `localStorage` |
| Ключ | `distance_unit` |
| Допустимые значения | `'km'`, `'mi'` |
| Значение по умолчанию | `'km'` (при отсутствии ключа или некорректном значении) |
| Объём | ≈ 2 байта полезной нагрузки на браузер |
| Запись | при переключении (`Units.setUnit()`) |
| Чтение | при инициализации модуля `units.js` |

Ключ согласуется с уже сложившейся в проекте конвенцией UI-настроек в
`localStorage` (`enduro-theme-mode`, `terrain-*`, `trails-*`,
`poi-visible`).

## 5. Константы и точность

| Параметр | Значение |
|----------|----------|
| Коэффициент перевода | `1 km = 0.621371 mi` (`Units.KM_TO_MI`), единственное место объявления |
| Точность по умолчанию | 1 знак после запятой (AC-2) |
| Параметризация точности | `formatDistance()` принимает `precision`, чтобы сохранить существующую точность карточек маршрутов (`toFixed(0)`) — см. `10-tech-risks.md`, R5 |
| Разделитель дробной части | Привести к единому виду; сейчас в `app.js` есть расхождение (`.` и `,`) — см. `10-tech-risks.md`, R4 |

## 6. Персональные данные

Персональные данные (PII) отсутствуют. `distance_unit` — обезличенная
UI-настройка, не покидает браузер пользователя, не логируется на
backend.

## 7. Вывод

Серверных данных, схем и миграций ET-005 **не затрагивает**. Единственная
единица данных — клиентский флаг `localStorage:distance_unit`. Требований
к резервному копированию, ретенции и приватности не возникает.
