Документация · Раздел 4 · Form Builder
v1.0 · июль 2026

Раздел 4 · Модуль 2

Form Builder

Автономный конструктор шаблонов отчётных форм из терминов и FSD с генерацией JSON Schema и собственным согласованием.

Корень: form_builder/. Backend (8100) + Vue-фронт (5174, base /demo/form-builder/). Работает автономно, обращаясь к DG API за терминами/FSD.

4.1 · Данные (БД form_builder)

ТаблицаПоля / назначение
report_templateШаблон: code, name, domain_id, version, status (draft/review/approved/rejected), settings (JSON), json_schema (сгенерир.).
form_sectionСекция: order_index, is_repeatable.
form_fieldПоле: source_type (TERM/FSD/custom), source_id, field_label, override_properties (тип, ширина, режим привязки), column_span (1..12), is_required, is_readonly.
form_layoutПлейсхолдер раскладки.

4.2 · API

GET/POST /templates            GET/PUT /templates/{id}
POST/PUT/DELETE /templates/{id}/sections[/{sid}]
POST/PUT/DELETE /templates/{id}/fields[/{fid}]
GET  /templates/{id}/preview          — сгенерированная JSON Schema
POST /templates/{id}/submit-review    — на согласование
GET  /approvals/pending
POST /templates/{id}/approve | /reject
GET  /dg/domains | /dg/terms | /dg/fsd | /dg/organizations   (прокси в DG)

Интеграция с DG (core/dg_client.py): получает bearer-токен через DG /auth/test-token/{username}, тянет объекты через DG /objects/search?class_code=…. Палитра классов настраивается (palette_class_codes, дефолт ["TERM","FSD"]).

4.3 · Генерация схемы и версионирование

_generate_schema() перебирает поля по order_index, формирует JSON Schema (draft-07) + кастомный ui:sections. Схема не обращается заново к DG — строится из данных поля, зафиксированных в form_field при добавлении.

Версии — в settings.versioning (approved_major.0.draft_patch): согласование поднимает major; редактирование одобренного шаблона возвращает его в draft и поднимает patch; ведётся version_history[].

4.4 · Фронт (сборка формы)

3-панельный конструктор: слева палитра DG-объектов (поиск + фильтр по классу), в центре канвас секций/полей с HTML5 drag-and-drop, внизу — живая JSON Schema.

FSD → секция. Ключевая логика addFsdAsSection(): при перетаскивании FSD создаётся секция и по одному полю на каждый термин из properties.blocks[].terms (или легаси properties.terms). Отдельного backend-эндпоинта «сгенерировать из FSD» нет — это клиентская оркестрация.

Есть UI привязки DQLA к шаблону (сохраняется как settings.dqla_ids) — см. DQ Checks.