Руководство администратора — Версия 2.16.1
Административная панель управляет:
- ФСНБ-2022 — загрузка ZIP-архивов от Минстроя, активация версий, навигация по каталогу
- Индексами цен — импорт XLSX от ФГИС ЦС, ручной и автоматический (робот), ночное автообнаружение квартала
- Справочниками — кварталы, страны, регионы, ед. изм., ставки НДС, характеристики, обоснования коэффициентов
- Привязкой НР и СП — сопоставление нормативов с работами
- Шаблонами отчётов и НПА документами
- ИИ-ассистентом — чаты пользователей, телеметрия подбора, модели ИИ и расходы
- Разметкой и качеством подбора — характеристики ФСНБ деревом, RAG-примеры, оценка качества, Профи.ру
- Пользователями — список зарегистрированных, признак «Эксперт», обращения, статистика
- Тестированием — запуск автоматических сценариев из админки (на тестовом контуре)
Содержание
- 1.Вход в систему
- 2.Главная и навигация
- 3.ФСНБ
- 4.Импорт ФСНБ
- 5.Привязка НР и СП
- 6.Индексы цен
- 7.Робот загрузки ИЦ
- 8.Справочники
- 9.Технологические группы
- 10.Шаблоны отчётов
- 11.НПА документы
- 12.Обращения пользователей
- 13.Пользователи
- 14.Тестирование
- 15.Документация
- 16.Чаты пользователей
- 17.Телеметрия подбора
- 18.Модели ИИ и расходы
- 19.Разметка ФСНБ (характеристики)
- 20.Оценка качества подбора
- 21.Профи.ру
- 22.Продуктовая аналитика (Метрика)
- 23.Мониторинг сервисов (Prometheus и утренняя сводка)
- 24.Файлы пользователей
- 25.Каталог работ (только просмотр)
- 26.Робот цен каталога
- 27.Выпуск справочника
- 28.Журнал действий и использование
1. Вход в систему
Административная панель — https://smeta.net.ru (рабочий
контур) или https://smeta-admin-test.softlancer.ru
(тестовый).
1.1. Форма входа
| Поле | Описание |
|---|---|
| Логин | имя администратора (например admin) |
| Пароль | пароль администратора |
Кнопка: «Войти» — заблокирована при пустых полях или во время запроса; во время загрузки показывает индикатор. При неверных учётных данных под полем появляется красное сообщение.
1.2. Учётные данные
Учётные записи администраторов создаются вручную в системе. В админке нет формы регистрации — администратор не саморегистрируется. Для создания нового администратора обратитесь к ответственному за инфраструктуру.
1.3. После входа
Система запоминает вас — повторное открытие сразу попадает в кабинет (если не выходить через «Выйти»).
Открывается главная страница — статистика по системе и быстрые ссылки на разделы. Выход — кнопка «Выйти» в нижней части бокового меню.
1.4. Сессия
Срок жизни сессии — 24 часа.
Если сессия перестала действовать (истёк срок, сменился секретный ключ сервера, вышло обновление админки, авторизация отозвана), приложение само возвращает на форму входа при первом же обращении к серверу — открытая вкладка не остаётся в нерабочем состоянии и обновлять страницу вручную (F5) не требуется. Над полями входа появляется нейтральное сообщение:
ⓘ Сессия завершена. Войдите ещё раз.
Особенности сообщения:
- показывается один раз — после успешного входа или ручного обновления страницы исчезает;
- не появляется при обычном выходе по кнопке «Выйти» и в соседних вкладках;
- если при повторном входе введён неверный пароль, вместо него показывается обычная красная ошибка входа — два сообщения одновременно не выводятся.
Возврат на форму входа работает на любом экране админки, включая скачивание файлов НПА (глава 11) и просмотр хода прогона в разделе «Eval» (глава 20).
1.5. Безопасность
- Соединение всегда по HTTPS.
- Передача авторизации защищена и подписана секретным ключом сервера.
- Если у администратора в системе сменился пароль, активные сессии остаются действительными до истечения 24 часов.
- Защита от подбора пароля (версия 2.8.0). Запросы к форме входа ограничены: не более 120 в минуту с одного сетевого адреса (плюс всплеск до 20 сверх). При превышении форма получает отказ с текстом «Слишком много попыток. Повторите позже.» — ограничение временное, снимается само; достаточно подождать минуту. Учётная запись при этом не блокируется — блокировки администратора в системе нет.
- Ограничение действует только на адрес
/api/auth/…; работа в уже открытой сессии (списки, отчёты, выгрузки) им не затрагивается. - Для админки это единственный рубеж защиты входа: учётного счётчика попыток здесь нет. Ослаблять порог (обращение к ответственному за инфраструктуру) — значит снимать защиту входа целиком, а не «смягчать второй рубеж». Ориентир: атака 21.08.2026 шла на пике 600 запросов в минуту — текущий порог режет её впятеро.
- При плановой смене секретного ключа сервера все ранее выданные сессии становятся недействительными сразу. Открытые вкладки админки вернутся на форму входа при следующем действии (см. 1.4) — специальных указаний пользователям давать не нужно.
- Рабочая и тестовая админки разделены. Авторизация действует только в том контуре, где вы вошли: вход в тестовую админку не даёт доступа к рабочей и наоборот — даже если логин и пароль совпадают. В каждом контуре нужно входить отдельно.
- По этой же причине ссылку, полученную в одной админке (например, на скачивание файла НПА), нельзя открыть в другой — в чужом контуре она вернёт отказ. Работайте с каждым контуром в своей вкладке.
- Пароль администратора нигде не публикуется — он хранится в защищённом хранилище проекта. Если пароль неизвестен или утрачен, его выдаёт ответственный за инфраструктуру; самостоятельного восстановления в админке нет.
1.6. Плановая смена паролей и обновления админки
Пароли доступа периодически меняются планово (в том числе служебный ключ, которым подписывается авторизация). О таком окне администраторов предупреждают заранее. Что при этом происходит на вашем экране:
| Что сменили | Что вы увидите | Что сделать |
|---|---|---|
| Пароль администратора | ничего сразу: текущая сессия живёт до 24 часов | войти с новым паролем при следующем входе |
| Служебный ключ подписи | открытая вкладка сама возвращается на форму входа при первом же обращении к серверу, с сообщением «Сессия завершена. Войдите ещё раз.» (§ 1.4) | войти заново; обновлять страницу (F5) не нужно |
| Обновление админки, затрагивающее авторизацию | то же самое: однократный выход на форму входа с тем же сообщением — у всех администраторов сразу после перезапуска сервера | войти заново тем же логином и паролем; менять их не требуется |
Третья строка — не про каждое обновление: сессии гасит только выкат, который меняет саму механику авторизации (о таком предупреждают заранее, как и о смене паролей). Разлогин при этом разовый, пароли не меняются, повторный вход занимает несколько секунд.
Новый пароль берётся у ответственного за инфраструктуру. Пересылать его в переписке или записывать в документы не нужно — значение выдаётся из защищённого хранилища.
2. Главная и навигация
После входа открывается главная страница и боковое меню — оно доступно со всех экранов.
2.1. Главная страница
Содержит:
- Заголовок «Администрирование Смета.Нет.Ру».
- Версия приложения (например, 2.6.2).
- Виджеты статистики: количество загруженных ФСНБ, активный ФСНБ, количество пользователей, обращений.
- Быстрые ссылки на основные разделы.
2.2. Боковое меню
На телефоне и узком окне (до 768 px) боковое меню скрыто. Откройте его кнопкой «☰» в шапке; закрывается тапом по затемнённому фону, выбором пункта или сменой раздела. На широком экране меню всегда на виду.
Меню структурировано по группам:
Каталог ФСНБ
| Пункт | Назначение |
|---|---|
| 🏠 Главная | Возврат на главную |
| 📚 ФСНБ | Список загруженных ФСНБ, активация, удаление, навигация по каталогу |
Справочники
| Пункт | Назначение |
|---|---|
| 📅 Кварталы | управление кварталами (год, номер, письмо Минстроя) |
| 🌐 Страны | управление списком стран |
| 🗺️ Регионы | управление регионами (с привязкой к ФГИС ЦС, многозонные регионы) |
| 📏 Ед. измерения | конвертация единиц (категория + множитель) |
| 📋 Характеристики | словарь характеристик для применения коэффициентов |
| 📖 Обоснования коэф. | справочник обоснований применения коэффициентов (приказы 421/пр, 571/пр, 812/пр, 774/пр) |
Индексы цен
| Пункт | Назначение |
|---|---|
| 📊 Индексы цен | просмотр загруженных индексов |
| ⬆️ Импорт ИЦ | ручная загрузка XLS-файла |
| 🤖 Робот ИЦ | автоматическая загрузка из ФГИС ЦС |
НР и СП
| Пункт | Назначение |
|---|---|
| 💰 Привязка НР и СП | сопоставление таблиц нормативов накладных расходов и сметной прибыли с работами ФСНБ |
Загрузка
| Пункт | Назначение |
|---|---|
| 📥 Загрузка ФСНБ | импорт ZIP-архива с XML-файлами ФСНБ |
Управление пользователями и обратной связью
| Пункт | Назначение |
|---|---|
| 👥 Пользователи | список зарегистрированных пользователей (только просмотр) |
| 💬 Обращения | список обращений пользователей (ошибки и предложения) |
| 📄 НПА документы | управление приказами, методиками, СП, МДС с PDF-файлами |
| 📊 Шаблоны отчётов | управление шаблонами экспорта (Стандарт / ФСНБ. Ресурсы и индексы) |
ИИ-ассистент и аналитика (в боковом меню — раздел «Система»)
| Пункт | Назначение |
|---|---|
| Чаты пользователей | просмотр диалогов пользователей с ассистентом (см. главу 16) |
| Аналитика чата | дашборд телеметрии: эпизоды и исходы подбора (см. главу 17) |
| Модели ИИ | доступные модели ИИ (см. главу 18) |
| Настройки агента | параметры агента: модель, итерации, токены, матрица качества (см. главу 18) |
| Расход API | расход по обращениям к API моделей (см. главу 18) |
| Расходы | сводный расход ресурсов ИИ (см. главу 18) |
Разметка и качество подбора (в боковом меню — разделы «Система» и «Алгоритмы»)
| Пункт | Назначение |
|---|---|
| Оси хар-к (ФСНБ) | параметры работ для разметки ФСНБ (см. главу 19) |
| Разметка ФСНБ | присвоение характеристик деревом (см. главу 19) |
| RAG-примеры | база знаний подбора (см. главу 19) |
| Eval | оценка качества подбора, кейсы, покрытие, очередь ревью (см. главу 20) |
| Профи.ру | пайплайн каталога услуг (см. главу 21) |
Тестирование
| Пункт | Назначение |
|---|---|
| Тестирование | запуск автоматических сценариев из админки (только на тестовом контуре) |
Документация
| Пункт | Назначение |
|---|---|
| 📖 Документация | ссылки на руководства (HTML / PDF / Markdown) и Release Notes |
2.3. Принципы навигации
- Клик по пункту меню — переход в соответствующий раздел.
- Кнопка «← Назад» в шапке (если есть история) — возврат на предыдущий экран.
- При перезагрузке страницы (F5) состояние сбрасывается на главную.
2.4. Шапка приложения
Над содержимым — название текущего раздела + кнопки действий, специфичные для каждой страницы.
В нижней части бокового меню — кнопка «Выйти».
2.5. Доступ
Ролей и прав внутри админки пока нет — авторизованный администратор видит весь интерфейс; разграничение прав запланировано. Отдельно существует признак «Эксперт» для пользователей калькулятора (см. главу 13) — он расширяет их возможности в пользовательском приложении, а не в админке.
3. ФСНБ
«ФСНБ» (Федеральная сметная нормативная база) — корневой справочник системы. Каждая загруженная ФСНБ содержит сборники (ГЭСН, ГЭСНм, ГЭСНр и т. д.), разделы, группы, работы и ресурсы.
3.1. Список ФСНБ
Открывается по пункту меню «ФСНБ».
Колонки таблицы:
| Колонка | Что показано |
|---|---|
| ID | внутренний идентификатор |
| Название | например «ФСНБ-2022 (приказ Минстроя 696/пр от 12.11.2025)» |
| Номер приказа | например «696/пр» |
| Дата приказа | например «12.11.2025» |
| Реестр ФРСН (новое в 2.8.0) | #<id> — если при загрузке подтверждена привязка к
записи реестра (см. 4.2), иначе «—» (в т. ч. у всех ФСНБ, загруженных до
2.8.0). Только для чтения. |
| Статус | «Активна» / «Не активна» |
| Кол-во сборников / разделов / работ | счётчики |
Действия в строке:
| Кнопка | Назначение |
|---|---|
| Открыть | детали этой ФСНБ (см. 3.2) |
| Активировать / Деактивировать | переключить статус |
| Удалить | удаление ФСНБ со всеми связанными данными (с подтверждением); в процессе показывается индикатор |
Кнопки страницы: + Загрузка ФСНБ — переход на форму импорта (см. главу 4).
3.2. Карточка ФСНБ
Открывается из списка по «Открыть».
Шапка
- Название ФСНБ (редактируемое).
- Номер и дата приказа.
- Статус.
- Кнопки: «Сохранить» (после редактирования), «Деактивировать», «Удалить».
Сборники
Таблица: тип, название, дата создания, уровень цен. Клик переходит в карточку сборника.
Привязка НР / СП
Выпадающий список «Привязка НР/СП» — выбор активного маппинга (см. главу 5).
Расчёт НР / СП
Кнопки:
- «Рассчитать НР/СП» — запускает расчёт для всех работ ФСНБ.
- Прогресс — индикатор обновляется автоматически.
- «Список нерассчитанных» — показывает работы без НР / СП.
3.3. Сборник
Список разделов. Колонки: код, название, кол-во групп, кол-во работ. Поиск (для ФСБЦ_Маш, ФСБЦ_Мат) — на сервере, с задержкой ~400 мс.
3.4. Раздел
Список групп и подразделов. Иерархия раскрывается через хлебные крошки.
3.5. Группа
Список работ в группе. Колонки: код, название, единица измерения. Клик по работе открывает её карточку.
3.6. Карточка работы
Полная карточка работы (только просмотр):
- Код, название, единица измерения, сборник.
- Ресурсы — таблица: № / Тип / Код / Название / Кол-во / Ед. Бейдж «П» для ресурсов с количеством из проекта.
- НР / СП — таблица: НР или СП, % от ФОТ, обоснование.
- Технологические группы — список групп с привязкой к абстрактным ресурсам.
- Абстрактные ресурсы — материалы, замещаемые конкретными в калькуляторе через выбираемые материалы.
4. Импорт ФСНБ
Загрузка ZIP-архива с XML-файлами ФСНБ. Источник архивов — официальные публикации Минстроя на ФГИС ЦС.
4.1. Открытие
Меню → «Загрузка ФСНБ».
4.2. Загрузка файла
На форме заполняются: «Название ФСНБ», «Номер приказа», «Дата приказа» (текстовые поля, редактируемые вручную), затем — поле «Выберите файл ZIP», стандартный выбор файла (принимаются ZIP-архивы стандартного формата ФСНБ Минстроя с XLSM-файлами по сборникам и спецификациями XML).
Кнопка «Загрузить» — отправляет архив на сервер. После загрузки запускается фоновый процесс импорта.
Привязка к записи реестра ФРСН (новое в 2.8.0)
При открытии формы система сама проверяет реестр ФРСН (тот же запрос, что и кнопка «Проверить сейчас», см. 7.10). Если найдена не загруженная ещё новейшая редакция, наверху формы появляется баннер:
🔗 Обнаружена новая редакция в реестре ФРСН: доп. №…, приказ … от … [Да, это она — заполнить автоматически] [Это другая]
- «Да, это она» — поля «Название ФСНБ», «Номер
приказа», «Дата приказа» заполняются из данных реестра (остаются
редактируемыми), под полями появляется индикатор «Запись реестра ФРСН:
✅ #
(привязана)». Привязка сохраняется вместе с загружаемой ФСНБ и используется роботом обнаружения для точной сверки (без разбора текста названия) — см. 7.10. - «Это другая» — баннер скрывается, форма заполняется вручную как раньше, привязки не будет («Запись реестра ФРСН: — не привязана»). Так же ведёт себя форма, если свежего обнаружения нет.
- Привязку можно снять кнопкой «✕» у индикатора до нажатия «Загрузить».
Привязка — необязательный шаг: без неё импорт работает как раньше, просто редакция не получает точного ключа для сверки, и робот обнаружения продолжает сравнивать её по тексту названия/приказа. У всех ФСНБ, загруженных до 2.8.0, привязки нет и не появится задним числом.
4.3. Список загрузок
| Колонка | Что показано |
|---|---|
| Имя файла | как загружено пользователем |
| Размер | в МБ |
| Дата загрузки | |
| Статус | «Загружен» / «Импортируется» / «Готов» / «Ошибка» |
| Прогресс | прогресс-бар при импорте |
Прогресс импорта обновляется автоматически. Показывает:
- % выполнения общего импорта;
- Текущий шаг (например, «Импорт ГЭСН: раздел 5 из 67»);
- Количество обработанных строк.
4.4. Обработка ошибок
При ошибке статус меняется на «Ошибка», в детальной строке выводится сообщение. Типичные ошибки:
- «Файл не является ZIP» — неверный формат файла.
- «Не найден файл XLSM» — структура ZIP не соответствует ожидаемой.
- «Конфликт ссылок» — попытка удалить ФСНБ, на которую ссылаются индексы цен.
- «Слишком длинное значение» — поле в XLSM длиннее допустимого.
4.5. После успешного импорта
- Загруженная ФСНБ появляется в списке.
- Статус — «Не активна» по умолчанию. Активировать вручную.
- Расчёт НР / СП — отдельным шагом (см. главу 5).
4.6. Что включено в импорт
| Сущность | Источник в архиве |
|---|---|
| Сборник | заголовочные листы |
| Раздел | таблицы разделов |
| Группа | подзаголовки |
| Работа | строки расценок (с обоснованием, единицей измерения, разрядом) |
| Ресурсы | оплата труда, эксплуатация машин, материалы по каждой работе |
| Базисные цены ресурсов | из сборников ФСБЦ_Маш и ФСБЦ_Мат |
| Технологические группы | раздел технологических групп |
| Абстрактные ресурсы | шаблоны материалов в работах |
| Ставки НР / СП | через отдельную привязку (см. главу 5) |
4.7. Размер и время
Полный импорт ФСНБ-2022 занимает 5–15 минут на тестовом контуре и до 30 минут на рабочем (зависит от ресурсов сервера). Размер архива — обычно 50–80 МБ.
Во время импорта система остаётся работоспособной, но активный ФСНБ не меняется до явной активации.
Потребление памяти и сбой по памяти (новое в 2.11.1, D-463)
Архив больше не распаковывается в память целиком: сборники разбираются по одному прямо из ZIP, поэтому полная ФСНБ (≈7 МБ ZIP, ≈180 МБ XML) и накопительные дополнения грузятся на рабочем сервере без нехватки памяти. Менять настройки сервера или загружать архив частями не нужно.
Если памяти всё же не хватило, задание больше не «зависает» в статусе «Импортируется»: оно получает статус «Ошибка», а в журнале роботов появляется запись вида FSNB с причиной. При такой записи сообщите разработчикам и не запускайте импорт повторно до их ответа.
Ограничение: если в архиве два файла с одинаковым именем лежат в разных каталогах, загружается первый (раньше — последний). В архивах Минстроя таких файлов нет.
Авто-проверка новой редакции (журнал, новое в 2.11.1, №177)
На странице «Загрузка ФСНБ» блок «Авто-проверка новой редакции» показывает одну последнюю проверку: дату, статус и текст результата. Более ранние проверки скрыты: чтобы их увидеть, нажмите ссылку «Показать историю (N)» под таблицей (N — число прежних проверок); «Скрыть историю» сворачивает список. После ручного запуска («Проверить сейчас») новая запись появляется сверху.
5. Привязка НР и СП
«НР / СП» (накладные расходы и сметная прибыль) — нормативные процентные ставки от ФОТ, применяющиеся к каждой работе. В ФСНБ они не приходят в составе работы напрямую — их нужно сопоставить из таблиц приказа Минстроя 812/пр (НР) и 774/пр (СП).
Меню → «Привязка НР и СП» (раздел «Алгоритмы»).
5.1. Открытие
Меню → «Привязка НР и СП».
5.2. Список привязок
Колонки таблицы:
| Колонка | Что показано |
|---|---|
| ID | |
| Название | например «Стандартный (812/пр_2020 + 774/пр_2020)» |
| Кол-во строк | сколько кодов работ покрыто |
| Активна | флаг |
Действия: Открыть / Удалить / Скачать XLSX / Загрузить XLSX.
5.3. Создание новой привязки
Кнопка «+ Новая привязка» открывает форму:
- Название привязки.
- Файл XLSX — таблица с колонками: код работы / процент НР / процент СП / обоснование НР / обоснование СП.
После загрузки система разбирает XLSX и создаёт записи привязки.
5.4. Применение привязки
В карточке ФСНБ (см. главу 3) у каждой ФСНБ — выпадающий список «Привязка НР / СП». Выбор привязки и кнопка «Рассчитать НР/СП» запускает расчёт.
Система проходит по всем работам ФСНБ и для каждой создаёт записи НР и СП с процентами и обоснованиями из привязки.
Прогресс отображается в виде полосы.
5.5. Структура XLSX-файла
Шапка таблицы:
| Код | Вид работ | НР % | НР обоснование | СП % | СП обоснование |
|---|---|---|---|---|---|
15 |
Отделочные работы | 100 |
812/пр_2020_прил.т_п.15 |
60 |
774/пр_2020_прил.т_п.15 |
49.3 |
Электромонтажные | 97 |
812/пр_2020_прил.т_п.49.3 |
51 |
774/пр_2020_прил.т_п.49.3 |
| … |
Сопоставление по коду вида работ (первая колонка) — система соотносит с кодом группы или работы в ФСНБ.
5.6. Множественные пары
Одна работа может иметь несколько пар «НР + СП» (например, для разных видов: монтажный + ремонтный). В таком случае в XLSX повторяются строки с одинаковым кодом.
В смету пользователя всегда попадает ровно одна пара (с версии 2.7.0). Если вариантов несколько:
- работу добавил ассистент (генерация сметы по описанию или команда в чате, с версии 2.8.0) — он сопоставляет вид работ каждого варианта с характером работы и объекта; при уверенном совпадении пользователь видит пометку «✨ подобрано автоматически», иначе — как и раньше, берётся пара с минимальным процентом НР (тай-брейк: минимальный СП, затем шифр) с пометкой «⚠ выбран минимальный норматив»;
- работу добавили вручную через список работ — смыслового подбора нет, всегда берётся пара с минимальным процентом НР.
В обоих случаях пользователь может сменить привязку вручную (см. руководство пользователя, главы 6 и 7.7); ручной выбор сохраняется в смете и не перезатирается пересчётами.
Практическое следствие для администратора: порядок и состав дублирующихся строк в XLSX влияет на автоматический выбор. Если по коду загружены лишние или ошибочные виды работ, сметы систематически получат заниженный НР — выверяйте дубли по коду перед загрузкой.
5.6.1. Лечение смет, созданных до 2.7.0
Сметы, сгенерированные раньше, содержат в БД все пары сразу и
завышают итог. Разовое лечение выполняется DML-скриптом
docs/migrations/v2.7.0-d2-nrsp-collapse.sql (репозиторий
admin-backend):
- скрипт идемпотентен — повторный запуск безопасен;
- перед удалением лишних пар делается резервная копия в таблицу
backup_smeta_nr_sp_d2— не удалять её до приёмки релиза; - после прогона обязателен пересчёт итогов смет (см. §5.6.2) — иначе в списке смет останутся старые суммы;
- порядок: TEST → проверка → PROD (только в согласованное окно).
Пользователь после этого увидит в смете информационный баннер об уменьшении итога — руками чинить ничего не нужно.
5.6.2. Пересчёт итогов: как читать отчёт
Пересчёт запускает приложение smeta-user-backend.
Запускать его можно только с самого хоста контура и
только со служебным удостоверением:
$ curl -X POST http://127.0.0.1:8081/api/internal/recalc-all \
-H "Authorization: Bearer $SMETA_INTERNAL_TOKEN"
Массовый вызов на PROD — только в согласованное окно.
⚠️ Открытие сметы в интерфейсе пользователя итоги НЕ
пересчитывает — GET /api/smeta/{id} только читает,
ни одной записи в БД не делает. Не считайте смету вылеченной на том
основании, что её открыли. Точечная альтернатива массовому пересчёту
одна: попросить владельца сметы открыть у нужной работы «Сменить
привязку» и повторно применить уже выбранный
вариант — привязка не изменится, а итоги работы, раздела и сметы
пересчитаются (подробнее — §5.6.3).
⚠️ Пересчёт закрыт двумя рубежами. Отказ снаружи — это НЕ сбой пересчёта. Раньше эта ручка работала без аутентификации и была доступна из интернета — любой мог запустить перезапись итогов всех смет всех пользователей; дефект устранён.
- Снаружи, по публичному домену, путь
/api/internal/…закрыт на прокси (allow 127.0.0.1; deny all— так же, как/actuator). Ответ —403, до приложения запрос не доходит, в журналеsmeta-user-backendследа не остаётся. - С хоста контура без заголовка
Authorization: Bearerили с неверным токеном —401с пустым телом, пересчёт не запускается. Ответ одинаков для «заголовка нет» и «токен неверный»: по нему нельзя понять, угадан токен или нет. - Токен берётся из окружения контура — переменная
SMETA_INTERNAL_TOKENв/opt/smeta/env/smeta-user.env(права600). На TEST и PROD значения разные. Значение не копировать в документы, тикеты, чаты и командную строку — только подставлять из окружения, как в примере выше. - Других способов передать токен нет намеренно: ни
X-Service-Token, ни?token=в адресе — адрес запроса целиком попадает в журнал прокси, а заголовокAuthorizationв журнал не пишется.
⚠️ Порядок выката релиза: переменная
SMETA_INTERNAL_TOKEN должна быть заведена в окружении
контура до установки нового jar. Если
наоборот — приложение стартует с пустым токеном и пересчёт закрыт для
всех (в том числе с хоста контура): это не авария, но процедура §5.6.1
на таком контуре не выполнится, пока не поправят окружение и не
перезапустят сервис.
Смотреть надо на тело ответа, а не только на код
возврата. В версиях до 2.7.0 пересчёт отдавал
200 «Пересчитано смет: N», даже если часть итогов не
посчиталась и была затёрта в пустое значение (на TEST 21.07 так
потерялись итоги 37 работ в 5 сметах). С 2.7.0 ответ — JSON-отчёт:
| Поле | Что означает |
|---|---|
smetaCount |
сколько смет обработано |
rabotaFailedCount |
по скольким работам расчёт не удался |
smetaFailedCount |
по скольким сметам не удалось поднять сумму наверх |
failedRabotaIds / failedSmetaIds |
перечень идентификаторов (усечён до 200 — об усечении сказано в
message; полный перечень в журнале
smeta-user-backend) |
message |
текстовая сводка |
Как читать:
- HTTP 200,
rabotaFailedCount = 0,smetaFailedCount = 0— пересчитано полностью, идти дальше по процедуре; - HTTP 500 с тем же отчётом в теле — часть работ не посчиталась. Итоги этих работ не пересчитаны, но и не затёрты: прежние значения остались на месте, деньги в смете не «схлопываются» в пустоту.
Ненулевой rabotaFailedCount на PROD — СТОП
процедуры: разобрать причину по стеку в журнале
smeta-user-backend (строки
[recalc] rabotaId=…), устранить, повторить пересчёт. На
TEST — то же самое, но без остановки окна.
⚠️ Зелёный отчёт не означает, что все итоги верны.
Отчёт считает неудачей только упавший расчёт. Но есть случай, когда
расчёт не падает, а честно получает ноль: смета
ссылается на индекс цен (сплит-форму), которого в базе нет или у
которого не осталось ни одной строки ресурсов — например, после
оборванного импорта (см. 6.8). Цены ресурсов по такой форме не
находятся, фонд оплаты труда выходит нулевым, НР и СП не начисляются.
Итог работы, раздела и сметы пересчитывается по одному остатку: он резко
уменьшается, а если остатка нет вовсе — сохраняется
пустым. В отчёте это выглядит как полный успех —
rabotaFailedCount = 0, smetaFailedCount = 0,
HTTP 200, в журнале ни строки.
Проверять надо до пересчёта, а не после. Запрос показывает сметы, у которых пересчёт обнулит итог:
SELECT s.id, s.nazvanie, s.itogo_summa, s.split_forma_id,
(SELECT count(*) FROM split_forma_resurs fr
WHERE fr.split_forma_id = s.split_forma_id) AS resursov
FROM smeta s
WHERE s.split_forma_id IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM split_forma_resurs fr
WHERE fr.split_forma_id = s.split_forma_id)
ORDER BY s.id;- Пусто — пересчёт запускать можно.
- Есть строки — сначала восстановите индекс цен этих смет: повторный импорт той же пары «регион + квартал» (6.9). Пока строк ресурсов нет, любой пересчёт обнулит итог заново — и массовый, и точечный через повторное «Применить» в «Сменить привязку». До восстановления массовый пересчёт не запускать.
Если обнуление уже произошло, повторным пересчётом оно не лечится — считать по-прежнему не из чего. Вернуть верные суммы можно только из значений, снятых до пересчёта, и только отдельной процедурой в согласованное окно. Отсюда правило: на PROD суммы смет снимаются до массового пересчёта всегда, даже если проверка выше дала пусто.
Признак, что это уже случилось: у сметы в списке и в шапке пустой итог или сумма заметно меньше прежней, при этом состав работ, количества, коэффициенты и привязка НР/СП не менялись.
Контрольный запрос после пересчёта (до сверки сумм) — сколько работ вылеченных смет осталось без итога:
SELECT count(*) FROM smeta_rabota r
JOIN smeta_razdel z ON z.id = r.razdel_id
WHERE z.smeta_id IN (SELECT id FROM smeta WHERE nr_sp_collapsed_at IS NOT NULL)
AND r.itogo_summa IS NULL;Ожидание — только заведомо пустые работы (без ресурсов и цен). Внезапный рост этого числа после пересчёта = потеря итогов, откатывать по блоку ОТКАТ в самом скрипте миграции.
5.6.3. Смены привязки в версиях 2.7.0 — 2.7.4: итоги надо пересчитать
В этих сборках смена привязки НР/СП пользователем сохраняла
новую пару вместе со старым итогом работы: проценты и
суммы НР/СП в БД обновлялись, а itogo_summa работы
оставалась посчитанной по предыдущей паре. Расхождение поднималось в
итог раздела, сметы и в выгрузку XLSX; обновление страницы его не
лечило, ошибка «отставала ровно на одну смену».
Исправлено в smeta-user-backend. Выкат кода
лечит только последующие действия — уже сохранённые итоги остаются
неверными, их надо пересчитать.
Кандидаты на пересчёт — сметы, где вид работ выбирал человек:
SELECT DISTINCT z.smeta_id
FROM smeta_nr_sp p
JOIN smeta_rabota r ON r.id = p.rabota_id
JOIN smeta_razdel z ON z.id = r.razdel_id
WHERE p.origin = 'USER';Выборка шире реально затронутых:
origin = 'USER' ставится и когда вид работ выбрали прямо
при добавлении работы (такие итоги верны). Лишний пересчёт безвреден,
поэтому уточнять её не нужно.
Лечение — тот же пересчёт итогов, что и после DML-лечения: массово по §5.6.2 либо точечно (пользователь открывает «Сменить привязку» и повторно применяет уже выбранный вариант — привязка не меняется, итоги работы, раздела и сметы пересчитываются).
На PROD массовый пересчёт — только в согласованное окно и со снятыми суммами смет до и после: у смет, ссылающихся на пустой или отсутствующий индекс цен (сплит-форму), пересчёт молча обнуляет итог, а отчёт остаётся зелёным. Проверка до запуска и порядок действий — §5.6.2.
Родственный случай, не связанный с привязкой НР/СП, — §5.6.4.
5.6.4. Отставший итог после правки объёма или коэффициента работы
Тот же по механике дефект, что и §5.6.3, но старше и
шире. PUT /api/smeta/rabota/{id} (и его агентский
двойник PUT /api/agent/smeta/rabota/{id}, через который
объём меняет чат-ассистент) сохранял новое kolichestvo /
koefficient, а пересчёт итога успевал прочитать из БД
прежнее значение: itogo_summa работы и
поднятые из неё итоги раздела и сметы оставались от предыдущего объёма.
Ошибка отставала ровно на одно изменение; следующее денежное действие по
той же работе её снимало, поэтому в БД осело расхождение по
последней правке каждой работы.
Проверено прогоном на живой БД TEST: правка объёма ×2 дала расхождение итога работы 183 674,85 ₽, смена коэффициента 1 → 1,15 — 27 551,24 ₽.
Дефект не привязан к 2.7.x. Он существует столько
же, сколько существуют хранимые итоги смет (появились в апреле 2026), и
присутствует во всех сборках вплоть до текущего исправления
smeta-user-backend. Диапазон 2.7.0 — 2.7.4 из §5.6.3 сюда
не переносится.
Не затронуты: поправочные коэффициенты обоснования
(/smeta/rabota/{id}/koef) — там запись всегда шла с флашем;
добавление и удаление работ; правки в ВОР; удаление разделов.
Признака в данных нет. В отличие от §5.6.3
(origin = 'USER') отставший итог ничем не помечен —
выборкой кандидатов не обойтись, кандидатом становится любая смета,
которую редактировали. Отсюда два входа лечения:
- точечно — попросить владельца сметы задать через ассистента тот же самый объём (коэффициент) ещё раз: значение не изменится, итоги работы, раздела и сметы пересчитаются;
- массово — пересчёт по §5.6.2 со всеми его оговорками (endpoint без аутентификации, окно на PROD, суммы до и после, «законный ноль» на отсутствующей сплит-форме).
Массовый пересчёт PROD по этому поводу — по решению архитектора: периметр здесь не «сметы за релиз», а весь накопленный объём правок.
5.6.1. Точечный пересчёт итога одной сметы
Если итог одной сметы разошёлся с ожидаемым (например, после ручной правки привязки НР/СП или ФСНБ), эксплуатации доступны два точечных способа пересчитать её, не трогая остальные сметы:
- Через владельца сметы — попросить его открыть у любой работы «Сменить привязку» и повторно применить уже выбранный вариант. Привязка не меняется, но пересчитываются итоги работы, раздела и сметы.
- Через сервисный вызов —
POST /api/agent/smeta/{id}/recalc(заголовкиX-Service-Token+X-On-Behalf-Of: <UUID владельца>), доступен эксплуатации без участия владельца; ответ200содержит уже пересчитанныйitogoSumma. До исправления в задаче №68 (релиз 2.8.0, дефекты D-78/D-375 в реестре) этот вызов отдавал200со СТАРЫМ итогом, ничего не пересчитывая, а на сметах с вложенными разделами (после фикса) пересчитывает по сумме корневых разделов, а не всех уровней. На версиях до 2.8.0 полагаться на код ответа этого endpoint нельзя — сверяйте итог напрямую в БД.
Открытие сметы в интерфейсе пользователя итог не пересчитывает — это только чтение.
5.7. Ручное редактирование
В таблице привязки можно вручную править строки (если зайти через «Открыть»):
- Колонки кликабельны для редактирования на месте.
- Кнопка ✕ — удалить строку.
- Кнопка «+ Добавить» — новая строка с пустыми полями.
Сохранение — пополе. Изменения не пересчитывают уже посчитанные НР / СП — нужно повторно запустить «Рассчитать НР/СП» в карточке ФСНБ.
5.8. Привязка по умолчанию
При первом запуске системы привязка создаётся вручную (загрузить XLSX или попросить готовый файл от Минстроя). Значений по умолчанию нет.
5.9. Особенности 2.2.21
В 2.2.20+ добавлены коэффициенты 812/пр_2020_п.25 (НР × 0,9) и 774/пр_2020_п.16 (СП × 0,85), применяемые при капитальном ремонте через ГЭСН вместо ГЭСНр. Их не нужно включать в привязку — это отдельные обоснования (см. главу 8 «Справочник обоснований»). Они применяются сверх базовых ставок.
6. Индексы цен
«Индексы цен» (раньше называлось «Сплит-форма») — таблицы пересчёта базисных цен ресурсов в текущие. Каждая запись = ресурс × регион × квартал → текущая цена + индекс.
Индексы загружаются напрямую с ФГИС ЦС по паре «регион + квартал»: администратор выбирает регион и квартал, система сама формирует ссылку, скачивает сплит-форму (xlsx) и разбирает её. Загрузки файлом с компьютера в системе нет.
6.1. Открытие
- Меню → «Индексы цен» — список загруженных индексов и их содержимое.
- Меню → «Импорт ИЦ» — загрузка индексов нового региона/квартала.
6.2. Список импортов
Колонки таблицы:
| Колонка | Что показано |
|---|---|
| Регион | код ценовой зоны и название региона |
| Квартал | номер квартала (Q1…Q4) и название, например «4 квартал 2025 г.» |
| № | номер формы (на него ссылаются сметы) |
| Строк | сколько строк загружено |
| Статус | тег АКТИВНА / НЕ АКТИВНА / АРХИВ (см. 6.7) |
| Смет | сколько смет стоит на этой форме (в подсказке — сколько из них опубликовано) |
| Загружена | когда выполнена загрузка |
Действия:
| Действие | Как | Что делает |
|---|---|---|
| Открыть содержимое | клик по строке | раскрывает панель ресурсов (см. 6.4) |
| Сравнить | у формы «НЕ АКТИВНА» | показывает отличия от действующей формы пары (6.7) |
| Активировать | у формы «НЕ АКТИВНА» | делает форму действующей (6.7) |
| Отклонить… | у формы «НЕ АКТИВНА» | удаляет форму-кандидата; причина обязательна (6.7) |
Свободного переключателя «Активно ↔︎ Не активно» и кнопки удаления нет (с версии 2.10.0): статус меняется только через решение по кандидату. Повторный импорт той же пары ничего не стирает — он создаёт нового кандидата (см. 6.8).
6.3. Фильтры
| Фильтр | Что фильтрует |
|---|---|
| Страна | ограничивает список регионов |
| Регион | конкретный регион (в скобках — код ценовой зоны ФГИС ЦС) |
| Квартал | сгруппирован по годам; в скобках — код периода ФГИС ЦС |
6.4. Панель ресурсов
Открывается кликом по строке списка. Сверху — поиск по коду или наименованию ресурса, справа — общее число строк.
Колонки: Код ресурса, Наименование, Ед.изм, Отп. цена 01.01.2022, Смет. цена 01.01.2022, Гр., Наименование группы, Смет. цена текущая, Индекс.
Заполнены не все колонки у всех строк, и это нормально:
- у машин и механизмов обычно есть текущая сметная цена и нет индекса;
- у материалов — отпускная и базисная цены плюс индекс пересчёта.
Панель — основной способ убедиться, что импорт действительно привёз
данные, а не создал пустой заголовок: найдите знакомый код (например
91.05.05-015) и проверьте, что цены непустые.
6.5. Импорт индексов с ФГИС ЦС
Меню → «Импорт ИЦ».
- Страна → Регион. Под полем зелёным
выводятся собранные параметры:
priceZoneId(Код ФСНБ региона) иcountrySubjectId(ФГИС ЦС ID региона). - Квартал (список сгруппирован по годам). Под полем —
periodId(Код ФСНБ квартала). - Появляется блок «URL для скачивания» — та самая ссылка на ФГИС ЦС, которая будет вызвана, и блок «Что уже есть для этой пары»: действующая форма, кандидат, число смет на каждой. Загрузка создаст новую форму; действующая остаётся рабочей, пока вы не активируете новую.
- Сверьте параметры до нажатия кнопки — особенно
periodId: он определяет квартал, для которого создаётся форма (см. 6.8). - Кнопка «Скачать и импортировать» запускает процесс. Кнопка неактивна, пока не выбраны регион и квартал или пока не хватает кодов ФГИС ЦС.
Экран прогресса (не закрывайте и не перезагружайте вкладку до конца — прогресс хранится по идентификатору задания в памяти сервера):
- строка фазы: «Проверка параметров…» → «Скачивание файла с ФГИС ЦС…» → «Импорт: N строк прочитано…» → «Завершено»;
- два счётчика: «Прочитано строк» и «Записано в БД» (в норме совпадают — расходятся только за счёт пропущенных пустых строк файла);
- ссылка на источник — то, что реально скачивается.
Терминальные состояния:
| Состояние | Что значит | Что делать |
|---|---|---|
| Готово | форма загружена как «НЕ АКТИВНА»; на экране — число строк и смет на прежней форме, сравнение с действующей | принять решение: «Активировать», «Отклонить…» или «Позже» (6.7) |
| Ошибка | текст ошибки; прежняя форма и сметы не затронуты | см. 6.6 и 6.8 |
Типичные тексты ошибок:
HTTP 404/500 при скачивании файла с ФГИС ЦС — проблема на
стороне внешнего источника (повторить позже);
не задан Код ФСНБ / «Регион не найден» / «Квартал не
найден» — не заполнены справочники (см. 6.6).
Загрузка одного крупного региона занимает порядка полминуты (файл ~8 МБ, сотни тысяч строк); ограничение на скачивание — 10 минут.
6.6. Что должно быть заполнено в справочниках
Импорт возможен, только если заданы три кода ФГИС ЦС:
| Код | Где заполняется | Роль в ссылке |
|---|---|---|
| Код ФСНБ региона | справочник «Регионы» (глава 8) | priceZoneId |
| ФГИС ЦС ID региона | справочник «Регионы» | countrySubjectId |
| Код ФСНБ квартала | справочник «Кварталы» | periodId |
Если чего-то не хватает, пункт списка помечается «⚠ нет кодов ФГИС» / «⚠ нет Кода ФСНБ» и недоступен для выбора, а вместо URL показывается красный блок «Невозможно сформировать URL». Это же — признак испорченного справочника: если ранее доступный квартал вдруг стал недоступен, сначала проверьте его карточку, а не источник.
Кварталы прошлых периодов ФГИС ЦС отдаёт наравне с текущим — восстановить индексы за уже прошедший квартал можно в любой момент (проверено на 4 квартале 2025 г.).
6.7. Статусы формы и активация (изменено в 2.10.0)
У формы три статуса:
| Статус | Что значит |
|---|---|
| АКТИВНА | действующая форма пары «регион + квартал»; её видят новые сметы, каталог и сайт. Не более одной на пару |
| НЕ АКТИВНА | кандидат: только что загружена (вручную или роботом), ждёт решения. Не более одного на пару; сметы и сайт его не видят |
| АРХИВ | прежняя действующая форма, вытесненная новой. Сметы, уже стоящие на ней, считаются как раньше; новые сметы на архив не привязываются |
Импорт всегда создаёт кандидата и сам ничего не активирует — ни при загрузке вручную, ни у робота (глава 7).
Решение по кандидату (после импорта на экране «Готово» или в списке «Индексы цен»):
- Сравнить — блок с цифрами: строк было/стало, сколько цен изменилось, медианное отклонение, сколько ресурсов появилось/исчезло, сколько смет (и опубликованных) стоит на действующей форме. Если отличий нет — система советует отклонить.
- Активировать №N — подтверждение сообщает, что
станет с прежней формой:
- на ней есть сметы → она уходит в АРХИВ, сметы считаются по ней как раньше;
- смет нет → прежняя форма удаляется;
- действующей формы у пары не было → кандидат просто становится действующим.
- Отклонить… — кандидат удаляется, нужно указать причину; действующая форма пары не меняется.
- Позже — оставить кандидата до следующего захода.
Пока у пары есть неразобранный кандидат, новая загрузка этой пары отклоняется, если на кандидате уже есть сметы; пустого кандидата новая загрузка заменяет.
Пользовательское приложение показывает в форме создания сметы только пары с действующей формой: пока кандидат не активирован, квартал у сметчика не появится.
Активных форм у региона может быть несколько (разные кварталы) — это штатно.
Что видит владелец сметы на архивной форме. В окне
«⚙ Параметры» — строка «Индексы цен: версия от … (архив)» и, если у пары
есть действующая форма, флажок «Пересчитать по новым индексам». Без
флажка смета остаётся на архиве — даже при смене тарифа (см. руководство
пользователя, 4.5а). Массовый пересчёт смет (глава 5) считает такие
сметы по ценам их архивной формы; сметы без пригодной формы попадают в
отчёт отдельной строкой «нет индексов» (NO_INDEXES), а не
обнуляются.
6.8. Что импорт делает с данными: что важно знать
- Импорт больше ничего не удаляет и не перезаписывает. Форма пары заменяется только вашим решением «Активировать» (6.7).
- Если загрузка оборвалась (нет связи, 404 у ФГИС ЦС), удаляется только новая, незаполненная форма; прежняя форма и сметы целы, задача получает статус ошибки с причиной. Повторный запуск безопасен.
- Форма, на которую ссылается смета, не удаляется — это защищено на уровне базы данных (внешний ключ). Удалить можно только кандидата без смет и действующую форму без смет в момент активации замены.
- Если у сметы нет пригодных индексов (форма удалена
до версии 2.10.0, не активирована или ссылка пуста при наличии работ),
смета не показывает «нулевые» суммы молча: расчёт, экспорт и каталог
отвечают отказом
NO_INDEXES(«Индексы цен не найдены/не активны»), а владелец исправляет параметры сметы через «⚙ Исправить параметры сметы». На TEST после разовой чистки висячих ссылок такие сметы (в т.ч. 74 с работами) не откроются, пока в них не выбраны индексы. - Не перезапускайте сервис администрирования во время импорта — прогресс задания хранится в памяти и будет потерян; незавершённый кандидат останется как есть и будет заменён новой загрузкой.
6.9. Как добавить или восстановить квартал (типовая процедура)
- «Импорт ИЦ» → Страна → Регион → Квартал; сверить
priceZoneId/countrySubjectId/periodIdи URL. - «Скачать и импортировать» → дождаться «Завершено»; убедиться, что «Прочитано» и «Записано» совпадают и это десятки–сотни тысяч строк (несколько сотен строк — признак неполной загрузки, импорт повторить).
- Экран «Готово» или «Индексы цен» → кандидат «НЕ АКТИВНА» → «Сравнить» → «Активировать» (6.7).
- Клик по строке → в панели ресурсов найти пару кодов и проверить, что цены и индексы непустые.
- Проверить пользовательскую сторону: у сметчика в окне «Новая смета» для этого региона появился нужный квартал и смета на нём создаётся.
Ориентир по объёму: Московская область, 4 квартал 2025 г. — 165 716 строк, загрузка заняла около 36 секунд.
6.10. Состав сплит-формы зависит от квартала
Число строк в формах разных кварталов одного региона может заметно отличаться (например, 165 716 за 4 квартал 2025 г. против 281 327 за 2 квартал 2026 г. по Московской области — расхождение даёт в основном блок перевозок). Это свойство самих файлов ФГИС ЦС, а не признак неполного импорта. Критерий корректности загрузки — совпадение счётчиков «Прочитано» и «Записано» и статус «Завершено».
6.11. Состав файла ФГИС ЦС
Разбирается первый лист книги, данные читаются с 17-й строки (выше — шапка формы). Строки без кода ресурса пропускаются. Колонки:
| Колонка | Содержимое |
|---|---|
| A | код ресурса |
| B | наименование |
| C | единица измерения |
| D | отпускная цена на 01.01.2022 |
| E | сметная цена на 01.01.2022 |
| F | номер группы |
| G | наименование группы |
| H | сметная цена текущая |
| I | индекс |
Числа принимаются и в формате 1 167,70, и в формате
1,167.70; нечисловое значение сохраняется как пустое.
6.12. Связь с ФСНБ
Каждый ресурс в индексе цен ссылается на запись из ФСНБ по коду. Если в активной ФСНБ нет такого кода, цена применяется через справочную текущую цену (без индекса). Это нормальное поведение для не-ФСНБ ресурсов (например, перевозок «47-1», «47-2»).
7. Робот загрузки ИЦ
«Робот ИЦ» — автоматическая загрузка индексов цен по всем регионам России из ФГИС ЦС. Запускается ночью или вручную.
7.1. Открытие
Меню → «Робот ИЦ».
7.2. Таблица задач
Каждая задача — пара (регион + квартал), которая должна быть загружена.
| Колонка | Что показано |
|---|---|
| ID | внутренний идентификатор |
| Регион | название |
| Квартал | например «4 квартал 2025 г.» |
| Источник | «Робот» / «Вручную» |
| Статус | «Новая» / «В работе» / «Ошибка» / «Успех» / «Ждёт решения» / «Отклонена» |
| Форма | номер загруженной формы-кандидата и ссылка «Решить →» на список форм пары |
| Комментарий | для «Ошибка» — текст ошибки, для «Отклонена» — «Причина: …» |
| Создано | |
| Обновлено |
Действия:
| Кнопка | Назначение |
|---|---|
| Запустить | в строке — запустить эту задачу; если статус «Ошибка», перезапуск |
| Удалить | очистить задачу |
7.3. Создание задач для квартала
Кнопка «+ Создать задачи для квартала» открывает форму:
| Поле | Описание |
|---|---|
| Квартал | выбор из существующих |
После выбора создаются по одной задаче для каждого региона (со статусом «Новая»). Это пакетная операция, после которой можно запустить робота.
Внимание: операция массовая и перезаписывающая. Задачи заводятся на все регионы (их около 170), и робот отработает их сам в ближайшее ночное окно. Загрузка каждой задачи — это тот же импорт, что и в главе 6: он сначала удаляет уже загруженные индексы пары «регион + квартал» и только потом обращается к ФГИС ЦС. Если по какому-то региону файл не скачается, ранее загруженные индексы этого квартала окажутся потеряны, а на их месте останется пустой заголовок.
Поэтому: заводите задачи на квартал осознанно, когда действительно нужно обновить всю страну. Чтобы догрузить один регион или один квартал, пользуйтесь экраном «Импорт ИЦ» (см. 6.9) — он затрагивает ровно одну пару.
7.4. Расписание
Робот настроен на автоматический запуск:
- Запуск каждые 10 минут в окне 02:00–04:59 по часовому поясу сервера (обычно московское время).
- Алгоритм (за одно срабатывание — одна задача):
- Берёт одну задачу со статусом «Новая» или «Ошибка» (по очереди создания).
- Меняет статус на «В работе».
- Запускает загрузку и разбор файла из ФГИС ЦС.
- После успеха — «Успех». После ошибки — «Ошибка» с сохранением сообщения.
- Следующее срабатывание берёт следующую задачу — и так, пока в очереди есть «Новые» и «Ошибки» либо пока окно не закроется.
Если задач со статусом «Новая» или «Ошибка» нет, робот ночью ничего не делает и загруженные индексы не трогает.
Загруженные роботом индексы остаются кандидатами «НЕ АКТИВНА» — задача получает статус «Ждёт решения». Робот, как и ручной импорт, не активирует записи — после его работы зайдите в «Индексы цен» и переключите статус нужных строк на «Активно» (см. 6.7), иначе сметчики новый квартал не увидят.
Статусы «Ждёт решения» и «Отклонена» (новое в 2.10.0)
Успешная загрузка робота заканчивается не «Успех», а «Ждёт решения»: форма лежит кандидатом «НЕ АКТИВНА», действующая форма пары и сметы на ней не тронуты. Вверху страницы — плашка «Ждут решения: N» со ссылками «Показать задачи» и «Список форм»; в строке задачи ссылка «Решить →» открывает список форм этой пары. Решение — «Активировать» или «Отклонить…» (глава 6.7); после отклонения задача получает статус «Отклонена» с причиной.
▶ у задачи доступен для всех статусов, кроме «В работе». Перед повторной загрузкой задачи в статусах «Ждёт решения» / «Успех» / «Отклонена» система предупреждает: прежние формы и сметы не затрагиваются, будет создан новый кандидат.
«Активировать новые пары квартала» — кнопка рядом с выбором квартала. Активирует кандидатов только у пар, где действующей формы ещё нет (новый квартал); пары с действующей формой остаются на ручное решение со сравнением. Перед выполнением показывается точное число форм; итог перечисляет пропущенные.
7.5. Обновление статусов
При открытии страницы статусы задач обновляются автоматически — изменения отображаются в таблице без перезагрузки.
7.6. Журнал
Каждое действие робота записывается в журнал сервера. Формат:
[Робот] Взята задача id=42, регион=Московская область, квартал=4кв 2025
[Робот] Загрузка из ФГИС ЦС…
[Робот] Задача id=42, успех, импортировано 1234 ресурса
При ошибке — стек ошибки с пометкой «[Робот] ОШИБКА».
7.7. Известные ошибки
| Сообщение | Причина | Решение |
|---|---|---|
| «Тайм-аут соединения с ФГИС ЦС» | сайт ФГИС ЦС недоступен | повторить через час |
| «Файл не найден» | публикация для региона+квартала ещё не выпущена | ждать релиза квартала |
| «Конфликт ссылок» | удалена запись индекса во время загрузки | проверить целостность данных |
| «Не задан идентификатор региона в ФГИС ЦС» | у региона не заполнен внутренний идентификатор ФГИС ЦС | заполнить через справочник «Регионы» (см. главу 8) |
7.8. Ручной запуск
Кнопка «Запустить все задачи» вверху страницы — последовательно проходит по всем задачам со статусом «Новая» и «Ошибка». Используется для ручного восстановления после массовой ошибки.
7.9. Особенности на рабочем контуре
На рабочем контуре робот может работать несколько часов (если квартал свежий и нужно загрузить ~85 регионов). Это нормально. Систему он не перегружает — задачи выполняются последовательно по одной.
7.9.1. Предохранитель по месту на диске и выключатель (новое в 2.8.0)
01.09.2026 неограниченная загрузка индексов заполнила диск боевой базы данных до 100 %, и продукт не отвечал около 14 часов. С версии 2.8.0 у робота есть защита от повторения этой ситуации — администратору не нужно ничего настраивать, но полезно понимать, что означают сообщения на экране.
Баннер состояния. Если робот по любой причине не работает штатно, вверху страницы «Робот ИЦ», над блоком автообнаружения, появляется баннер:
| Баннер | Что значит | Что делать |
|---|---|---|
| ⏸ «Робот выключен (конфигурация)» | Автозагрузку отключили на уровне настроек сервера — например, при подозрении на повторение аварии 01.09. Задачи в очереди никуда не деваются и не портятся, просто не обрабатываются. | Включить обратно может только DevOps/архитектор — правкой конфигурации сервера и перезапуском службы. Кнопкой на экране это не переключается. |
| ⚠ «Робот остановлен: мало места» | Робот сам себя остановил, потому что размер базы данных (или свободное место на сервере приложения) приблизился к безопасному порогу. Баннер показывает, сколько занято и какой порог, а также — если из-за этого встала конкретная задача — какая именно. Задача остаётся в очереди со статусом «Новая», это не ошибка. | Обычно ничего делать не нужно — как только место освободится (например, после плановой очистки старых данных), робот сам возобновит работу на следующем цикле, без вмешательства. Если баннер держится долго — сообщить в DevOps. |
Если баннера нет — робот работает в обычном режиме, экран выглядит как раньше (раздел 7.2–7.8).
Важно: если предохранитель сработал, кнопка «Запустить» у конкретной задачи (7.2) и кнопка «Запустить все задачи» (7.8) тоже не запустят загрузку, пока не появится место — так же, как и автоматический ночной запуск. Это сделано специально, чтобы ручной запуск не мог обойти защиту от переполнения диска.
7.10. Ночные роботы обнаружения (новое в 2.6.2)
Помимо робота загрузки индексов, в системе работают роботы обнаружения — они автоматически следят за появлением новых данных и сообщают администратору. Работают в ночном окне 02:00–05:00.
Автообнаружение нового квартала индексов
Робот периодически проверяет ФГИС ЦС на публикацию индексов нового квартала.
- При обнаружении нового квартала он заводит его автоматически, после чего можно запускать загрузку индексов (см. 7.3).
- Это полная автоматизация: администратору не нужно вручную отслеживать выход новых кварталов.
Сверка квартала с фактом форм (новое в 2.10.1)
Раньше ночной робот считал квартал «полным», если на все регионы есть задачи, — даже когда сами формы пар были удалены или не загрузились. Теперь он сверяет задачи с фактом: есть ли у пары «регион + квартал» загруженная форма (в любом статусе — «Активно», «Не активна», «Архив»).
Что делает робот каждую ночь (и по кнопке «Проверить сейчас»):
- Проверяет ФГИС ЦС. Если ФГИС недоступна — в журнале строка
ERROR, но сверка продолжается по уже известным кварталам. - Текущим считается самый новый квартал — из ФГИС или из тех, по которым есть задачи.
- Для текущего квартала: задача «Успех» / «Ждёт решения», у которой формы нет, возвращается в очередь («Новая»). Источник задачи не меняется. В комментарии: «Форма пары отсутствует, возвращено в очередь сверкой дд.мм.гггг чч:мм (было Успех)». Дальше её обычным порядком загрузит робот (7.4).
- Задачи, у которых форма есть, не трогаются. Для пар без задачи и без формы создаются новые задачи.
- Старые кварталы только проверяются — задачи в очередь автоматически не возвращаются (см. ниже).
Строки журнала.
| Строка | Что значит | Что делать |
|---|---|---|
| «⚠ {квартал}: в охвате N, форм M, задач USPEH K (без формы X) → возвращено в очередь R, отклонено оператором O …» (бейдж «Докачка») | У текущего квартала нашлись задачи без формы. R из них возвращены в очередь | Ничего: робот загрузит их в ближайшее окно. Дополнительные хвосты: «в работе P», «уже в очереди Q», «докачка недостающих регионов: C», «уже загружено вручную: S» |
| «…отклонено оператором O» | Пара без формы, но задачу ранее отклонил оператор — робот её не возвращает | Если форма всё-таки нужна — нажмите ▶ на задаче |
| «⚠ {квартал}: форм M из N, задач USPEH X без формы — не возвращаем автоматически (старый квартал); перезалив — ▶ на задаче» | Расхождение в старом квартале | Решите, нужен ли перезалив; если да — ▶ на нужных задачах. Кнопка «Создать задачи на квартал» такие задачи не возвращает |
| «Квартал «…» (старый) — докачка недостающих регионов: C» | В старом квартале созданы задачи для регионов без задачи и формы | Ничего: робот их загрузит. Если загрузка старого квартала не нужна — удалите задачи |
«Сверка квартала «…» упала: …» (ERROR) |
Сбой сверки одного квартала; остальные проверены | Сообщить в DevOps, если повторяется |
| «…; робот выключен (robot.price-index.enabled=false) — возврат в очередь не выполнен» | Робот отключён настройкой сервера: расхождение посчитано, но задачи не возвращены | Включить робот может DevOps (7.9.1); после включения следующая сверка вернёт задачи |
Строка «Новых кварталов нет, очередь полна» теперь появляется только если расхождений нет.
Ограничения.
- Возврат в очередь запускает повторную загрузку: она, как и всегда (7.3), сначала удаляет данные пары, затем качает файл. Но возвращаются только пары, у которых формы уже нет, — терять нечего.
- Когда в охват добавляется регион (заполнены идентификатор ФГИС и код ФСНБ в справочнике «Регионы»), ночная сверка создаст ему задачи и по старым кварталам, где уже есть задачи, и робот их скачает. Если старые кварталы докачивать не нужно — удалите лишние задачи до ночи.
- Экран «Робот ИЦ» не изменился; ответ «Проверить сейчас» дополнен служебными полями, на экране их нет.
Журнал проверок на экране «Робот ИЦ» (новое в 2.11.1, №177). В блоке «Авто-обнаружение нового квартала» показана одна последняя проверка: дата, статус и текст. Более ранние проверки скрыты под ссылкой «Показать историю (N)». Если проверок ещё не было, выводится «Журнал пуст…», а ссылки нет. После ручной проверки новая запись появляется сверху.
Детект новой редакции ФСНБ
Робот следит за реестром нормативной базы (ФРСН) на появление новой редакции ФСНБ. Запуск — ежедневно в 03:00; вручную — кнопкой «Проверить сейчас» на экране «Загрузка ФСНБ».
Как робот определяет новейшую редакцию (уточнено в
2.7.0). Реестр ФРСН не отсортирован — запись более нового
приказа может лежать раньше более старого. Поэтому робот выбирает
новейшую редакцию по дате приказа (при равных датах —
по более поздней записи реестра), а не по порядку записей. Затем сверяет
её с уже загруженными редакциями по трём признакам: номер
приказа (нормализованный — 696пр и
696/пр считаются одним приказом), дата
приказа и номер дополнения
(доп. №18 и доп. №18.1 — разные редакции, даже
если приказ один и тот же).
Что администратор видит в журнале:
| Статус | Когда | Что делать |
|---|---|---|
| FOUND_NEW | новейшая по дате редакция ещё не загружена | скачать ZIP редакции с ФГИС ЦС вручную и импортировать (см. главу 4) |
| NO_NEW | новейшая по дате редакция уже загружена | ничего |
| ERROR | реестр ФРСН недоступен или ответ не разобран | повторить проверку позже |
Строка FOUND_NEW называет редакцию однозначно —
номер приказа, дату приказа и номер дополнения,
например: «Новая редакция ФСНБ: доп. №18.1, приказ 435/пр от
09.07.2026».
- Если скачивание заблокировано проверкой (captcha), робот всё равно фиксирует факт появления редакции и сообщает о нём — импорт выполняется вручную (см. главу 4).
- Записи реестра, у которых дату приказа разобрать не удалось (старые записи без приказа в названии), в выборе не участвуют, но не теряются молча — их количество указывается в сообщении журнала.
Сверка по ключу записи реестра (новое в 2.8.0). Если
при загрузке ФСНБ администратор подтвердил баннер «Обнаружена новая
редакция» (см. 4.2), редакция сохраняет прямую ссылку на запись реестра.
При следующей проверке робот сначала ищет совпадение по этой ссылке —
если оно есть, вердикт NO_NEW не зависит от текста
названия/приказа. Для редакций без привязки (все загруженные до 2.8.0, и
любая загрузка без подтверждения баннера) сверка по-прежнему идёт по
признакам из названия (приказ + дата + дополнение) — тот же порядок, что
и раньше.
Ограничение (для редакций без привязки к реестру).
Если название загруженной редакции заполнено вручную и сильно отличается
от реестрового, возможен повторный FOUND_NEW на уже
загруженную редакцию — заполняйте название при импорте в формате
реестра, либо подтверждайте баннер привязки на форме загрузки (4.2),
чтобы полностью снять этот риск.
Журнал обнаружений
Все срабатывания роботов обнаружения записываются в журнал (robot_discovery_log) — что и когда было найдено. Журнал помогает убедиться, что система вовремя замечает новые кварталы и редакции.
8. Справочники
В админке поддерживаются несколько справочников, влияющих на расчёты и интерфейс пользовательского приложения.
8.1. Кварталы
Справочник кварталов: год, номер (1–4), название, дополнительные поля.
Колонки таблицы
| Колонка | Описание |
|---|---|
| ID | внутренний |
| Год | например 2025 |
| Номер | 1 / 2 / 3 / 4 |
| Название | например «4 квартал 2025 г.» |
| Письмо Минстроя — название | нормативное основание |
| Письмо Минстроя — номер | |
| Письмо Минстроя — дата | |
| Код ФСНБ | код для ФГИС ЦС |
Действия
| Кнопка | Назначение |
|---|---|
| + Создать | окно с формой |
| Редактировать | в строке — окно |
| Удалить | если на квартал не ссылаются индексы — удаляет; иначе показывает ошибку |
Поля формы (создание/редактирование)
- Год / Номер / Название (генерируется автоматически из года и номера, можно переопределить).
- Письмо Минстроя: название (полное), номер, дата (для отчёта «02 ФСНБ»).
- Код ФСНБ.
8.2. Страны
Простой справочник: ID, код (ISO), название.
| Действие | Описание |
|---|---|
| + Создать | окно |
| Редактировать | окно |
| Удалить | если нет регионов — удаляет |
8.3. Регионы
Список регионов России (и других стран при расширении).
| Колонка | Описание |
|---|---|
| ID | |
| Страна | связь со справочником стран |
| Код | например «RU-MOW» |
| Название | «Москва» |
| Идентификатор ФГИС ЦС | для робота загрузки индексов цен |
| Код ФСНБ | для импорта индексов |
В версии 2.0.0 справочник регионов России заполнен (с учётом многозонных — берётся первая зона).
Особенности
- Идентификатор ФГИС ЦС обязателен для работы робота (см. главу 7).
- Многозонные регионы (Якутия, Красноярский край, Иркутская область, Дальний Восток) — добавлены отдельные строки для каждой зоны.
- Удаление региона невозможно, если есть индексы цен; нужно сначала удалить их.
8.4. Единицы измерения
Конвертация единиц для подмены выбираемых материалов (см. руководство пользователя, главу 10).
| Колонка | Описание |
|---|---|
| Из | например «кг» |
| В | например «т» |
| Множитель | 0,001 (для кг → т) |
| Категория | масса / длина / площадь / объём / прочее |
Создание / редактирование / удаление через окна.
Используется системой при подмене абстрактного ресурса конкретным с другой единицей измерения.
Это не «удобство», а условие подбора. С версии 2.7.2 количество выбираемого материала хранится в единицах абстрактного ресурса, а в смету идёт умноженным на множитель из этого справочника. Нет пары единиц — количество вычислить нечем, поэтому материал не подбирается автоматически и не выбирается вручную (кнопка «Применить» у пользователя заблокирована), а у ресурсов «количество определяется проектом» позиция считается нулевой суммой с пометкой «⚠ ед.изм. не переводится». Полнота этого справочника — администраторская задача, и она влияет на деньги в смете.
Особенности
- Множитель применяется к количеству независимо от источника — и к норме расхода из ФСНБ, и к количеству, заданному пользователем (с 2.7.2). До 2.7.2 два источника жили по разным правилам, из-за чего на паре т/кг смета расходилась в 1000 раз (дефект D-24); формулировка «множитель только к норме» из 2.7.1 отменена.
- Пользователь по-прежнему вводит количество в единицах выбранного материала — приведение к единицам абстрактного ресурса система делает при сохранении. У ресурсов с признаком «количество определяется проектом» поля ввода нет вовсе: количество берётся из ВОР (руководство пользователя, 10.8).
- Смена материала на материал в других единицах внутри окна выбора: множитель приводит уже введённое количество к новой единице, чтобы физический объём не изменился (пользователю это видно как «⇄ пересчитано из 20 кг»).
- Достаточно одной строки на пару: обратное направление система считает как 1 / множитель.
- Нет пары — нет подбора. Так разбираются три обращения:
| Обращение пользователя | Что смотреть |
|---|---|
| «в окне выбора не подставляется количество и не нажимается „Применить“» | найдите единицу абстрактного ресурса и единицу материала, добавьте пару — поведение восстановится без перезапуска |
| «материал не подобрался сам, стоит „⚠ не подобран“» | автоподбор берёт кандидата с совпадающей единицей, иначе — с переводимой; если ни того, ни другого нет, он намеренно не подставляет ничего |
| «позиция в смете стоит нулевой суммой, пометка „⚠ ед.изм. не переводится“» | ресурс «из проекта», пары единиц нет; после добавления пары сумма появится при ближайшем пересчёте сметы |
- Пару, которой не существует физически (например «м3 → шт» — штуки из кубометров без объёма изделия не выводятся), в справочник добавлять нечего: здесь верное действие — подобрать материал в единице абстрактного ресурса.
8.5. Характеристики
Меню → «Характеристики» (раздел «Алгоритмы»).
Словарь характеристик объекта, сметы, раздела и работы (см. руководство пользователя, главу 11).
| Колонка | Описание |
|---|---|
| Код | например «altitude_m» |
| Название | «Высота над уровнем моря, м» |
| Тип | Логический / Целое / Дробное / Список |
| Категория | для группировки в форме |
| Описание | подсказка в интерфейсе |
| По умолчанию | значение по умолчанию |
| Уровни | на каких уровнях может задаваться (объект, смета, раздел, работа) |
| Активна | флаг |
Для типа «Список» — отдельный справочник пар «код → название».
8.6. Обоснования коэффициентов
Меню → «Обоснования коэф.» (раздел «Алгоритмы»).
Справочник обоснований применения поправочных коэффициентов (см. руководство пользователя, главу 8). Используется в калькуляторе при выборе обоснования.
Колонки таблицы
| Колонка | Описание |
|---|---|
| Код | например «421/пр_2020_п.58_пп.б» |
| Нормативный документ | приказ Минстроя (421/пр_2020, 571/пр_2022, 812/пр_2020, 774/пр_2020) |
| Название | заголовок |
| Тип | Технологический / ВСПМ / Перевозка / Снижение производительности / Повышенный ОТ / Коэф. НР / Коэф. СП / Прочее |
| Сборники | к каким типам работ применим («ГЭСН, ГЭСНм» или «*» — везде) |
| Активен | флаг |
Форма редактирования
Полная форма с вкладками:
- Основное: код, название, описание, нормативный документ, тип, сборники, активность, типы объектов, ссылка на раздел в PDF.
- Значения: какие элементы (ОТ / ЭМ / ОТм / МАТ / НР / СП) и как (множитель × N / по расчёту / по диапазону / процент от другого элемента) применяются.
- Режим объединения: как несколько применённых коэффициентов взаимодействуют (умножение / максимум / альтернатива).
- Альтернативная группа: код группы — внутри одной группы можно выбрать только один.
- Исключения: какие коэффициенты отменяет.
- Связи с характеристиками: какие характеристики делают этот коэффициент применимым.
Связь с характеристиками
В форме обоснования можно задать связи с характеристиками: «применимо, если тип объекта = ремонт» или «применимо, если высота над уровнем моря > 1500». При выборе обоснования в калькуляторе значение из диапазона может предвыбираться.
В версии 2.2.21 эта функциональность присутствует в схеме данных, но автозаполнение в интерфейсе ещё не активно.
8.7. Ценовые тарифы (с 2.10.0)
Меню Справочники → Ценовые тарифы. Справочник задаёт четыре режима расчёта сметы, которые пользователь выбирает при создании сметы: ФСНБ, Эконом, Комфорт, Бизнес.
| Параметр | ФСНБ | Эконом | Комфорт | Бизнес |
|---|---|---|---|---|
| Коэффициент на работы (множитель на оплату труда рабочих) | 1 | 1 | 2 | 3 |
| Коэффициенты на машины и материалы | 1 | 1 | 1 | 1 |
| Коэффициенты НР и СП | 1 | 0 | 0 | 0 |
| НДС на работы | да | нет | нет | нет |
| НДС на машины и материалы | да | да | да | да |
Значения — стартовые, из исходной постановки; в справочнике они редактируются.
Действия. Кнопка ✎ у строки открывает форму: код (только чтение), группа «Коэффициенты» (множители на работы, машины, материалы, НР и СП; число от 0 до 100) и группа «НДС» (флажки по видам затрат). В строке показано «изменено <дата> (пользователь …)».
Ограничения.
- Тарифов ровно четыре: кнопок «Создать» и «Удалить» нет, код не меняется.
- Значение вне 0…100 или пустое отклоняется, сообщение показано у поля.
- Изменение действует только на новые расчёты. Каждая смета хранит снимок коэффициентов на момент создания или последнего пересчёта, поэтому сохранённые сметы и опубликованные цены не меняются, пока смета не пересчитана; цены каталога на сайте подхватят правку после пересчёта эталонной сметы и пересборки каталога.
- После перезапуска сервиса значения не сбрасываются на стартовые.
В разделе «Каталог работ» (глава 25) в строке привязки сметы к вариации показаны тариф сметы и раздел («смета целиком», если раздел не задан).
8.8. Резервная копия перед массовым редактированием
Перед массовым обновлением справочников (особенно обоснований) рекомендуется бэкап базы данных. Изменения в справочнике обоснований сразу влияют на все будущие применения коэффициентов в калькуляторе.
9. Технологические группы
«Технологическая группа» — справочник, объединяющий конкретные ресурсы для замены абстрактных в работах. Например, ТГ «28.18.023» = «Плитки керамогранитные» содержит варианты разных производителей и размеров.
В админке доступен только просмотр (чтобы отлаживать выбор материалов в пользовательском приложении).
9.1. Доступ к технологическим группам
Отдельного пункта меню нет — список технологических групп доступен:
- из карточки ФСНБ (см. главу 3.2) — кнопка «Технологические группы»;
- из карточки работы (см. главу 3.6) — раздел «Технологические группы» внизу страницы — клик по конкретной группе открывает её содержимое.
| Колонка | Описание |
|---|---|
| ID | внутренний идентификатор |
| Код ТГ | например «28.18.023» |
| Название | «Плитки керамогранитные» |
| ID ФСНБ | к какой версии ФСНБ привязана |
| Кол-во ресурсов | в группе |
Поиск по коду или названию.
9.2. Содержимое группы
Клик по строке ТГ — список конкретных ресурсов:
| Колонка | Описание |
|---|---|
| № | порядковый |
| Код ресурса | например «06.2.05.03-0003» |
| Название | полное наименование |
| Ед. изм. | |
| Базисная цена | |
| Тек. цена | если есть в активном индексе |
| Индекс |
Используется для проверки: какие конкретные коды доступны для замены абстрактного ресурса в окне выбора материала пользовательского приложения.
9.3. Откуда берутся технологические группы
Загружаются вместе с ФСНБ при импорте ZIP (см. главу 4). В файлах ФСНБ есть отдельный лист с описанием технологических групп и их составом.
В админке группы только для просмотра — редактирование не предусмотрено (структура задаётся Минстроем).
9.4. Связь с абстрактными ресурсами
Каждый абстрактный ресурс работы имеет привязку к технологической группе (одной или нескольким). Например, для абстрактного ресурса «Плиты керамогранитные» в работе ГЭСН 11-01-047-01:
технологические группы: 28.18.023
Система ищет все ресурсы для этой группы, выбирает первый подходящий (или предпочитает того, у кого есть индекс цены). Пользователь может переопределить через окно выбора материала.
9.5. Использование при отладке
Если в калькуляторе в выбираемых материалах выбран не тот материал (например, показывается «Дно колодца» вместо «Плитка керамогранитная») — проверьте:
- Связь абстрактного ресурса с правильной технологической группой.
- Содержимое группы в этом разделе — нужный ресурс есть в списке.
- Если ресурс есть, но не выбирается — система выбирает по «первой попавшейся» цене. Решение — пользователь явно выбирает в окне выбора материала (выбор сохраняется в конкретной смете).
9.6. Пустая технологическая группа (с версии 2.7.1)
В колонке «Кол-во ресурсов» встречаются группы с 0. Это штатное состояние справочника, а не сбой импорта: в активной редакции ФСНБ пустых групп около четверти (1 653 из 6 710). Разметка групп задаётся Минстроем, в админке не редактируется, донаполнение вручную не предусмотрено.
Раньше пустая группа приводила к тупику в калькуляторе: у абстрактного ресурса не было ни материала, ни кнопки подбора, а его стоимость выпадала из сметы. С версии 2.7.1 это закрыто на стороне пользовательского приложения:
- если группа пуста, калькулятор ищет материалы в группе
кода каталога ФСБЦ — коды вида
04.3.01.12-0001,-0002… для абстрактного кода04.3.01.12(такой канал закрывает ≈76 % «осиротевших» абстрактных кодов); - при добавлении новой работы подходящий материал (совпадает единица измерения, есть цена в текущих индексах, первый по коду) подставляется автоматически и помечается пользователю бейджем «авто»;
- в уже существующих сметах ничего не подставляется и суммы не меняются — пользователь подбирает материал сам кнопкой «🔍 Подобрать»;
- если и группа кода пуста, пользователю остаются поиск по каталогу и ручной ввод.
Обращение вида «материал не считается в смете». Порядок проверки: открыть группу абстрактного ресурса в этом разделе → если ресурсов 0, это ожидаемо, и пользователю нужно подобрать материал в окне выбора (руководство пользователя, глава 10); если ресурсы есть, но не выбираются — см. 9.5.
Аварийный рубильник. Автоподбор из группы кода
отключается переменной окружения SMETA_VM_AUTO_PICK=false
на пользовательском бэкенде (по умолчанию включён). Отключение не
возвращает старый дефект: кнопка подбора, окно выбора и ручной ввод
остаются, меняется только то, что материал не подставляется сам.
9.7. Известные особенности
- Один абстрактный ресурс может ссылаться на несколько технологических групп; система проверяет по очереди.
- Технологические группы привязаны к версии ФСНБ — при смене ФСНБ сметы тот же абстрактный ресурс может вести в другие группы.
- Один и тот же ресурс может входить в несколько групп (например, плитка одна и та же, но входит и в группу «Облицовка», и в группу «Полы»).
10. Шаблоны отчётов
«Шаблоны отчётов» — справочник доступных форматов экспорта сметы в Excel. Каждый шаблон имеет код (01, 02, …), название, описание и флаг активности.
10.1. Открытие
Меню → «Шаблоны отчётов».
10.2. Таблица
| Колонка | Описание |
|---|---|
| ID | внутренний идентификатор |
| Код | 01, 02, … — используется в адресе экспорта |
| Название | например «Смета. Стандарт» |
| Описание | расширенный текст |
| Активен | флаг — отображать ли в выпадающем списке экспорта в калькуляторе |
| Порядок сортировки | порядок в выпадающем списке |
10.3. Действия
| Кнопка | Назначение |
|---|---|
| Редактировать | окно — изменить название и описание |
| Активировать / Деактивировать | переключение активности |
Важно: добавление новых шаблонов через интерфейс не реализовано — каждый шаблон требует кода в системе. Текущие шаблоны:
- 01 — стандартный отчёт ЛСР
- 02 — отчёт по Приложению №3 Приказа 421/пр
10.4. Шаблоны в системе
01 — Смета. Стандарт
Полная локальная смета: разделы → работы → ресурсы (ЗТ / ЭМ / МАТ / ВМ) → ФОТ → НР / СП → итоги. Формулы Excel во всех итоговых ячейках. См. руководство пользователя, главу 12.
02 — Смета. ФСНБ. Ресурсы и индексы
Формат по Приложению №3 Приказа 421/пр. Расширенная шапка, детализация по видам затрат и видам работ. См. руководство пользователя, главу 12.
10.5. Связь с пользовательским приложением
В пользовательском приложении выпадающий список «↓ Экспорт» в шапке сметы показывает только активные шаблоны.
Деактивация шаблона немедленно скрывает его из выпадающего списка (после обновления страницы у пользователя).
10.6. Известный недочёт
В версии 2.2.21 фильтр активности не применяется на сервере — список шаблонов возвращает все шаблоны. На тестовом контуре временно неактивные шаблоны включены принудительно. После исправления деактивация в админке должна сразу скрывать шаблон. Это будет в одном из ближайших релизов.
10.7. Прямой запрос экспорта
Если в адресе пользовательского приложения указан код шаблона напрямую, система всё равно выдаст файл (для сценариев и тестов). Если код невалидный (например, «99») — ответ с ошибкой.
10.8. Будущие шаблоны
Планируются:
- 03 — Смета по форме №2 Приказа Минстроя (расширенный для энергетики).
- 04 — Сводный сметный расчёт (ССР).
- 05 — Локальная смета по форме госконтракта.
Каждый новый шаблон требует:
- Реализации логики в системе.
- Добавления записи в справочник «Шаблоны отчётов».
- Описания в этой главе.
11. НПА документы
«НПА» (нормативно-правовые акты) — справочник приказов Минстроя, методик, СП, МДС. Хранятся вместе с PDF-файлами.
11.1. Открытие
Меню → «НПА документы».
11.2. Таблица
| Колонка | Описание |
|---|---|
| ID | внутренний идентификатор |
| Тип | Приказ / Методика / СП / МДС / Прочее |
| Номер | например «421/пр» |
| Дата | |
| Название | заголовок |
| Файл | имя оригинального PDF |
| Размер | в КБ / МБ |
| Активен | флаг отображения в пользовательском приложении |
11.3. Действия
| Кнопка | Назначение |
|---|---|
| + Добавить | окно создания (см. 11.4) |
| Редактировать | окно редактирования (без замены файла) |
| Заменить файл | загрузка нового PDF |
| Скачать PDF | файл сохраняется браузером сразу, без открытия новой вкладки |
| Удалить | удалить запись и файл (с подтверждением) |
11.4. Создание / редактирование
| Поле | Описание |
|---|---|
| Тип | выпадающий список |
| Номер | например «421/пр» |
| Дата | календарь |
| Название | заголовок |
| Описание | расширенный текст (необязательно) |
| PDF файл | выбор файла (только при создании; для замены — отдельная кнопка) |
| Активен | флажок |
Кнопки: Отмена / Сохранить.
11.5. Привязка к объекту / смете
В будущих версиях (не реализовано в 2.2.21):
- Привязка НПА к конкретному объекту → отображение в шапке сметы пользователя.
- Привязка к ФСНБ → автоматическая ссылка из окна выбора обоснования коэффициента.
11.6. Хранение PDF
PDF хранится в базе данных. В версии 2.1.0 проведена миграция формата хранения, улучшившая производительность и упростившая создание резервных копий.
11.7. Размер
Стандартные приказы — 50–500 КБ. Большие (с приложениями и таблицами) — до 5 МБ. Лимит загрузки — 10 МБ.
11.8. Безопасность
- Загрузка только PDF.
- Имя файла очищается от опасных символов.
- Скачивание доступно для авторизованных пользователей системы.
11.9. Стандартные документы (рекомендуется загрузить)
| Документ | Использование |
|---|---|
| Приказ 421/пр от 04.08.2020 | методика применения сметных норм |
| Приказ 571/пр от 22.06.2022 | новая редакция методики |
| Приказ 696/пр от 12.11.2025 | расширенная редакция ФСНБ-2022 |
| Приказ 812/пр от 21.12.2020 | методика накладных расходов |
| Приказ 774/пр от 11.12.2020 | методика сметной прибыли |
| МДС 81-35.2004 | методика определения стоимости (старая) |
| СП 81-2.04.2020 | свод правил по сметному нормированию |
После загрузки они появляются в окне «Методика» в пользовательском приложении (см. руководство пользователя, главу 13).
12. Обращения пользователей
«Обращения» — таблица сообщений от пользователей: ошибок и пожеланий.
12.1. Открытие
Меню → «Обращения».
12.2. Таблица
| Колонка | Описание |
|---|---|
| № | автонумерация |
| Дата | когда отправлено |
| Тип | «Ошибка» (красный бейдж) / «Предложение» (синий) |
| Тема | краткое описание |
| Пользователь | ФИО (если нет — часть e-mail до «@») и логин в скобках |
| для связи | |
| Телефон | если есть |
| Версия | системы на момент отправки (например «2.2.20») |
| Статус | «Новое» / «В работе» / «Закрыто» (планируется в будущих версиях) |
Действия в строке:
| Кнопка | Назначение |
|---|---|
| Открыть | окно с полным сообщением (см. 12.3) |
12.3. Окно просмотра
| Поле | Описание |
|---|---|
| Тема | заголовок |
| Сообщение | полный текст с переносами строк |
| Пользователь | логин, ФИО, email, телефон |
| Дата | |
| Версия системы | |
| ID объекта / сметы | если упомянут пользователем (для контекста) |
В версии 2.2.21 нет полей «Статус», «Ответ администратора», «История» — это запланировано.
12.4. Фильтры
| Фильтр | Что фильтрует |
|---|---|
| Тип | Ошибки / Предложения / Все |
| Дата от / до | |
| Поиск | подстрока в теме или сообщении |
12.5. Сортировка
По дате (по умолчанию — новые сверху). Клик по заголовку колонки переключает сортировку по этой колонке.
12.6. Уведомления администратору
При новом обращении:
- Email на адрес администратора.
- Telegram — сообщение в чат-канал.
12.7. Экспорт
Кнопка «Экспорт в CSV» — выгрузка списка обращений в CSV для отчётов.
12.8. Удаление
Удаление обращений не предусмотрено — все обращения хранятся в истории. Это сделано для аудита и анализа.
12.9. Что делать с обращением
После просмотра администратор должен:
- Если ошибка — воспроизвести, завести задачу в трекере, исправить и сообщить пользователю по email.
- Если предложение — оценить приоритет, добавить в бэклог, ответить пользователю с примерным сроком (если будет реализовано).
В будущих версиях планируется встроенное обсуждение обращения внутри приложения.
13. Пользователи
«Пользователи» — список зарегистрированных пользователей системы. С версии 2.8.0 экран не только показывает список, но и позволяет обезвредить учётную запись (см. 13.4).
13.1. Открытие
Меню → «Пользователи».
13.2. Таблица
| Колонка | Описание |
|---|---|
| ID | уникальный идентификатор |
| Логин | |
| Имя, Фамилия | как указаны в профиле. С 2.14.0 при короткой регистрации (e-mail и пароль) их нет — в колонке «Имя» тогда показана часть e-mail до «@» (правило ниже) |
| Телефон | если есть |
| Дата регистрации | |
| Статус верификации | «Подтверждён» / «Не подтверждён» |
| Объектов | счётчик |
| Смет | счётчик |
| Последний вход | дата (если есть) |
| Состояние | «Активна» или «⛔ Обезврежена <дата>» |
| Действие | кнопка «Обезвредить» / «Вернуть в работу» |
Как подписывается пользователь (с 2.14.0). Во всех экранах админки один порядок: «Имя Фамилия» → если ФИО нет, часть e-mail до «@» → если e-mail нет, логин. Пустых «null null» больше нет. Гостевые учётки («Гость», версия 2.14.0 №221) подписываются так, когда сервер начнёт передавать признак гостя.
13.3. Фильтры
| Фильтр | Что фильтрует |
|---|---|
| Поиск | подстрока в логине, ФИО или email |
| Верификация | только подтверждённые / не подтверждённые / все |
| Дата регистрации от / до |
13.4. Обезвреживание учётной записи
Зачем. Если учётная запись заведена посторонним, скомпрометирована или используется не по назначению, её нужно немедленно вывести из работы — не удаляя данные.
Как. В строке пользователя нажмите «Обезвредить». Откроется окно подтверждения: в нём указаны e-mail и логин, перечислены последствия и есть поле «Причина» (до 255 символов, видна в журнале учётной записи; поле необязательное). Подтвердите — состояние строки сменится на «⛔ Обезврежена <дата>», строка станет приглушённой.
Что происходит сразу после подтверждения:
- вход по логину и паролю перестаёт работать;
- уже выданный токен перестаёт работать немедленно — не через 8 часов: открытые сеансы пользователя на любых устройствах обрываются на первом же запросе;
- данные не удаляются — объекты и сметы остаются на месте (их количество показано прямо в окне подтверждения);
- действие обратимо.
Что видит пользователь. Обычное «Неверный логин или пароль» на форме входа. Причину отказа приложение не называет и назвать не должно — иначе по форме входа можно было бы проверять, существует ли учётная запись и не заблокирована ли она. Если пользователь обратился с вопросом «почему не пускает», объяснять причину — задача администратора, а не приложения.
Возврат в работу. Кнопка «Вернуть в работу» в той же строке (она не приглушается вместе со строкой). После подтверждения вход снова работает, дата и причина обезвреживания очищаются.
Ограничения:
- удаления учётной записи через интерфейс нет и не планируется: на пользователя ссылаются данные из 17 таблиц, удаление на рабочем контуре необратимо и выполняется только силами ответственного за инфраструктуру;
- «Сброс пароля администратором» по-прежнему не реализован — пользователь восстанавливает пароль сам через форму «Забыли пароль?»;
- если после обновления админки экран «Пользователи» открывается с
ошибкой, в журнале которой есть строка
column u.disabled does not exist, значит выкачена только админка, а серверная часть калькулятора — ещё нет. Лечится выкатомsmeta-user-backendверсии 2.8.0, а не откатом админки. Порядок выката: сначалаsmeta-user-backend, затем админка.
13.5. Признак «Эксперт»
В списке пользователей есть переключатель «Эксперт».
- Эксперту в пользовательском приложении становятся доступны дополнительные возможности по пополнению базы знаний подбора — кнопки «Сохранить в RAG» (см. главу 19).
- Признак включается и снимается администратором прямо в списке.
- Используется для привлечения опытных пользователей к разметке и улучшению качества подбора.
Запланировано в будущих версиях:
- просмотр обращений конкретного пользователя;
- сброс пароля по запросу администратора (отправка временного кода на email).
13.6. Карточка пользователя (версия 2.14.0)
Карточка собирает в одном месте всё, что есть у человека: объекты и сметы, загруженные файлы, чаты с ассистентом и журнал ваших просмотров. Разбор жалобы или первого живого пользователя больше не требует заглядывать в базу.
Как открыть. В таблице «Пользователи» нажмите на
e-mail или кнопку Карточка в колонке «Действие».
Карточка открывается и по ссылке с e-mail владельца в разделах «Чаты
пользователей» и «Файлы пользователей». У карточки свой адрес
(/users/<id>): его можно отправить
коллеге-администратору, он переживает обновление страницы (F5).
Выбранная вкладка хранится в адресе.
Шапка. E-mail (у гостевой учётки без e-mail — «Гостевая учётка» и первые 8 символов идентификатора), имя, логин, дата регистрации; бейджи Эксперт, Обезврежена (с датой), Гостевая. Пустые поля показываются как «—». Ниже — счётчики: объекты, сметы, файлы, чаты, дата последнего чата. Счётчики файлов и чатов считают только то, что видит администратор: файлы, удалённые владельцем, и удалённые сессии чата в них не входят (так же, как в главах 16 и 24).
Вкладки
| Вкладка | Что показывает |
|---|---|
| Объекты и сметы | Объекты пользователя; раскрыв объект, видите его сметы: название, статус (черновик / опубликована), итог в ₽, дату изменения. Кнопка Открыть ведёт на просмотр сметы |
| Файлы | Реестр файлов только этого пользователя (как в главе 24, без фильтра по пользователю): предпросмотр 👁 и скачивание ⤓ |
| Чаты | Диалоги только этого пользователя (как в главе 16): тред открывается в том же окне, вложения скачиваются |
| Действия | С 2.16.0: журнал того, что пользователь делал в калькуляторе, с точностью до секунды (см. главу 28) |
| Журнал просмотров | 100 последних записей о том, что администраторы открывали у этого пользователя (см. ниже) |
Просмотр чужой сметы. Страница сметы показывает её так, как видит владелец: разделы, работы, ресурсы, накладные и сметную прибыль, итог с НДС. Суммы совпадают с теми, что у владельца, копейка в копейку — админка ничего не пересчитывает. Сверху стоит плашка «Чужая смета · только просмотр · факт просмотра записан в журнал».
Журнал просмотров. Каждое открытие сметы, треда чата, предпросмотр и скачивание файла записывается: время, логин администратора, действие, объект, владелец, IP. Списки (пользователи, чаты, файлы) в журнал не пишутся. Журнал читается только на вкладке карточки; изменить или удалить запись из админки нельзя. Это работает и на старых экранах — «Чаты пользователей» и «Файлы пользователей».
Если что-то не открывается
- «Пользователь не найден» — неверный идентификатор в адресе (ссылка «← Пользователи» вернёт к списку).
- «Смета удалена владельцем» — смету удалили между открытием списка и просмотром; в журнал это не пишется.
- «Не удалось записать факт просмотра» (503) — содержимое не показывается, пока журнал не записан: сначала след, потом данные. Повторите позже; если не проходит — сообщите разработчикам.
- Ошибка одной вкладки не ломает остальные: сообщение показывается внутри вкладки.
- «Хранилище файлов недоступно» — как в главе 24: вкладка «Файлы» и вложения в треде гаснут, остальная карточка работает.
Ограничения
- Только чтение: нет редактирования сметы, пересчёта, публикации, удаления, а также выгрузки (XLSX, печать) чужой сметы.
- Отдельного права на просмотр нет: доступ к карточке есть у каждого, кто входит в админку, — поэтому и ведётся журнал. Просматривайте только то, что нужно для разбора обращения.
- Файлы, удалённые владельцем, не показываются даже заглушкой.
- На телефоне (ширина 390 px) вкладки переносятся на вторую строку, широкие таблицы прокручиваются внутри карточки.
13.7. Лимит выгрузки
Максимум 1000 пользователей за один запрос. Для больших систем (более 1000) запланирована постраничная навигация.
13.8. Регистрация
Регистрация пользователей контролируется флагом в настройках сервера. Если флаг выключен, новые пользователи не могут регистрироваться сами — только через прямые операции с базой данных.
13.9. Подтверждение email
С версии 2.8.0 подтверждение e-mail отключено: учётная запись работает сразу после регистрации, код на почту не отправляется. Колонка «Верификация» и одноимённый фильтр остаются в списке и показывают исторические значения; у всех новых учётных записей там «Подтверждён».
13.9а. Защита форм авторизации (версия 2.8.0)
Пользовательские формы входа, восстановления пароля и регистрации закрыты от автоматического подбора. Администратору полезно знать пороги — с ними приходят обращения «не пускает», «не приходит письмо»:
| Ограничение | Значение | Что видит пользователь |
|---|---|---|
| Запросов к формам авторизации с одного сетевого адреса | 120/мин (всплеск до 20 сверх) | «Слишком много попыток. Повторите позже.», кнопка гаснет с отсчётом |
| Неудачных попыток входа в одну учётную запись | первые 3 бесплатно, дальше задержка до 4 сек., окно 15 минут | вход отвечает медленнее; успешный вход сбрасывает счётчик |
| Повторная отправка кода восстановления | не чаще 1 раза в 60 сек., не более 5 в час | «Письмо уже отправлено, код из него действует; повторно через N сек.» |
| Срок действия кода восстановления | 10 минут, не более 10 попыток ввода | «Неверный или истёкший код» |
| Регистраций с одного адреса e-mail | 3 в час | «Слишком много попыток. Повторите позже.» |
Важное для разбора обращений:
- форма восстановления отвечает одинаково для существующего и несуществующего адреса, а форма регистрации — для свободной и занятой пары логин/e-mail. Это сделано намеренно; проверять существование учётной записи следует по этому списку, а не «пробой» формы;
- смена пароля через восстановление обрывает сессии пользователя на всех устройствах — жалоба «выкинуло на другом устройстве» после смены пароля не является сбоем;
- пороги настраиваются на сервере ответственным за инфраструктуру; в админке их нет.
13.9б. Разлогин при обновлении ключа JWT (версия 2.8.0)
Отдельные релизы smeta-user-backend меняют ключ подписи
токена (плановая ротация или мера безопасности) — тогда
все пользователи один раз возвращаются на форму входа,
даже если их сессия ещё не истекла по времени (обычный срок — 8 часов).
Это штатное поведение, не инцидент:
- пользователь видит обычную форму входа, а не сообщение об ошибке;
- логин и пароль не меняются — входит теми же данными;
- задевает всех сразу, а не выборочно — если обращение о разлогине пришло не одно и сразу после выката, объяснять как «сессия истекла» не нужно, это ротация ключа;
- в списке пользователей (13.1–13.8) это никак не отражается: колонки «Последний вход» и статус учётной записи не меняются.
13.9в. Согласие с Пользовательским соглашением (версия 2.9.0)
С версии 2.9.0 при регистрации пользователь обязательно отмечает
согласие с Пользовательским соглашением и Политикой конфиденциальности
(см. руководство пользователя, 1.4). Факт согласия сохраняется отдельно
от карточки пользователя, в таблице user_consent: кто
(user_id), когда (accepted_at), на какую
редакцию документов (revision) и каким клиентом
(channel — web или android).
В интерфейсе админки отдельного экрана для этого пока нет. Если по обращению нужно проверить факт согласия конкретного пользователя, ответственный за инфраструктуру может выполнить запрос к базе:
select revision, accepted_at, channel
from user_consent
where user_id = (select id from app_user where login = '<логин>')
order by accepted_at desc;Пустой результат означает, что пользователь зарегистрирован до выхода 2.9.0 (согласие у таких пользователей не запрашивалось задним числом).
13.10. Аналитика
Базовая аналитика по таблице пользователей:
- общее число — счётчик в верхнем виджете;
- активные за месяц — пользователи с входом за последние 30 дней;
- распределение по объёму смет (для платных тарифов в будущем).
Расширенная аналитика пользователей пока не реализована.
14. Тестирование
«Тестирование» — запуск автоматических сценариев из админки. Доступно только на тестовом контуре (защита от случайного запуска на рабочем).
14.1. Открытие
Меню → «Тестирование».
14.2. Доступные сценарии
В версии 2.2.21 зарегистрированы:
| Сценарий | Описание | Шагов | Время |
|---|---|---|---|
| Сценарий №1: Полный цикл | регистрация → объект → смета → работы → проектные ресурсы → выбираемые материалы → экспорт → обратная связь → НПА | 10 | ~5 мин |
| Сценарий №2: Управление | вход → навигация → редактирование → представления → публикация → удаление → выход | 12 | ~3 мин |
| Сценарий №3: Мобильный | мобильный экран 375×812, адаптив верхней панели, прокрутка, ФОТ, окна | 12 | ~3 мин |
В версии 2.2.21 сценарии 1, 2, 3 устарели по интерфейсу — требуют адаптации после изменений в калькуляторе. Их нужно переписать или удалить.
«Золотой» сценарий — основной критерий регрессии — пока запускается только из командной строки, не из админки. Подключение в раздел «Тестирование» запланировано.
14.2.1. Что нужно для запуска
Сценарии 1–3 входят в калькулятор под тестовыми учётными записями
тестового контура. Их пароль не хранится ни в коде, ни
в документации: он задаётся ответственным за инфраструктуру в настройках
сервера админки (переменная E2E_TEST_PASSWORD), а само
значение лежит в защищённом хранилище проекта.
Если пароль на сервере не задан, запуск не
начинается: браузер не открывается, в таблице запусков
появляется строка со статусом «Ошибка», пройдено 0
шагов из 10 (12), сообщение — «Скрипт завершился с кодом 2», скриншота
нет. В журнале сервера при этом видно
[ABORT] не задана переменная окружения E2E_TEST_PASSWORD.
Из админки это не исправляется — обратитесь к ответственному за инфраструктуру. После плановой смены паролей тестового контура значение меняется вместе с паролями тестовых учёток, поэтому первый прогон после такой смены стоит сделать сразу, чтобы убедиться, что сценарии проходят авторизацию.
14.3. Кнопки на странице
| Кнопка | Назначение |
|---|---|
| Запустить сценарий №1 | отправляет на сервер запрос на запуск |
| Запустить №2 / №3 | аналогично |
| Обновить | перезагрузить список запусков |
14.4. Таблица запусков
| Колонка | Описание |
|---|---|
| ID запуска | |
| Сценарий | №1 / №2 / №3 |
| Дата старта | |
| Статус | «Выполняется» / «Успех» / «Ошибка» |
| Кол-во шагов | пройдено / всего |
| Длительность | сек / мин |
Действия: Открыть — детали запуска (ниже).
14.5. Детали запуска
Список шагов сценария:
| Колонка | Описание |
|---|---|
| № шага | |
| Название | например «Регистрация пользователя» |
| Статус | «Выполняется» / «Успех» / «Ошибка» |
| Длительность | |
| Сообщение | для ошибки — текст ошибки |
| Скриншот | ссылка на PNG (если упало) |
14.6. Защита от запуска на рабочем контуре
Раздел «Тестирование» доступен только на тестовом контуре. На рабочем контуре пункт меню скрыт, попытка обратиться к нему завершается отказом в доступе.
14.7. Покрытие тестами
| Уровень | Кол-во |
|---|---|
| Серверные модульные тесты пользователя | 128 |
| Серверные интеграционные тесты пользователя | 19 |
| Серверные тесты админки | 17 + 23 |
| Клиентские модульные тесты | 41 |
| Клиентские сценарные тесты | 58 / 61 (3 нестабильных) |
| «Золотой» сценарий 02 (десктоп + мобильный) | 2 (зелёные, копейка-в-копейку) |
14.8. Автоматизированная сборка
Сейчас (2.2.21) автоматического CI нет — тесты запускаются вручную перед релизом. В планах автоматический прогон на каждое изменение в релизных ветках.
14.9. Учётная запись для сценарных тестов (версия 2.8.0)
Сценарии 2 и 3 больше не подбирают логин перебором —
они входят под одной постоянной тестовой учётной записью. Логин и пароль
берутся из переменных окружения E2E_LOGIN и
E2E_PASSWORD службы админки (в репозитории их нет), задаёт
их ответственный за инфраструктуру.
Причина: перебор логинов с одного адреса — это ровно то поведение, от которого защищают ограничения версии 2.8.0, и сценарий падал бы на собственном шаге входа.
Что нужно, чтобы сценарии проходили:
- переменные
E2E_LOGIN/E2E_PASSWORDзаданы в службе админки тестового контура; - у этой учётной записи на тестовом контуре есть хотя бы один объект со сметой — сценарии работают с готовыми данными;
- учётная запись не обезврежена в разделе «Пользователи» (см. 13.4), иначе вход будет отвергнут.
Если переменных нет, сценарий не идёт в сеть вовсе и пишет в протокол
шаг со статусом ERROR и текстом «нужны переменные окружения
E2E_LOGIN и E2E_PASSWORD».
15. Документация
«Документация» — страница со ссылками на руководства пользователя и администратора, а также Release Notes.
15.1. Открытие
Меню → «Документация».
15.2. Структура страницы
Заголовок
«Документация» + подзаголовок «Руководства, инструкции и Release Notes — Версия 2.2.21».
Карточки руководств
Две большие карточки:
| Карточка | Содержит ссылки |
|---|---|
| 📘 Руководство администратора | HTML / PDF / Markdown |
| 📗 Руководство пользователя | HTML / PDF / Markdown |
Каждая ссылка открывает соответствующий документ:
| Тип | Описание |
|---|---|
| HTML | многостраничный сайт |
| для скачивания и печати | |
| Markdown | исходники на GitHub |
Карточки Release Notes
Под руководствами — карточки релизов с обратным хронологическим порядком:
🚀 v2.2.21 1 мая 2026
<краткое описание>
[HTML] [Markdown]
🚀 v2.1.0 16 апреля 2026
<краткое описание>
[HTML] [Markdown]
🚀 v2.0.0 11 апреля 2026
...
При новом релизе администратор добавляет новую карточку в начало секции «Release Notes».
15.3. Что нужно сделать после релиза
- Обновить версию в шапке страницы документации.
- Добавить карточку нового релиза в начало секции «Release Notes».
- Пересобрать админку и развернуть.
- Положить собранную документацию (HTML и PDF) внутрь архива админки перед сборкой — она разворачивается на сервере вместе с приложением.
15.4. Генерация документации
Для каждого руководства существует скрипт сборки
(generate.sh):
- собирает HTML через MkDocs Material;
- собирает PDF через pandoc + xelatex.
Результат:
<руководство>/index.html— многостраничный сайт.<руководство>.pdf— единый PDF.
15.5. Версионирование документов
Каждая большая версия (2.0, 2.1, 2.2, …) — отдельная подпапка
docs/v2/, docs/v3/ и т. д.
Когда выходит новая мажорная версия:
- Скопировать папку текущей версии в новую (
docs/v2/→docs/v3/). - Обновить содержимое.
- На странице «Документация» переключить ссылки на новую версию.
- Старые ссылки остаются работающими (для пользователей старой версии).
15.6. Скриншоты
В каждой главе руководств есть папка img/ со скриншотами
интерфейса. Скриншоты создаются автоматически через сценарий, который
пробегает по интерфейсу и снимает нужные экраны.
В версии 2.2.21 скриншоты руководства пользователя и администратора актуализированы для новой версии интерфейса.
16. Чаты пользователей
Раздел «Чаты пользователей» позволяет администратору просматривать диалоги пользователей с чат-ассистентом — для разбора качества подбора, обращений и обучения.
16.1. Открытие
Меню → «Чаты пользователей».
16.2. Список диалогов
| Колонка | Что показано |
|---|---|
| Пользователь | владелец диалога: «Имя Фамилия (e-mail)»; без ФИО — e-mail, без него — логин (порядок «Имя Фамилия» с 2.14.0; раньше в чатах и файлах было «Фамилия Имя») |
| Объект / ВОР | закреплённые за чатом объект и ведомость работ |
| Сообщений | число реплик в диалоге |
| Обновлён | дата последней активности |
| Файлы | 📎 и число файлов, приложенных в диалоге; — — вложений нет |
Список отфильтрован по владельцу: администратор видит диалоги пользователей в режиме просмотра.
16.3. Просмотр диалога
Клик по строке открывает переписку: сообщения пользователя и ответы ассистента в хронологическом порядке, включая показанные карточки вариантов расценок и подобранные позиции.
Восстановление контекста
Если объект или ведомость работ не были закреплены явно, панель показывает контекст, восстановленный из хода диалога (по действиям ассистента). Такие данные помечаются значком «~ из диалога», чтобы отличать их от явно закреплённых.
16.4. Файлы, приложенные к сообщениям
Под сообщением пользователя, к которому был приложен файл, показывается чип вложения — значок типа, имя файла и его размер:
- клик по чипу — скачать файл под исходным именем;
- 👁 — открыть предпросмотр поверх диалога (картинки, PDF, текст и CSV; для таблиц Excel, Word и архивов предлагается скачивание). Диалог под окном предпросмотра остаётся открытым.
Блок «Вложения чата» (с 2.14.0). Над лентой
сообщений открытого диалога стоит блок Вложения чата
(N): все файлы диалога одним списком — имя, тип (таблица, PDF,
изображение, архив, документ), размер, время сообщения и кнопка
⤓ Скачать. Файл сохраняется под исходным именем, в том
числе с кириллицей (ВОР.xlsx). Если в диалоге нет вложений,
блока нет. Тот же блок виден в треде на вкладке «Чаты» карточки
пользователя (п. 13.6). Чипы у сообщений остаются как были.
Файлы, которые пользователь удалил у себя, администратору не показываются: под таким сообщением чипа нет вовсе. Поэтому диалог, где все вложения удалены, выглядит как переписка без файлов, а в колонке «Файлы» стоит —.
Если файловое хранилище недоступно, чипы вложений и кнопки блока «Вложения чата» гаснут и перестают нажиматься — сам диалог, история и контекст при этом читаются как обычно. Если хранилище настроено, но не отвечает, чип гаснет не сразу: первый клик по нему вернёт «Хранилище недоступно», и уже после этого чипы становятся неактивными. Признак недоступности общий для всего раздела файлов: подробнее — глава 24, п. 24.3.
Открытие диалога записывается в журнал просмотров (п. 13.6). Полный список файлов всех пользователей, фильтры и сверка с хранилищем — в главе 24. Оттуда действует и обратный переход: кнопка → в реестре открывает нужный диалог с подсветкой сообщения.
16.5. Чем полезен раздел
- Разобрать, почему ассистент подобрал ту или иную расценку.
- Связать обращение пользователя с конкретным диалогом.
- Найти примеры удачного и неудачного подбора для разметки и обучения (см. главы 17 и 19).
- Достать исходный файл пользователя (ведомость, чертёж), на который он жалуется, — см. 16.4.
Сколько новых диалогов начинают каждые сутки, раздел не считает — это отдельная строка «Новых чатов» в утренней сводке в Telegram (см. 23.1).
16.5. Обращение «Помощник временно недоступен» (с 2.8.0)
С версии 2.8.0 при сбое службы ассистента пользователь видит в чате единый нейтральный текст:
Помощник временно недоступен. Ваше сообщение сохранено — попробуйте отправить ещё раз через минуту.
Раньше на это место выводилась техническая строка с кодом ответа,
путём и телом ответа внутренней службы. Теперь диагностика уходит
только в журнал smeta-user-backend (запись
уровня WARN), а наружу — один и тот же текст на все
причины.
Что это значит при разборе обращения:
| Наблюдение | Как читать |
|---|---|
| Пользователь цитирует этот текст | Причину по нему определить нельзя — текст одинаков для любого сбоя. Нужны время, логин и объект/диалог |
| В разделе «Чаты пользователей» видно сообщение пользователя без ответа ассистента | Штатная картина отказа: ответа не было, в базу он не пишется. Это не потеря данных |
| Так пишут сразу несколько пользователей | Отказ самой службы ассистента (перезапуск, обновление, рассогласование доступа после выката) — вопрос к инфраструктуре, а не к учётной записи |
| Так пишет один пользователь и повтор помогает | Разовый сбой связи, действий не требует |
Рычагов в кабинете нет. Раздел «Чаты пользователей» — только просмотр; включить или перезапустить помощника из кабинета нельзя. Что передать инфраструктуре: время с точностью до минуты, логин пользователя, объект/ведомость. По этим данным сбой находится в журнале.
Не путать с исчерпанным лимитом расходов — у него свой текст, и он приходит от самой службы ассистента, а не от бэкенда; кнопка «Повторить» у пользователя в этом случае неактивна.
Просмотр чатов сбоем не затронут. Раздел читает диалоги через служебный API аналитики, а не через пользовательские ручки чата, и продолжает работать, даже когда пользователи получают отказ.
См. также: 17. Телеметрия подбора · 23. Мониторинг сервисов · 24. Файлы пользователей · [руководство пользователя, глава 16 «Чат-ассистент»]
17. Телеметрия подбора
Телеметрия подбора — это дашборд, который показывает, как ассистент подбирает расценки и материалы: сколько подборов, чем они завершились, какие были исходы. Раздел помогает следить за качеством работы ассистента на реальных диалогах.
17.1. Открытие
Меню → «Аналитика чата» (раздел «Система»). Дашборд телеметрии диалогов.
17.2. Что показывает дашборд
- Эпизоды подбора — каждый случай, когда ассистент подбирал расценку или материал.
- Исход эпизода — чем закончился подбор (см. 17.3).
- Тип подбора — расценка или материал (фильтр).
- Решения «учтено косвенно» (covered_by) — когда позиция уже покрыта другой расценкой; в названии используется пояснение причины.
17.3. Исход подбора
Когда пользователь выбирает один из предложенных вариантов (или отказывается), эпизоду присваивается метка исхода. Это даёт обратную связь: насколько точно ассистент предлагает позиции.
| Тип подбора | Что подбиралось |
|---|---|
| Расценка | работа из ФСНБ |
| Материал | неучтённый материал к работе |
Фильтр по типу подбора позволяет смотреть статистику отдельно по расценкам и по материалам.
17.4. Просмотр эпизода
Клик по эпизоду открывает детали: запрос, предложенные варианты, обоснование подбора (trace) и выбранный исход. Отсюда удобно перейти к исходному диалогу (см. главу 16).
17.5. Чем полезен раздел
- Видеть долю успешных подборов и проблемные места.
- Отбирать примеры для разметки и пополнения базы знаний (см. главы 19 и 20).
- Оценивать эффект изменений в правилах подбора по реальным данным.
См. также: 16. Чаты пользователей · 20. Оценка качества подбора
18. Модели ИИ и расходы
Раздел управляет настройками искусственного интеллекта, который стоит за чат-ассистентом: какие модели доступны, их параметры и сводный расход ресурсов.
18.1. Модели ИИ
Меню → «Модели ИИ».
- Список доступных моделей искусственного интеллекта, которые пользователь может выбрать в чате.
- Резервный список моделей (fallback) — на случай недоступности основной.
18.2. Настройки агента
Меню → «Настройки агента».
Параметры AI-агента задаются прямо из админки и применяются без перевыпуска приложения:
| Параметр | Назначение |
|---|---|
| Модель | какая модель используется по умолчанию |
| Итерации | сколько шагов рассуждения допускается на один подбор |
| Токены | лимит на объём обработки |
Здесь же доступна матрица качества моделей — сравнение, насколько разные модели справляются с подбором; помогает выбрать оптимальную по соотношению «качество / стоимость».
Построчная обработка больших документов — отключена
В версии 2.8.0 построчная обработка объёмных документов (ведомость объёмов работ или смета) скрыта от пользователей и выключена на обоих контурах: в чате нет кнопки «⚙ Обработать построчно», ассистент не предлагает запуск карточкой и подбирает расценки по строкам без кода сам, как раньше. Код фичи сохранён — её предстоит переделать; в руководстве пользователя раздела о ней нет.
В админке переключателя нет. Включение — два независимых флага, оба по умолчанию выключены:
| Где | Флаг | Как выключено |
|---|---|---|
Служба ассистента (.env) |
ENABLE_ROWJOB |
false или ключа нет; после смены нужен перезапуск
службы |
Пользовательский фронт (config.json рядом с
приложением) |
rowJobEnabled |
false или ключа нет; включается только булевым
true (строка "true" не считается) |
Включать один флаг без другого бессмысленно: фронт покажет кнопку без
предложений агента, агент — предложение без панели. Не включайте их на
PROD без решения владельца продукта. Перед правкой
config.json снимите его копию — при деплое каталог
приложения очищается.
18.3. Расходы
Расход ресурсов ИИ виден в двух разделах меню:
| Пункт | Что показывает |
|---|---|
| Расходы | сводный расход ресурсов ИИ по работе ассистента |
| Расход API | топ пользователей по расходу текущего месяца: логин, e-mail, потрачено, число обращений, лимит |
Используются для контроля затрат на подбор и диалоги.
Откуда данные в «Расходе API». Админка не читает базу расхода сама — она спрашивает службу ассистента (агента), а логин, e-mail и лимит добавляет из своей базы пользователей. Месяц считается по UTC: 1-го числа в 00:00 UTC счётчики обнуляются. Если пользователь удалён, строка остаётся, а логин и e-mail пусты.
Если служба ассистента недоступна или не настроена, страница показывает ошибку (503/502), а не нули. Раньше пустая таблица могла означать и «нет расхода», и «не удалось прочитать» — теперь пустая таблица значит только первое. При ошибке проверьте службу ассистента и ключи доступа админки к ней.
См. также: 17. Телеметрия подбора · 20. Оценка качества подбора
19. Разметка ФСНБ (характеристики)
Разметка ФСНБ — это присвоение работам нормативной базы характеристик (осей и значений), по которым ассистент точнее подбирает расценки. Разметка ведётся деревом, без ручного ввода кодов.
19.1. Оси характеристик
Меню → «Оси хар-к (ФСНБ)» (раздел «Алгоритмы»).
- Ось — параметр работы (например, материал основания, толщина слоя, способ выполнения).
- У оси есть набор значений; значения могут быть выпадающим списком с расшифровкой уровней.
- Оси и значения — основа разметки: ими помечаются узлы дерева ФСНБ.
19.2. Дерево разметки
Меню → «Разметка ФСНБ».
Разметка идёт по дереву нормативной базы — навигацией, без ввода кодов вручную:
- Дерево строится от типа норматива и показывает реальные группы и работы ФСНБ (по последней редакции).
- Узлы загружаются по мере раскрытия (ленивое дерево); доступен поиск.
- Размечать можно на нескольких уровнях: сборник → раздел → группа → работа.
Наследование
Характеристики наследуются сверху вниз: значение, заданное на группе, применяется к работам внутри неё.
- На узле-источнике унаследованные значения видны как «свои».
- На дочерних узлах унаследованные характеристики отмечаются в чекбоксах и бейджем источника.
- Наследование строго top-down: узлы-агрегаторы передают значения вниз.
Фильтры дерева
Чипы фильтра помогают находить, что осталось разметить:
| Фильтр | Показывает |
|---|---|
| Не размеченные | узлы без характеристик |
| На проверку | узлы, требующие ревью |
19.3. Эксперт
Часть разметки и пополнения базы знаний доступна пользователям с признаком «Эксперт» (см. главу 13).
- Эксперту в пользовательском приложении видны дополнительные кнопки «Сохранить в RAG» — занести удачный подбор в базу знаний.
- Признак эксперта включается администратором в списке пользователей.
19.4. RAG-примеры (база знаний подбора)
Меню → «RAG-примеры».
- База примеров «запрос → правильная расценка», на которые опирается ассистент.
- Примеры пополняются экспертами и администратором; их можно просматривать и редактировать.
- Хорошие примеры повышают точность подбора на похожих запросах.
См. также: 20. Оценка качества подбора · 13. Пользователи
20. Оценка качества подбора
Раздел оценки показывает, насколько точно ассистент подбирает расценки, на наборе проверочных случаев (эталонов). Это инструмент контроля качества: видно, не ухудшился ли подбор после изменений.
Меню → «Eval» (раздел «Система»). Внутри — дашборд, кейсы, прогоны, покрытие характеристик и очередь ревью.
20.1. Проверочные случаи (кейсы)
- Кейс — пара «запрос → ожидаемая расценка ФСНБ» (эталон, подготовленный экспертом).
- Кейсы используются для регулярной проверки качества подбора.
- При создании кейса выполняется проверка корректности кода ФСНБ.
20.2. Результаты оценки
Результаты прогона показываются блоками:
- сводная статистика по прогону;
- покрытие (coverage) — с разбивкой по источникам и сборникам;
- детализация по отдельным кейсам.
Покрытие по источникам помогает понять, на каких типах запросов подбор сильнее, а где требуется доработка.
Прогон целиком красный сразу после выката — сначала проверьте доступ, а не модель. С версии 2.8.0 служба ассистента закрыта служебным токеном полностью: обращение без действующего токена отклоняется. Если все кейсы прогона упали разом и сразу после установки новой версии — это почти всегда рассогласование служебных токенов между контурами, а не деградация подбора. Признак — отказ доступа (403) на каждом кейсе вместо содержательного ответа. Лечится на стороне инфраструктуры (сверка токена); повторная разметка кейсов при этом не нужна.
20.3. Очередь ревью характеристик
Внутри раздела «Eval» — подраздел «Очередь ревью».
- Характеристики, требующие проверки экспертом, собираются в очередь.
- Эксперт подтверждает или корректирует разметку (см. главу 19).
20.4. Связь с другими разделами
| Раздел | Роль в оценке |
|---|---|
| 17. Телеметрия подбора | реальные исходы подбора на диалогах пользователей |
| 19. Разметка ФСНБ | характеристики и RAG-примеры, на которые опирается подбор |
| 16. Чаты пользователей | источник примеров для новых кейсов |
См. также: 19. Разметка ФСНБ · 21. Профи.ру
21. Профи.ру
Раздел «Профи.ру» — это конвейер (пайплайн) сбора и обработки каталога услуг с профильной биржи. Он помогает связывать «бытовые» формулировки работ (как их называют заказчики) с расценками ФСНБ и пополнять базу подбора.
21.1. Открытие
Меню → «Профи.ру».
21.2. Дашборд пайплайна
Дашборд показывает этапы обработки каталога услуг:
- обнаружение и фильтрация услуг;
- разбор по схемам-визардам;
- формирование осей и значений;
- генерация и выгрузка результата.
Все визард-схемы видны на дашборде напрямую.
21.3. Дерево каталога услуг
Каталог услуг профильной биржи отображается деревом — по категориям и услугам. Это помогает увидеть, какие бытовые формулировки нужно сопоставить с нормативной базой.
21.4. Зачем это нужно
- Связать понятный язык заказчика («поклейка обоев», «стяжка пола») с расценками ФСНБ.
- Пополнять характеристики и примеры подбора реальными формулировками.
- Готовить почву для размещения ведомостей работ на профильных площадках.
См. также: 19. Разметка ФСНБ · 20. Оценка качества подбора
22. Продуктовая аналитика (Метрика)
Пользовательское приложение ui.smeta.net.ru подключено к
Яндекс.Метрике — тем же счётчиком
100037876, что и маркетинговый сайт
smeta.net.ru. Это позволяет измерять продуктовую
воронку: сколько посетителей после входа в приложение доходят
до чата, ВОР, генерации и готовой сметы, а также видеть сквозной путь
«сайт → приложение» в рамках одного визита.
Счётчик невидим: в интерфейсе приложения ничего нового не появляется, на его работу и скорость он не влияет. Раздел описывает не экран админки, а как читать отчёты в кабинете Метрики — этим пользуется владелец продукта.
22.1. Где смотреть
- Открыть кабинет Яндекс.Метрики, счётчик
100037876. - Сайт и приложение шлют данные в один счётчик. В панели «Сегментация» любого отчёта выбрать «Приложение» — воронка по продуктовым целям (22.2) читается сразу, без ручного фильтра.
- Запасной путь (если сегмент недоступен или нужна произвольная
комбинация условий) — фильтр вручную:
- Фильтр → Параметры визита →
app=calculator— этот параметр шлёт только приложение (сайт его не ставит); самый надёжный отбор; - либо Фильтр → Хост →
ui.smeta.net.ru(боевой сайт —smeta.net.ru), плюсenv=PRODдля боевой статистики.
- Фильтр → Параметры визита →
- Трафик из тестовой сборки Android-приложения
(задача №116) шлёт дополнительные параметры визита:
channel = mobile,platform = android,app_version = <версия>— отделить его от браузерного (в т. ч. мобильного веба) можно фильтромchannel=mobile. Из браузера, включая мобильные телефоны, эти три параметра не приходят вовсе.
Тестовый контур попадает в тот же счётчик. Стенд
smeta-user-test.softlancer.ru и машины разработки
(localhost) шлют данные туда же и без фильтра
искажают отчёты: за 01.07–07.08.2026 из 260 визитов 187 —
стенд, 20 — localhost и только 53 — боевой сайт. Отличать контуры по
параметру визита env: PROD —
боевой, TEST — стенд, DEV — локальная
разработка. По той же причине ежедневная сводка метрик, приходящая
архитектору, пока считает по всему счётчику и завышает цифры — при
разборе расхождений опирайтесь на кабинет с фильтром
env = PROD.
22.2. Воронка приложения
Продуктовый путь измеряется пятью целями Метрики. Пока составной отчёт не создан (см. 22.4), воронка читается так: Отчёты → Стандартные отчёты → Конверсии, сегмент «Приложение» (или фильтр — 22.1), в списке — цели по шагам:
| Шаг воронки | Цель (идентификатор) | Когда срабатывает |
|---|---|---|
| Вход в приложение | (визиты сегмента/фильтра из 22.1) | пользователь открыл ui.smeta.net.ru |
| Первое сообщение в чате | first_chat_message |
пользователь отправил первое сообщение ассистенту |
| Открыт ВОР | vor_opened |
открыт экран ведомости объёмов работ |
| Генерация сметы запущена | smeta_generation_started |
ассистент начал наполнять смету по ВОР — при любой выбранной модели (см. 22.5) |
| Смета получена | smeta_received |
смета сформирована и открыта |
| Экспорт сметы | smeta_export |
пользователь выгрузил Excel / отчёт ФСНБ |
Отчёт отвечает на вопрос «где отваливаются пользователи»: например, много входов, но мало первых сообщений — узкое место на старте диалога.
22.2а. Цепочка действий пользователя (с 2.14.0)
Кроме воронки (22.2) приложение отправляет события по действиям: что человек (или помощник за него) создал и изменил. Цель — видеть, где в цепочке «объект → смета → работы → экспорт» люди застревают, и сколько работы делает помощник, а сколько — пользователь вручную.
Браузерные цели (11 с учётом
smeta_export; шлёт приложение после успешного ответа
сервера — отказ ничего не отправляет):
| Цель | Когда срабатывает | Параметры |
|---|---|---|
signup |
регистрация (в т. ч. «Начать без регистрации» — №221) | kind = email / auto; с 2.15.0
приходит email — сразу после отправки адреса (№275),
auto больше не создаётся |
object_created |
создан объект | origin = user / agent |
smeta_created |
создана смета | origin = user / agent |
work_added |
добавлена работа (массовое добавление помощником — одно событие) | actor, via (picker…),
count |
work_removed |
работа удалена | actor |
volume_set |
сохранено количество ресурса; от агента — ещё и объём работы через
rabota_update (см. ограничения) |
actor, first = 1, если
значения раньше не было |
unaccounted_added |
добавлен неучтённый ресурс | kind = em / mat,
actor |
koef_applied |
применён коэффициент; от агента — и голый коэффициент через
rabota_update (koef_code =
custom) |
koef_code (код обоснования), actor |
chat_file_uploaded |
файл загружен в чат или в «Мои файлы» | ext, size_kb (корзина размера) |
npa_downloaded |
скачан НПА | npa_id |
smeta_export |
выгрузка (как в 22.2) | template |
Серверные дубли — 5 событий с суффиксом
_srv: signup_srv,
object_created_srv, smeta_created_srv,
chat_file_uploaded_srv, smeta_export_srv. Их
шлёт бэкенд через Measurement Protocol Метрики, и они
доходят даже тогда, когда браузерное событие съел блокировщик. Поэтому у
каждой ключевой цели пара X /
X_srv: имена разные намеренно — при общем имени одно
действие считалось бы дважды. Сравнивайте пару: X_srv
заметно больше X — значит, часть людей закрывается
блокировщиком.
С 2.15.0 (№275). Цели
register_code_sent и register_code_confirmed
(№266) сняты: шага с кодом нет, учётная запись создаётся сразу,
signup и signup_srv (kind=email)
приходят в этот момент. Новая серверная цель
first_password_login_srv — первый вход паролем из письма
(адрес стал подтверждённым); доля
first_password_login_srv / signup_srv показывает, доходят
ли письма и возвращаются ли люди. Пока серверные цели не принимаются
Метрикой (MP выключен), оценка — из БД: учётные записи с
email_verified=false старше суток против
true.
Параметры. actor / origin
= user (человек), agent (помощник),
replica (копирование сметы при репликации);
bridge — смета создана мостом «каталог → калькулятор» (см.
ниже, №218). Все события несут app = calculator и
env (PROD/TEST/DEV)
— фильтруйте по env = PROD, как в 22.1.
Мост «каталог → калькулятор» (№218). Клик «Посчитать мою квартиру» на странице каталога ведёт в приложение, где создаётся смета с работой и регионом из ссылки, а помощник спрашивает объём. Три браузерные цели:
| Цель | Когда срабатывает | Параметры |
|---|---|---|
bridge_smeta_created |
мост подготовил смету | created = 1 (создана) / 0
(открыта уже существующая) |
bridge_skipped |
мост отпустил человека на обычную главную без сметы | reason — код причины (UNKNOWN_WORK,
UNKNOWN_REGION, NO_ETALON,
NO_INDEXES, BRIDGE_LIMIT и т. п.); слагов и
названий в параметрах нет |
bridge_volume_confirmed |
человек назвал объём, помощник применил его к смете | actor = agent |
Серверные object_created_srv и
smeta_created_srv для моста идут с
origin = bridge — новых _srv-целей не
заводили. Воронка моста: bridge_smeta_created →
bridge_volume_confirmed (доля «назвали объём»); рост
bridge_skipped — сигнал, что ссылки каталога ведут на
работы без эталона или регионы без индексов.
Как читать ряд одного человека. Браузерные события
привязаны к UserID (22.3). У серверных UserID не
поддерживается протоколом: человек в них — параметр визита
user (e-mail). Для сквозного разбора
одного пользователя берите UserID для X и user
для X_srv.
Что не уходит: тексты сообщений, содержимое смет, имена файлов; в параметрах — только ключи из таблицы.
22.3. Пользователь в отчётах
После входа приложение передаёт в Метрику UserID = email (или логин) пользователя. В отчётах «Посетители» и по параметрам визита можно:
- отфильтровать поведение конкретного пользователя;
- связать его сеансы между устройствами.
В Метрику передаётся только факт события, путь и идентификаторы — тело сообщений чата и построчное содержимое сметы не отправляются.
22.4. Что настроено в кабинете
Настраивается руками в кабинете счётчика (кодом не создаётся). Фактическое состояние на 22.09.2026:
| Что | Состояние | Комментарий |
|---|---|---|
| 5 целей типа «JavaScript-событие» | ✅ заведены 06.08.2026, все Активна |
идентификаторы из таблицы 22.2; условие — «идентификатор содержит
<имя цели>» |
3 цели моста (bridge_smeta_created,
bridge_skipped, bridge_volume_confirmed) |
⏳ с 2.14.0 заводит владелец счётчика руками (чек-лист релиза 2.14.0, §3/11) | идентификатор = имени события из 22.2а |
15 целей цепочки действий (10 браузерных + 5
_srv) |
⏳ с 2.14.0 заводит владелец счётчика руками (чек-лист релиза 2.14.0, §3/4) | идентификатор = имени события из 22.2а; без цели событие в отчётах «Конверсии» не видно |
| Measurement Protocol + токен | ⏳ включает владелец счётчика (§3/3 чек-листа 2.14.0) | токен — секрет бэкенда (METRIKA_MP_TOKEN), в гайд и
репозиторий не попадает; пока выключен — _srv не
отправляются |
| 2 сегмента по хосту («Сайт», «Приложение») | ✅ заведены 22.09.2026 | выбираются в панели «Сегментация» любого отчёта; условие — «Домен
страницы входа» (ym:s:startURLDomain) равен
ui.smeta.net.ru («Приложение») или
smeta.net.ru/www.smeta.net.ru («Сайт») |
| Составной отчёт «Воронка приложения» | ❌ не создан | через Management API не создаётся ни при каком токене; при необходимости — руками в кабинете; отчёт «Конверсии» с сегментом заменяет его |
Цели и сегменты создаются вручную: OAuth-токен,
которым служебные скрипты читают кабинет, даёт только
чтение — это осознанное решение (2.9.0, №31): расширять права
токена на запись не стали, чтобы не держать в служебном скрипте права на
изменение боевого счётчика. Любая попытка создать цель или сегмент через
Management API тем же токеном по-прежнему отбивается
403 access_denied.
22.5. Ограничения
- Составного отчёта в кабинете нет (см. 22.4) — через API не создаётся ни при каком токене; сегмент + отчёт «Конверсии» закрывает ту же потребность.
- Один счётчик на все контуры — без фильтра
env = PRODв отчёт попадает трафик тестового стенда и машин разработки (см. 22.1). - Вебвизор (запись сессий) не включён — доступны только обезличенные события и стандартные отчёты.
- Блокировщики рекламы / недоступность
mc.yandex.ru— часть визитов не попадёт в статистику (ожидаемо); на работу приложения это не влияет. volume_setу человека — это количество ресурса, не объём работы. В 2.13.0 объём самой работы вводится один раз при добавлении и уходит сwork_added; отдельного «редактирования объёма» в интерфейсе нет. У агента (actor=agent) событие уходит и при изменении объёма работы черезrabota_update(№258, D-540); голый коэффициент черезrabota_updateдаётkoef_appliedсkoef_code=custom. Каждый вызов агента — одно событие, повтор того же значения не отсеивается (прежнего значения агент не видит). Применение обоснования по коду из справочника (rabota_koef_add) даётkoef_appliedс этим кодом; неизвестный код агент получает отказом и обязан взять точный из поиска по справочнику.npa_downloadedсчитается по клику, а не по факту завершённой загрузки файла.- Серверный ряд связан с человеком только параметром
user, не UserID; событие_srvбез предшествующего визита Метрика молча отбрасывает, поэтому бэкенд сам создаёт технический визит (pageview, не чаще раза в 6 часов на пользователя) — его могут видеть в «Просмотрах» как адрес/srv/<имя>. - Цели 22.2а стартуют с выката 2.14.0: за прежние периоды данных нет.
- Метрика не установлена на административной панели
admin.smeta.net.ru— этот раздел про пользовательское приложение. - Продуктовая аналитика Метрики не заменяет внутреннюю телеметрию подбора (глава 17): та измеряет качество работы ассистента, эта — поведение пользователей в продукте.
- Данные до версии 2.7.3 занижают шаг «Генерация сметы
запущена». До этой версии цель
smeta_generation_startedзасчитывалась только при работе на моделях Anthropic (Claude); если в главе 18 «Модели ИИ» была выбрана другая модель (например, Gemini), шаг не срабатывал даже при фактически созданной смете. С 2.7.3 цель уходит при любой модели. Провал именно на этом шаге в старых периодах читать как дефект измерения, а не как поведение пользователей; сравнивать воронку по периодам — только начиная с выката 2.7.3.
См. также: 17. Телеметрия подбора · 16. Чаты пользователей
23. Мониторинг сервисов (Prometheus и утренняя сводка)
Все сервисы системы — ИИ-ассистент, бэкенд калькулятора, бэкенд админки, робот n8n — отдают метрики ошибок, которые собирает Prometheus. Результат приходит в утреннюю сводку в Telegram: сколько отказов было за сутки, у каких сервисов, по каким причинам и не заканчивается ли место на хостах.
Раздел описывает не экран админки (в панели ничего не появилось), а инструмент эксплуатации: что читать утром и куда идти разбираться. Пользователи изменений не видят.
23.1. Утренняя сводка — главный экран
Сводка приходит архитектору в Telegram раз в сутки, окно 09:00–09:30 МСК, за прошедшие сутки. Блок про ошибки — последний в сообщении:
🧮 Калькулятор
Расчётов: 42 → · Уникальных юзеров: 30
Опубликовано: 12 →
Ошибок расчёта: 4 →
Новых чатов: 5 ↑ 25%
────────────────────────────────
🚨 Ошибки за сутки (Prometheus)
Всего: 61 ↑ 917% ⚠️ выше обычного
• 🔴 агент: 47 ↑ 2250%
топ: max_iterations 41 · llm_timeout 4 · file_parse_too_large 2
• 🔴 user-be: 9 ↑ 350%
топ: calc_recalc 9
• 🟡 admin-be: 5 ↑ 150%
топ: fsnb_import_download 5
• ⚫ робот-n8n: нет данных (экспортёр не отвечал ни разу за 7 суток)
• 🖥 хосты: kafka — диск 87% ⚠️ · остальные в норме
⚠️ Аномалия: агент — max_iterations 41 за сутки (обычно ~2/сут).
🔎 Разбор: https://grafana.softlancer.ru/graph?g0.expr=…
📋 Готовые запросы: https://github.com/…/docs/observability.md
Как читать:
| Элемент | Что значит |
|---|---|
| Всего: N ↑ % | все ошибки всех сервисов за сутки; стрелка — сравнение с позапрошлыми сутками |
| 🟢 | ошибок нет или их не больше обычного |
| 🟡 | ошибок стало больше, чем сутки назад, но до порога аномалии не дотянуло |
| 🔴 | аномалия: сегодня минимум втрое выше среднего за предыдущие 7 суток и не меньше 5 штук |
| ⚫ | данных нет: экспортёр сервиса молчит дольше 6 часов. Это не «ошибок ноль» — это «мы не знаем» |
| топ: … | до трёх самых частых причин с числом, остальные — «ещё N» (расшифровка причин — 23.3) |
| 🖥 хосты | одна строка на все хосты: поимённо только проблемные, остальные — «в норме» |
| ⚠️ Аномалия | не больше двух блоков: что выросло, сколько сейчас и сколько бывает обычно |
| 🔎 Разбор | ссылка на график ровно того запроса, который дал показанную цифру |
| 📋 Готовые запросы | карточка готовых выражений PromQL (23.4) |
Сервисы с нулём ошибок сворачиваются в одну строку
• 🟢 без ошибок: user-be, admin-be. Молчащие (⚫) в неё
не попадают — молчание и ноль намеренно
различаются.
Диагноз сводка не ставит. Она отвечает «что и сколько», связать всплеск с конкретным дефектом может только человек — для этого и даны ссылки «Разбор» и «Готовые запросы».
Строка «Ошибок расчёта» и строка «user-be» — это разные числа
В блоке «🧮 Калькулятор» строка «Ошибок расчёта» — сколько смет за сутки словили отказ счёта (одна смета считается один раз, даже если сломались 137 её работ). В блоке «🚨 Ошибки за сутки» строка user-be — сколько было отказов всего. Числа законно расходятся; «н/д» в строке «Ошибок расчёта» означает, что журнал отказов ещё не выложен в базу.
Строка «Новых чатов» — сколько диалогов с ассистентом начали за сутки
Последняя строка блока «🧮 Калькулятор» показывает, сколько новых диалогов с ИИ-ассистентом стартовало за отчётные сутки, и стрелку сравнения с предыдущими сутками. Это единственный ежедневный показатель востребованности чата: раньше его можно было узнать только запросом в боевую базу.
Новым считается диалог, у которого первый ответ ассистента пришёлся на эти сутки (по московскому времени). Отсюда следуют два свойства, которые важно не принять за ошибку:
| Ситуация | Попадает в счётчик? |
|---|---|
| Пользователь открыл чат вчера, продолжил переписку сегодня | Нет — диалог не новый, он засчитан вчера |
| Пользователь открыл окно чата и ничего не написал | Нет — ассистент не отвечал, диалога не возникло |
| Пользователь начал и продолжил диалог сегодня | Да, один раз, сколько бы сообщений в нём ни было |
Значения строки:
| Что показано | Что означает |
|---|---|
Новых чатов: 5 ↑ 25% |
за сутки начато 5 диалогов, на четверть больше предыдущих суток |
Новых чатов: 0 → |
честный ноль: источник ответил, новых диалогов не было |
Новых чатов: н/д (источник недоступен) |
посчитать не удалось — сводке не выдан доступ к журналу ассистента либо база не ответила. Остальные строки блока при этом собираются как обычно |
Строка считает только количество диалогов. Их содержимое, длину и качество подбора смотрят на своих экранах: сами переписки — в разделе «Чаты пользователей» (глава 16), расход токенов и моделей — в телеметрии (глава 17).
Ограничение. Диалог попадает в счётчик, когда ответ ассистента оказался платным (списаны токены известной системе модели). Если в справочник моделей (глава 18) добавят модель без цены, диалоги на ней в строку не попадут и она может занизить показатель вплоть до нуля при живом чате. Признак расхождения — пустая строка «Новых чатов» при непустом разделе «Чаты пользователей» за те же сутки.
23.2. Веб-интерфейс Prometheus
Стендов два, у каждого свой адрес; Grafana не ставилась — за адресами встроенный интерфейс Prometheus (имена доменов исторические).
| Стенд | Адрес | Что видно |
|---|---|---|
| PROD | https://grafana.softlancer.ru |
боевые ассистент, калькулятор, админка, робот n8n + ресурсы боевых хостов |
| TEST | https://grafana-test.softlancer.ru |
тестовые ассистент, калькулятор, админка + ресурсы тестовых хостов (робота n8n на TEST нет) |
Оба адреса закрыты логином и паролем (basic-auth); учётные данные хранятся на хосте мониторинга и в git не лежат — запрашивайте у архитектора.
Два рабочих экрана:
/targets— состояние сбора: какие сервисы и хосты опрашиваются, когда опрошены в последний раз, кто в состоянииDOWN. Первое, куда идти при ⚫ в сводке./graph— ввод выражения PromQL и график за выбранный период (по умолчанию 24 часа). Сюда же ведёт ссылка «🔎 Разбор» из сводки — с уже подставленным запросом.
Опрос сервисов идёт раз в 30 секунд, история хранится 30 суток (и не более 15 ГБ — что наступит раньше).
23.3. Что именно считается ошибкой
| Сервис в сводке | Что это | Причины в строке «топ:» |
|---|---|---|
| агент | ИИ-ассистент | max_iterations, cost_limit — диалог
прерван лимитом; max_tokens — модель не уложилась в лимит
длины ответа даже после одного автоматического повтора (в чате
пользователь видит «⚠️ Ответ обрезан…» и может написать «продолжай»; в
построчной обработке смет — своя льгота, здесь не считается);
llm_* — отказ модели (таймаут, лимит запросов,
авторизация); tool_* — сбой инструмента ассистента (в
причине — имя инструмента); file_parse_* — не разобрался
загруженный файл |
| user-be | бэкенд калькулятора | calc_recalc — сорвался пересчёт итогов;
calc_generate — сборка работ сметы по ВОР;
calc_export — выгрузка XLSX; agent_* — не
достучались до ассистента (таймаут, недоступен, 5xx, протухший
токен) |
| admin-be | бэкенд админки | fsnb_import_download / _parse /
_persist — на какой стадии упал импорт ФСНБ (глава 4);
robot_* — ошибка ночного робота обнаружения (глава 7) |
| робот-n8n | робот n8n | имя провалившегося воркфлоу |
| 🖥 хосты | сервер целиком | занятость диска (порог 85% / 95%), свободная память (15% / 8%), занятость свопа (50% / 80%); ⚠️ — первый порог, 🔴 — второй |
Ошибки HTTP 5xx у калькулятора и админки собираются тоже — в сводку
они не выведены отдельной строкой, смотреть их на /graph
(запрос есть в карточке).
23.4. Карточка готовых запросов
Вместо дашбордов Grafana ведётся карточка готовых выражений
PromQL — файл docs/observability.md в репозитории
smeta-observability. Ссылка на неё есть в каждой сводке
(«📋 Готовые запросы»). В карточке — проверенные запросы: ошибки каждого
сервиса за 24 часа, «робот не отработал ночью», «экспортёр молчит»,
ресурсы хостов, разбор прерываний ассистента. Порядок работы:
скопировать выражение → вставить на /graph → выбрать
период.
23.5. Что делать при тревоге
- 🔴 или ⚠️ в сводке — открыть «🔎 Разбор»: график покажет, был ли всплеск разовым или растёт.
- Причина из строки «топ:» указывает подсистему — соответствующая глава руководства (импорт ФСНБ — 4, робот индексов — 7, ассистент — 16–18).
- ⚫ «нет данных» — сначала
/targets: сервис лежит, экспортёр не выложен или закрыт доступ. Пока цельDOWN, нулям в её строках верить нельзя. - 🖥 диск ≥ 85% — разбирать сразу: переполнение диска уже дважды роняло сервисы; при ≥ 95% счёт идёт на часы.
23.6. Ограничения
- Немедленных уведомлений нет. Сообщение приходит раз в сутки, поэтому ночной отказ виден только утром — задержка обнаружения до 24 часов. Это осознанное решение по объёму задачи, не дефект.
- Grafana не устанавливалась — панельных дашбордов
нет, только
/graphи карточка запросов (23.4). - История 30 суток — что было раньше, посмотреть уже нельзя.
- «Нет данных» ≠ «ошибок нет». Различать только по ⚫
в сводке и по
/targets. - Метрики отдаются не всем. Служебные адреса
/metrics(и/actuator/prometheus) закрыты и доступны только с хоста мониторинга — открыть их в браузере со своей машины не получится, и так и задумано. - Пока сервис не выложен с новой версией, его строка будет ⚫ — сводка честно показывает недособранный контур, а не рисует нули.
- Строка «Новых чатов» до выдачи доступа показывает «н/д». Журнал ассистента лежит в отдельной области боевой базы, и права на него выдаются отдельно от прав на данные калькулятора; после выдачи строка оживает сама, обновлять сводку не требуется.
- Мониторинг не заменяет продуктовую аналитику (глава 22) и телеметрию подбора (глава 17): здесь про отказы техники, там — про поведение пользователей и качество подбора.
См. также: 7. Робот загрузки ИЦ · 17. Телеметрия подбора · 22. Продуктовая аналитика (Метрика)
24. Файлы пользователей
Раздел «Файлы пользователей» показывает файлы, которые пользователи загрузили в чат-ассистент и в «Мои файлы»: ведомости объёмов работ, чертежи, сметы, картинки. Администратор может открыть или скачать любой из них — без обращения к инженеру и без доступа к серверу.
Раздел только для чтения: загрузить, переименовать или удалить файл здесь нельзя.
24.1. Зачем это нужно
- Разбор обращений. Пользователь пишет «ассистент не разобрал мою ведомость» — исходный файл открывается прямо в его диалоге, за два клика.
- Воспроизведение ошибок. Настоящий файл пользователя становится готовым примером для проверки исправления.
- Контроль хранилища. Видно, кто и сколько места занял, какие типы файлов приходят, есть ли дубликаты и «мусор» (см. 24.5).
24.2. Открытие
Меню → раздел «Система» → «Файлы пользователей» (пункт рядом с «Чатами пользователей»).
Экран состоит из двух вкладок: «Реестр» и «Сверка с хранилищем».
24.3. Вкладка «Реестр»
Сверху — сводка по текущему фильтру: сколько файлов, какой объём, сколько владельцев. Ниже — таблица, свежие файлы сверху.
| Колонка | Что показано |
|---|---|
| Файл | значок типа и оригинальное имя (кириллица сохраняется). Пометка ⧉ N — файл с таким же содержимым загружен в систему N раз |
| Пользователь | владелец файла: «Имя Фамилия (e-mail)»; без ФИО — e-mail, без него — логин (порядок «Имя Фамилия» с 2.14.0; раньше было «Фамилия Имя») |
| Размер | объём файла; клик по заголовку сортирует |
| Загружен | дата и время загрузки; сортировка по умолчанию — свежие сверху |
| Чат | название диалога, в который файл был приложен; ·N — сколько раз он приложен в этом диалоге; — — файл в диалог не попадал (загружен через «Мои файлы») |
Фильтры: пользователь, тип (Таблицы · Документы · Изображения · Архивы), период загрузки «с … по …», поиск по имени файла (без учёта регистра, работает по части имени). Кнопки «Найти» и «Сброс».
Действия по строке:
| Кнопка | Что делает |
|---|---|
| ⤓ | скачивает файл под его исходным именем |
| 👁 | открывает предпросмотр в окне, не покидая списка (см. 24.4) |
| → | переходит в диалог, где файл был приложен, и подсвечивает нужное сообщение. Неактивна, если файла в диалогах нет |
Внизу — подпись «Показано N из M». Если файлов по фильтру больше лимита, появляется предупреждение «список обрезан по лимиту» — уточните фильтр, чтобы увидеть остальные.
Подстрочник «⚠ объекта нет в хранилище» означает, что карточка файла есть, а самих данных в хранилище нет: скачать и посмотреть такой файл невозможно, кнопки неактивны. Значок появляется только после сверки (см. 24.5).
Если файловое хранилище недоступно, над таблицей появляется жёлтая плашка «⚠️ Хранилище файлов недоступно — доступны только карточки файлов». Сам реестр при этом работает: список, фильтры и поиск берутся из базы, колонка «Файлы» и переход → в диалог тоже. Кнопки ⤓ и 👁 при этом гаснут и не нажимаются — панель не предлагает заведомо безрезультатное действие вместо того, чтобы отвечать ошибкой на каждый клик.
Момент, когда панель об этом узнаёт, зависит от причины:
- хранилище не настроено (в панели не заданы его адрес и ключи доступа) — плашка и погасшие кнопки появляются сразу, при открытии вкладки;
- хранилище настроено, но не отвечает (сервер хранилища выключен, сеть до него оборвана) — со стороны панели такой контур неотличим от исправного, пока в него не постучаться. Поэтому кнопки активны, а первый же клик по ⤓ или 👁 упирается в отказ хранилища — и в тот же момент, без перезагрузки страницы, появляется плашка и гаснут кнопки. При скачивании отказ выводится строкой «Хранилище недоступно» рядом со списком; при предпросмотре окно показывает плашку вместо содержимого (см. 24.4). Дальше раздел ведёт себя как в первом случае.
Как убрать плашку. Пока она висит, кнопки байтов погашены везде, поэтому «просто попробовать ещё раз» нечем. Плашка снимается при следующей загрузке списка: кнопки «Найти» или «Сброс», смена сортировки, переоткрытие вкладки. Кнопки ⤓ и 👁 снова становятся активными.
Само по себе исчезновение плашки не означает, что хранилище восстановилось: для контура «настроено, но не отвечает» панель при загрузке списка проверяет только наличие настроек, а не живость хранилища. Если оно всё ещё молчит, первый же клик по ⤓ или 👁 поднимет плашку обратно. Признак реального восстановления один — успешное скачивание или предпросмотр.
24.4. Предпросмотр
Окно предпросмотра показывает шапку файла (владелец, размер, дата загрузки, диалог, тип) и содержимое:
| Тип файла | Что видно |
|---|---|
| Картинки (png, jpg, webp) | изображение целиком |
| Текст и CSV | первые 200 строк; если файл длиннее — подпись «показаны первые N строк». Для файлов из Excel в кодировке Windows дополнительно указывается кодировка |
| первая страница документа | |
| Таблицы Excel, Word, архивы | предпросмотра нет — надпись «Предпросмотр недоступен для этого типа. Скачайте файл, чтобы открыть» |
Из окна доступны «⤓ Скачать» и «Перейти в чат →».
Если хранилище недоступно, окно предпросмотра откроется, но вместо содержимого покажет ту же плашку «⚠️ Хранилище файлов недоступно…»; кнопка «⤓ Скачать» в нём неактивна. Шапка файла (владелец, размер, дата, диалог) остаётся видна — она берётся из базы. Если недоступность ещё не обнаружена (см. 24.3, второй случай), окно откроется, попробует получить содержимое и, получив отказ, покажет ту же плашку сразу — отдельной строки с ошибкой не будет. Одновременно плашка появляется и в реестре под окном, а кнопки ⤓ и 👁 в списке гаснут.
Исключение — Excel, Word и архивы: для них содержимое не запрашивается вовсе, поэтому окно покажет обычную надпись «Предпросмотр недоступен для этого типа», и о недоступности хранилища станет известно только после нажатия «⤓ Скачать» — тогда в окне появится плашка.
24.5. Вкладка «Сверка с хранилищем»
Вкладка отвечает на вопрос «за что мы платим место»: сопоставляет карточки файлов с тем, что реально лежит в файловом хранилище.
Порядок работы:
- Откройте вкладку — показывается результат последней сверки с её датой и временем. Если сверки ещё не было — «Сверка ещё не выполнялась — нажмите „Сверить“».
- Нажмите «⟳ Сверить». Сверка перебирает хранилище и может занять минуты; на это время кнопка блокируется. Сама по себе, при переходе по вкладкам, сверка не запускается.
- Изучите сводку и две таблицы расхождений.
Сводка
| Строка | Смысл |
|---|---|
| Объектов в хранилище | сколько всего файлов лежит в хранилище и сколько они занимают |
| ├ в реестре, доступны в разделе «Реестр» | те, что администратор видит и может открыть |
| ├ 🔒 в реестре, скрыты политикой | файлы, удалённые самими пользователями: показывается только их число и объём |
| └ ⚠ нет в реестре этого контура | файлы без карточки в этом контуре |
| Записей реестра без объекта в хранилище | карточки, потерявшие данные: такой файл скачать не удастся |
Таблица «Объекты без записи в реестре». Имя файла в такой строке скрыто — видны только размер и дата изменения, открыть содержимое нельзя. Причина: хранилище общее у тестового и рабочего контуров, и до устранения этого объект может принадлежать другому контуру, а может остаться от прерванной загрузки; различить их сейчас невозможно.
Таблица «Записи реестра без объекта в хранилище». Здесь файл, владелец и дата загрузки. Это рабочий сигнал: пользователь такой файл открыть не сможет, жалоба вероятна.
Если хранилище недоступно, сверка не выполняется: вкладка отвечает «⚠️ Хранилище недоступно — сверка не выполнена», а результат прошлой сверки остаётся на экране — он по-прежнему верен на свою дату.
Если хранилище очень велико, сверка перебирает лишь первые N объектов и честно пишет об этом: «Показаны первые N объектов, сверка неполная». В этом случае обратная сверка не проводится и вместо нуля в сводке стоит «не проверено» — считать, что расхождений нет, в такой ситуации нельзя.
24.6. Вложения в диалогах
Файлы видны и в разделе «Чаты пользователей» — см. главу 16, п. 16.4.
24.6а. Файлы в карточке пользователя (с 2.14.0)
Реестр одного пользователя можно открыть прямо из его карточки — вкладка «Файлы» (глава 13, п. 13.6), без фильтра по пользователю. E-mail владельца в реестре — ссылка на карточку. Предпросмотр и скачивание файла записываются в журнал просмотров.
24.7. Ограничения
- Файлы, удалённые пользователем, администратору не видны — ни в реестре, ни в диалогах, ни в предпросмотре. Их существование отражено только обезличенной строкой 🔒 в сводке сверки. Это осознанное решение: приватность удалённого важнее полноты списка.
- Раздел только для чтения: изменить, удалить или загрузить файл нельзя ни в реестре, ни по итогам сверки. Сверка ничего не чинит и не удаляет — она только показывает.
- Если файловое хранилище недоступно, вкладка «Реестр» продолжает работать (список берётся из базы), но над таблицей висит плашка «⚠️ Хранилище файлов недоступно — доступны только карточки файлов», кнопки ⤓ и 👁 неактивны (в реестре, в предпросмотре и на чипах вложений в диалогах), а сверка не выполнится. Если хранилище настроено, но не отвечает, панель узнаёт об этом только по первому неудачному клику — до него кнопки выглядят рабочими; см. 24.3.
- Раздел рассчитан на десктоп (ширина экрана от 1280 px), как и вся админ-панель.
См. также: 16. Чаты пользователей · 13. Пользователи
25. Каталог работ (только просмотр)
Раздел «Каталог» показывает справочник каталога работ пилота — тот же самый, что заводят эксперты в личном кабинете (см. руководство пользователя, глава 20). Экран доступен из меню «Справочники» → «Каталог работ» и работает только на чтение: создавать, редактировать или удалять записи здесь нельзя, все правки данных пилота делаются экспертом в кабинете.
Раздел нужен, чтобы контролировать ход пилота, не заходя под чужой учётной записью.
25.1. Открытие
Меню → «Справочники» → «Каталог работ».
25.2. Список работ
Таблица: название (и slug), единица измерения, статус («Черновик» / «Активна»), число измерений, число вариаций, число привязанных смет, дата изменения.
25.3. Просмотр работы
Клик по строке раскрывает карточку работы:
- измерения работы с указанием рода (А — меняет состав сметы, Б — меняет только количество) и списком значений;
- вариации (сочетания значений измерений рода А; форма цены привязки с 2.10.0 всегда «работы» — сметная цена берётся из среза «На работы», №137) с привязанными сметами — по каждой привязке видны смета, автор, типовой объём с единицей, регион и квартал индексов, заметка. Если исходная смета удалена, привязка помечена «смета удалена».
25.3а. Тираж эталонов (2.10.0)
В списке работ есть колонка «Тираж», в раскрытой карточке — строка «Копий тиража: N (устарело M)». Копии создаёт эксперт кнопкой «Тиражировать» в личном кабинете (вкладка «Тиражирование»); в админке они только считаются. «Устарело» — копии, эталон которых изменился после тиража. Прочерк «—» — тиража нет, либо сервис кабинета с этой версией на контуре ещё не запускался (таблицы копий нет). Управлять тиражом из админки нельзя.
25.3б. Мост «каталог → калькулятор» (2.14.0, №218)
Кнопка «Посчитать мою квартиру» на публичной странице работы ведёт в
приложение по ссылке
?work=<слаг>®ion=<слаг>; приложение
создаёт пользователю смету из эталона этой работы и открывает чат с
вопросом про объём. Экрана в админке нет, но результат зависит от данных
каталога:
- мост работает только для опубликованных работ
(статус «Активна», раздел задан) с привязанной эталонной сметой по
региону ссылки и действующей формой индексов региона; иначе человек
молча попадает на обычную главную (в Метрике — цель
bridge_skipped, см. 22.2а); - берётся первая по порядку вариация работы с ценой в регионе; название вариации видно в разделе созданной сметы;
- лимит — 20 смет в сутки на пользователя
(
app.bridge.per-day); выключатель —app.bridge.enabled=false(ручка отвечает 404, ссылки ведут на обычную главную). Ключи лежат в коде сервиса, правятся выкатом, не через админку; при запуске в журнале строкаbridge: enabled=true per-day=20; - созданные сметы — обычные сметы пользователя (объект «Из каталога»), отдельного раздела для них в админке нет.
25.4. Как включить роль «эксперт»
Флаг «Эксперт» есть на существующем экране «Пользователи» (переключатель в строке пользователя) — с ним же связан доступ к разделу «Каталог работ» в личном кабинете.
25.5. Ограничения
Если раздел показывает ошибку «Схема catalog не создана», значит сервис кабинета (user-be) с этой версией ещё не запускался на данном контуре — обратитесь к DevOps.
26. Робот цен каталога
Робот цен каталога — новый в версии 2.10.0 раздел:
сбор рыночных цен по работам пилота каталога (см. руководство
пользователя, глава 20) с сайтов-источников, для наполнения публичной
витрины smeta.net.ru/katalog/. Настройка источников и
правил съёма — данные, а не код: изменение перечня источников не требует
деплоя.
26.1. Открытие
Меню → «Робот цен каталога» (пункт сразу после «Робот ИЦ»).
Если робот выключен конфигурацией контура (на PROD — по умолчанию), вверху экрана показана жёлтая плашка «Робот цен каталога выключен…»: кнопки «Запустить сейчас», ▶ у источника и «Проверить» у правила погашены (сервер ответил бы ошибкой 423), но источники и правила можно просматривать и редактировать как обычно.
26.2. Источники
Таблица: сайт (название + адрес), пояс (ценовой
пояс, название), статус проверки robots.txt (бейдж «OK» /
«Заблокирован» / «Неизвестно»), число правил, признак «включён». Клик по
строке выбирает источник и подгружает его правила ниже.
Форма добавления/правки: название, базовый адрес, «Ценовой пояс» (список из четырёх поясов), включён/выключен. Пояс обязателен: без него сервер вернёт «Укажите пояс источника».
Ценовые пояса (с версии 2.10.0)
Рыночные цены каталога считаются не по региону, а по ценовому поясу — рынку, на котором цена одна. Пояса фиксированные:
| Код | Пояс | Подпись на сайте |
|---|---|---|
MSK |
Москва и Московская область | точный рынок |
SPB |
Санкт-Петербург и Ленинградская область | точный рынок |
MLN |
Города-миллионники | «оценка по сопоставимому рынку» |
RU |
Остальные регионы | «оценка по сопоставимому рынку» |
Регион получает страницу на сайте, только если ему назначен пояс;
цифры на странице региона — это цифры его пояса (например, у Московской
области — цифры пояса MSK). Сметные цены ФСНБ остаются
региональными.
Правило: источник = один прайс, а не его городская
копия. Городские страницы сетей (Подольск, Химки, Балашиха и т.
п.) — копии московского прайса; заводить их в пояс MSK
нельзя: один прайс посчитается несколько раз и число источников
n будет завышено (порог «не менее трёх» сработает ложно).
Заведите один источник на пояс; городские копии отключите или
удалите.
Кнопка ▶ в строке запускает прогон только по этому источнику. Удаление источника предупреждает: «правила уйдут, цены останутся» — уже собранные предложения цены хранятся независимо и не пропадают.
26.3. Правила источника
Правило — это «как достать цену конкретной работы (и, опционально, вариации) со страницы источника». Таблица правил показывает: работу/вариацию, адрес страницы, единицу измерения, форму цены («только работа» / «работа с материалом»; с 2.10.0 в статистику и на экран «Предложения» идёт только «только работа»), последний статус (с текстом ошибки и временем).
Статусы правила:
| Статус | Значение |
|---|---|
| OK | последний прогон успешно взял хотя бы одну цену |
| EMPTY | страница получена, но по заданным селекторам ничего не нашлось — обычно означает, что вёрстка источника поменялась |
| BLOCKED | путь страницы запрещён в robots.txt источника — робот к
странице не обращался |
| ERROR | сеть, код ответа не 2xx, ошибка разбора robots.txt или
неверные настройки правила |
Форма правила: работа и вариация (из уже заведённого каталога работ),
адрес страницы, единица измерения, форма цены (правило с формой «работа
с материалом» источник собирает, но его цены в рыночную статистику не
попадают — №137), и поле «Извлечение» — JSON-объект с
CSS-селекторами: обязательные rows (строки таблицы/списка
на странице), name (название) и price (цена);
необязательные include/exclude (фильтр по
словам в названии, без учёта регистра),
unit/unitAccept (единица измерения и то, какие
подписи единицы принимать). Поле проверяется на корректный JSON и три
обязательных селектора ещё до отправки на сервер.
Кнопка «Проверить» делает сухой прогон правила:
показывает таблицу того, что удалось разобрать на странице (название,
цена как есть на странице, разобранное значение, диапазон при наличии,
принято/отклонено и причина) — ничего не записывается в
базу цен. Пользуйтесь ей при настройке нового правила или если статус
стал EMPTY/ERROR.
26.4. Прогоны
Список последних 20 прогонов: статус (OK /
PARTIAL — часть правил не взялась / FAILED),
число собранных предложений, текст ошибки при отказе, время.
Кнопка «Запустить сейчас» запускает прогон по всем включённым источникам. Одновременно может выполняться только один прогон — повторное нажатие до завершения ничего не запустит.
26.5. Предложения
Фильтр «работа / пояс / квартал» (список кварталов подгружается для выбранной пары работа+пояс, по умолчанию — самый новый; пока не выбраны работа и пояс — подсказка «Выберите работу и пояс») показывает:
- плашку статистики: диапазон цены и медиану («500–600 ₽/м², медиана 540 ₽/м² · источников: 5, отсечено выбросов: 1») либо «Мало данных — источников: N (нужно не меньше 3)», если различных источников пояса меньше трёх;
- цену по каждой вариации работы отдельно (та же логика порога);
- таблицу всех собранных строк-предложений: строки, которые не вошли в расчёт (не последний прогон своего правила), показаны серым с пометкой «нет, старый прогон» — так видно, почему число источников в статистике меньше числа строк в таблице.
Порог «не менее трёх источников» — это порог показа цены на публичном сайте, не порог полезности данных: чтобы витрина не публиковала диапазон по одной-двум точкам, вводящий в заблуждение.
26.6. Как это связано с витриной сайта
Публичные страницы smeta.net.ru/katalog/… генерируются
отдельным шагом (за пределами админки, на TEST/PROD) из тех же данных:
дерева разделов, работ со статусом «Активна» и привязанным разделом
(глава 20 руководства пользователя) и цен, собранных этим роботом.
Изменения в источниках, правилах и ручной запуск прогона влияют на
витрину только после очередной генерации страниц сайта — обновление не
мгновенное.
27. Выпуск справочника
Выпуск справочника — новый в версии 2.13.0 экран:
какие разделы справочника ФСНБ на smeta.net.ru (страницы
норм /gesn/…, ресурсов, технологических групп) открыты
читателям и поисковикам, а какие закрыты. По умолчанию закрыто всё:
страница нормы отдаёт 404, пока её сборник не включён здесь. Цель экрана
— выпускать справочник партиями, замеряя индексацию в
Яндекс.Вебмастере между шагами, а не открывать десятки тысяч страниц
разом.
27.1. Открытие
Меню → «Выпуск справочника» (пункт сразу под «Разметкой ФСНБ»). Экран работает с активной редакцией ФСНБ — той, по которой сайт печатает страницы. Нет активной редакции — экран показывает «Нет активной редакции ФСНБ» и переключателей не рисует.
Если user-be версии 2.13.0 ещё не запускался, экран отвечает ошибкой «user-be 2.13.0 ещё не запускался» (503): выкатывайте user-be раньше admin-be.
27.2. Что на экране
- Три счётчика вверху: сколько узлов открыто, сколько страниц это даёт, сколько видов закрыто целиком.
- Вкладки «Работы», «Материалы (ФСБЦ)», «Технологические группы», «Труд и машинисты» (с 2.15.0).
- Таблица узлов. На вкладке «Работы» узел — вид (ГЭСН, ГЭСНм, ГЭСНр, ГЭСНп, ГЭСНмр), который раскрывается (▸/▾) в сборники. В «Материалах» узел — книга, в ТГ — раздел целиком.
- В строке: статус «● Открыт» / «○ Закрыт», число
норм (ресурсов), источник значения, «кто · когда»
последнего изменения (время — по часам БД, формат
ДД.ММ ЧЧ:ММ). - Внизу — журнал последних 50 действий; «Весь журнал →» открывает постраничный. Записи не редактируются и не удаляются.
Откуда берётся «Открыт»
| Источник | Значение |
|---|---|
| «своё „да“» / «включён вид» | узел включён явно |
| «своё „нет“» | узел закрыт явно, даже если вид открыт |
| «от вида» | у сборника нет своей отметки — он повторяет вид |
| «по умолчанию» | отметок нет нигде — закрыто |
27.3. Как выпустить партию
- Выберите узел и нажмите «Вкл». Для ГЭСН и ГЭСНм
единица выпуска — один сборник (например,
gesn-11); ГЭСНр, ГЭСНп, ГЭСНмр, книга ФСБЦ и ТГ открываются целиком. - В диалоге проверьте: сколько норм (ресурсов) откроется и какой файл
sitemap получится (
sitemap-fsnb-<партия>.xml). - Если предыдущая партия включена менее 7 суток назад, диалог предупредит: «Замер в Вебмастере сделан?». Это напоминание, а не запрет.
- Введите основание (обязательно, до 200 знаков) — оно попадёт в журнал.
- Если откроется больше 2 000 страниц, нужно ещё
ввести код узла (
gesn-11,gesnr,04,tg) — кнопка «Включить» неактивна, пока код не совпал. - Нажмите «Включить» (Enter — тоже, если форма заполнена; Esc — закрыть).
Вид ГЭСН и ГЭСНм целиком включить нельзя, если в нём 5 000 и более норм: кнопка «Вкл» у вида погашена с подписью «слишком крупный, включайте по сборникам». Самый крупный сборник — ГЭСН 35 (около 3 400 норм); он открывается с кодом подтверждения.
Порог кода, предел вида и срок предупреждения — настройки admin-be
(fsnb.export.confirm-code-above,
fsnb.export.vid-max-normy,
fsnb.export.warn-days, переопределяются переменными
окружения без релиза). Диалоги берут числа с сервера, поэтому менять их
в интерфейсе не нужно.
Когда страницы станут видны
Не мгновенно: флаг, кеш nginx сайта и sitemap обновляются по таймерам. Диалог пишет оценку из настроек: страницы доступны примерно через 6 минут (флаг 60 с + кеш 5 мин), sitemap обновится в течение 60 минут. Проверять результат раньше срока бессмысленно.
Вкладка «Труд и машинисты» (с 2.15.0)
Открывает страницы ресурсов затрат труда рабочих
(/fsbc/1-100-NN/) и оплаты труда машинистов
(/fsbc/4-100-NNN/) — 162 кода: 71 разряд рабочих и 91
разряд машинистов. Узел один — «Затраты труда и
машинисты», включается и выключается целиком, как ТГ.
- В колонке «Страниц» — число кодов, у которых есть цена; в диалоге —
«Откроется: N страниц» и файл
sitemap-fsnb-trud.xml. В счётчике «Открыто» узел отмечен как «· труд». - Порядок выпуска тот же (раздел 27.3): основание, предупреждение о замере в Вебмастере, код подтверждения при более чем 2 000 страниц (здесь страниц меньше — кода не будет). Кнопки «Вкл»/«Выкл»; «Сбр.» нет — у узла нет наследования.
- В партию попадают только коды, которые встречаются в нормах и имеют
цену; остальные страницы отдают 404 или
noindex. Ссылки на страницы труда и машиниста в таблице ресурсов нормы появляются, когда узел открыт. - Страницы труда показывают цену человеко-часа напрямую по регионам (две карточки — без НДС и с НДС), без базовой цены и индекса.
27.4. Закрытие, сброс, удаление флага
- «Выкл» закрывает узел (красное предупреждение: страницы начнут отдавать 404, из выдачи они выпадут при переобходе). Основание необязательно, но лучше указать. У вида есть галочка «закрыть и включённые сборники» (по умолчанию включена): сборники со своим «да» возвращаются к наследованию от вида, а собственные «нет» остаются.
- «Сбр.» — убрать собственное «нет» сборника, чтобы он снова повторял вид.
- «Флаги без узла в редакции (N)» (свёрнутый блок внизу) — отметки, чьего узла в активной редакции уже нет (сменилась редакция). Включить такой узел нельзя, выключить и «Удалить флаг» — можно.
Повторное нажатие того же значения ничего не меняет и в журнал не пишется.
27.5. Одновременная работа двух администраторов
Если пока диалог был открыт, узел изменил другой администратор, сохранение отклоняется: «Состояние изменилось: кто, когда. Обновите экран» — нажмите «Обновить» и повторите действие. При сетевой ошибке или 5xx состояние не изменено — перезагрузите экран и проверьте.
27.6. Ограничения
- Действует только на активную редакцию; архивных редакций на сайте нет.
- Экран управляет только публикацией страниц; сами данные справочника (импорт, разметка) — главы 3, 4 и 19.
- Журнал только пополняется; отменить запись нельзя — только выполнить обратное действие.
- На телефоне (до 768 px) меню открывается кнопкой «☰» (см. гл. 2), таблица узлов прокручивается по горизонтали внутри карточки — «Состояние» и «Вкл/Выкл» доступны прокруткой вправо.
- Отметки не откатываются при смене редакции — смотрите блок «Флаги без узла».
28. Журнал действий и использование
Новое в версии 2.16.0. Калькулятор записывает, что и когда пользователь менял, а админка показывает это двумя способами: лентой по одному пользователю (вкладка «Действия» в карточке) и сводкой по всем (раздел «Использование»). Всё только для чтения: изменить или удалить запись из админки нельзя, нового права или роли не требуется.
28.1. Что попадает в журнал
- Успешные операции, изменившие данные: учётка (создание, вход, смена пароля), объекты, сметы, разделы, работы, коэффициенты, ресурсы; а также выгрузка сметы, сообщения и файлы в чате, скачивание НПА. Неудавшаяся операция событием не становится.
- Для правок хранится «было → стало» (объём, коэффициент, НР/СП, тариф, название) и подпись объекта — снимок на момент события: переименование потом историю не переписывает.
- Открытие страниц и просмотры списков не пишутся; в чате пишется только факт и длина сообщения, не текст; имён файлов, паролей, кодов и e-mail в журнале нет.
- Массовые операции (добавление пачки работ, мост «каталог → калькулятор») — одно событие на запрос с числом строк.
- Журнал ведётся с даты начала сбора; что было раньше, в нём не восстанавливается.
28.2. Вкладка «Действия» в карточке пользователя
Меню → «Пользователи» → пользователь → вкладка
«Действия» (адрес с ?tab=events переживает
обновление страницы). В шапке карточки появились счётчики «Действий» и
«Сеансов».
- Лента сгруппирована по сеансам (заголовок: даты, длительность, число действий). Время — по секундам, в вашем часовом поясе; в подсказке — UTC и миллисекунды.
- Колонка «Кто»: 👤 человек, 🤖 агент (чат), ⚙ система (автоучётка, мост каталога, реплика) — подсказка словами у каждой иконки.
- «Над чем» — подпись объекта, сметы или работы (шифр); смета ведёт на её страницу, удалённая показана серым без ссылки. «Было → Стало» — там, где значение менялось, с единицей.
- Клик по строке раскрывает все параметры события.
- Фильтры: период, смета, тип, «кто», галка «Только изменения» (без открытий и выгрузок), «Сбросить». Кнопка «Показать ещё» дочитывает ленту без дублей.
- Открытие вкладки записывается в «Журнал просмотров» (действие
events_view), как просмотр чужой сметы; если запись не удалась, лента не показывается.
История сметы. На странице сметы пользователя внизу — блок «История сметы»: 10 последних событий. «Вся история →» открывает вкладку «Действия», уже отфильтрованную по этой смете.
Что значат состояния
- «Событий нет — пользователь зарегистрирован до начала сбора» — журнал по нему пуст не потому, что человек ничего не делал; «…ничего не делал» — пуст после начала сбора.
- «По этим условиям событий нет» — смягчите фильтры или нажмите «Сбросить».
- Жёлтая строка «Здесь возможны пропуски: журнал не записывался с … по …» — сбой записи журнала в этот интервал. Пользовательская операция при этом выполнилась; журнал о потере сообщает.
- Ошибка вкладки показывается внутри неё, остальные вкладки работают.
28.3. Раздел «Использование»
Меню → «Использование» (после «Пользователей»).
Адрес /admin/usage. Блоки:
- Воронка — сколько пользователей за период дошли до шага: зашли → создали объект → создали смету → добавили работу → ввели объём → выгрузили смету; доля от «Зашли» и среднее время от предыдущего шага. Клик по шагу открывает список этих пользователей (со ссылкой в карточку). Шаг считается по факту наличия события, а не по порядку.
- Потери на входе — учётки без единого действия.
- По дням — активные, действия, сеансы (дни по часовому поясу админа).
- Что делают — сколько раз и сколько пользователей выполняли каждое действие, и доля, сделанная агентом (чтобы действия ИИ не выдавали за поведение человека). Сортировка по любому столбцу.
- Самые активные — первое и последнее действие, сеансы, действия, достигнутый шаг; строка ведёт в карточку.
Вверху: период (7 / 30 / 90 дней или свой; по умолчанию 30), «Учётки»
(все / именные / гостевые) и галка «Без экспертов и служебных» (включена
по умолчанию, исключает экспертов и учётки из ключа
USAGE_EXCLUDE_LOGINS). Фильтры действуют на все блоки
сразу. Плашка «Сбор событий начат …» и пометка «неполный период»
показываются, если период начался раньше начала сбора. Все числа —
настоящие, из журнала.
28.4. Хранение и политика
- Подробные события хранятся 12 месяцев (ключ
окружения
APP_USER_EVENT_RETENTION_DAYS, по умолчанию 365), старше удаляются ночной задачей. Перед удалением по дням сохраняются обезличенные агрегаты — по ним раздел «Использование» считает периоды старше года. - Журнал удаляется вместе с учётной записью пользователя.
- Запись журнала включается ключом
APP_USER_EVENT_ENABLED(по умолчанию выключен). На PROD её включают только после публикации на сайте политики конфиденциальности с пунктом о журнале действий (редакция от 30.10.2026). - Оценка объёма: около 600 байт на событие с индексами; один активный пользователь — десятки мегабайт в год.
28.5. Ограничения
- Только серверные изменения и выгрузки; клиентские события (клики, просмотры экранов) не собираются.
- Нет экрана «смета на момент T» и отката изменений.
- Данные до начала сбора не восстанавливаются.
- Свободный текст в параметрах обрезается до 200 символов, подпись объекта — до 120.