# 1C Form Discovery And Editing This runbook adapts the MOXCEL discovery loop to managed forms. The goal is a full SQL-side form decoder and safe saved-state editing through the test extension, with XML exports used only as evidence fixtures. ## Current Baseline - Default base: `upo_test`. - Default adapter endpoint: `http://docker-gpu.cin.su:8011`. - Primary test extension/object fixture: `фс_ДоработкиОбщее` / `DataProcessor.фс_НастройкаУсловногоОформления`. - Primary form fixture: `ТестНастройки`. - Existing form context evidence: `reports/1c-sql/upo/form-context-test-nastroiki-title-resolution.json`. - Existing saved-state smoke selectors: `А`, `ТЗК1`, and `КомандаПример1`. If `ConfigSave` or `ConfigCASSave` is empty, prepare the working saved-state row through the reviewed saved-state copy flow in `docs/1c-write-path-safety.md` before running write smokes. ## Current UPO Test Status - Active form discovery object: `Catalog.ЗадачиАссистентаУправления`. - Working saved-state table: `ConfigSave`. - Working form payloads: `fa447250-c2a0-439d-8ba7-422923f57200.0` (`ФормаЭлемента`) and `91ce61c5-6f4b-484a-9021-59f18be88550.0` (`ФормаСписка`). - The saved-state copy planner now includes form payload rows (`*.0`) with `role=form_payload`; descriptor-only copies are not enough for `metadata.form.decode`. - Latest decoder profile after container/dynamic-list baseline mapping: `reports/1c-sql/upo_test/form-profile-zadachi-assistenta-configsave-after-map-live.md`. Coverage is `484/2083` mapped, up from `252/2083`. - Latest SQL/XML oracle comparison for `ФормаСписка`: `reports/1c-sql/upo_test/form-sql-xml-compare-zadachi-assistenta-list-xmlmap.md`. It currently shows `17` matched items, `44` matched properties, `41` XML-only properties, and `12` mismatches after mapping SQL type code `8` to `Контекстное меню`. - `ТестНастройки` XML context is available at `reports/1c-sql/upo_test/form-context-test-nastroiki-effective-refresh.json`, and the live SQL saved-state rows are prepared in `ConfigCASSave` from local CAS blobs: `f96a0c45-3eff-11f1-8287-005056b0d483__25c39fbf-35a4-4b43-8e3f-cd1f91082c88` plus `.0`. - Latest `ТестНастройки` direct SQL decoder profile: `reports/1c-sql/upo_test/form-profile-test-nastroiki-direct.md`. Coverage is `552/2891` mapped after decoding `ExtendedTooltip` form items from marker `12`, table additions from marker `6`, buttons from marker `34`, form/element events, field layout details, group/table layout properties, derived child item references, and section-level command/action semantics. - Latest `ТестНастройки` SQL/XML oracle comparison: `reports/1c-sql/upo_test/form-sql-xml-compare-test-nastroiki-direct.md`. It currently shows `68` matched items, `292` matched properties, `2` XML-only properties, no missing SQL items, and no remaining value mismatches after `ExtendedTooltip` decoding, form event decoding from section `1.19`, marker `6`/`34` decoding, element event matching, derived reference semantics, field/group/table layout semantics, plus section-aware XML matching for dynamic-list columns and command-backed buttons. The only remaining XML-only properties are command binding cases: `ТЗИзменитьФорму -> Form.StandardCommand.CustomizeForm` and `ФормаКомандаОбновить -> Form.Command.КомандаПрименить`. - Latest `ТестНастройки` write matrix smoke: `reports/1c-sql/upo_test/form-write-matrix-smoke-test-nastroiki-layout-table-100.json`. It verified 100 candidates with zero failures. The current matrix has `2912` entries, `1339` safe smoke candidates, and no not-writable entries. A direct `metadata.write` smoke for `А.Заголовок` also completed as `verified_and_rolled_back`. - Latest write matrix smokes: `reports/1c-sql/upo_test/form-write-matrix-smoke-element-50.json` and `reports/1c-sql/upo_test/form-write-matrix-smoke-list-50.json`. Both verified 50 candidates with zero failures. - Latest direct `metadata.write` smoke changed `Список.Заголовок` through `apply_and_rollback`; semantic readback verified the change and rollback restored the original SHA1. ## Discovery Loop Use the same shape as the MOXCEL work: 1. Create or update one controlled form fixture in the test extension. 2. Change exactly one visible form property in Designer. 3. Capture the SQL saved-state form payload before and after. 4. Compare the decoded SQL payload with exported `Ext/Form.xml` as an oracle. 5. Promote read rules only when SQL bytes reproduce XML-visible facts. 6. Promote write rules only after `apply_and_rollback` proves semantic readback and rollback. The adapter runtime remains SQL-only. Exported form XML is a labeling and verification fixture, not a runtime input for adapter answers. ## Decoder Scope The full decoder should expose these public form sections: - form common properties and events; - form items with stable `id`, `name`, parent/group, type, title, data path, visibility, enabled/read-only flags, layout properties, and color/font properties when decoded; - form attributes, including value-table fields and dynamic-list fields; - form commands, command bars, command-button bindings, and command handlers; - table columns, pages, groups, decorations, input fields, labels, buttons, extended tooltips, context menus, and dynamic lists; - form module summary and routine/event/command link validation; - source-aware display resolution for inherited captions: command title, form attribute title, value-table field title, and local form item override. Every decoded scalar must carry enough evidence for future writes: section, element identity, physical payload path, semantic group/name, current value, value type, source, and verification rule. ## Test Extension Fixture Plan Keep fixtures small and intentionally boring. Add form elements in `ТестНастройки` or a sibling test form so each save isolates one concept: - command button bound to `КомандаПример1`; - local-only button title; - element title inherited from a form command; - element title inherited from a form attribute `А`; - element title inherited from a value-table field `ТЗ.К1`; - input field with visibility, availability, read-only, title location, choice buttons, quick choice, and text editing flags; - group/page/table layout properties: parent group, order, stretch, width, height, command-bar location, and default item; - color/font properties for label/button/input field; - dynamic list with main table, custom query flag, query text, and columns; - form events and element events with matching and missing BSL handlers; - structural move/reorder cases inside one parent container. Prefer one-property saves. Do not combine property, handler, and structural changes in the same learning capture. ## Read-Side Commands Decode a concrete saved-state form payload: ```powershell python scripts/smoke_1c_write_matrix.py ` --base-url http://docker-gpu.cin.su:8011 ` --base-id upo_test ` --table ConfigCASSave ` --file-name ` --build-only ` --report reports/1c-sql/upo_test/form-write-matrix-build.json ``` Read XML-backed form context for the test fixture: ```powershell python scripts/get_1c_form_context.py ` --index reports/1c-sql/upo/unified-object-route-index.json ` --kind DataProcessor ` --name фс_НастройкаУсловногоОформления ` --form ТестНастройки ` --view effective ` --max-items 500 ` --output reports/1c-sql/upo_test/form-context-test-nastroiki-effective.json ``` Adapter RPC equivalents: ```json {"method":"metadata.form.decode","payload":{"base_id":"upo_test","table":"ConfigCASSave","file_name":"","include_parameters":true,"max_items":5000,"max_parameters":500}} ``` ```json {"method":"metadata.form.write_matrix.build","payload":{"base_id":"upo_test","table":"ConfigCASSave","file_name":""}} ``` Build a decoder coverage and gap profile for an object form: ```powershell python scripts/profile_1c_forms.py ` --adapter-url http://docker-gpu.cin.su:8011 ` --base-id upo_test ` --kind Catalog ` --name ЗадачиАссистентаУправления ` --table Config ` --raw-output-json reports/1c-sql/upo_test/form-profile-zadachi-assistenta-details.json ` --output-json reports/1c-sql/upo_test/form-profile-zadachi-assistenta.json ` --output-markdown reports/1c-sql/upo_test/form-profile-zadachi-assistenta.md ``` Compare decoded SQL form semantics with exported `Form.xml` semantics: ```powershell python scripts/compare_1c_form_sql_xml.py ` --sql-details reports/1c-sql/upo_test/form-profile-zadachi-assistenta-configsave-xmlmap-details.json ` --xml-context reports/1c-sql/upo_test/form-context-zadachi-assistenta-list-effective.json ` --output-json reports/1c-sql/upo_test/form-sql-xml-compare-zadachi-assistenta-list-xmlmap.json ` --output-markdown reports/1c-sql/upo_test/form-sql-xml-compare-zadachi-assistenta-list-xmlmap.md ``` ## Write Learning For a manual one-property Designer change: ```json {"method":"metadata.write_learning.capture_before","payload":{"base_id":"upo_test","learning_id":"form-visible-case","table":"ConfigCASSave","form":"ТестНастройки","element":""}} ``` After the Designer save: ```json {"method":"metadata.write_learning.capture_after","payload":{"base_id":"upo_test","learning_id":"form-visible-case","table":"ConfigCASSave","form":"ТестНастройки","element":""}} {"method":"metadata.write_learning.diff","payload":{"learning_id":"form-visible-case"}} {"method":"metadata.write_learning.infer_rule","payload":{"learning_id":"form-visible-case"}} ``` Promote a rule only when the diff changes exactly one intended semantic value or one intended structural relation. Composite/list rewrites need a dedicated source-specific rule, not a generic scalar writer. ## Write Verification Run the existing source-aware route smoke: ```powershell python scripts/smoke_1c_saved_state_write_routes.py ` --base-url http://docker-gpu.cin.su:8011 ` --base-id upo_test ` --table ConfigCASSave ` --file-name ` --report reports/1c-sql/upo_test/saved-state-write-routes-smoke.json ``` Then run the matrix smoke: ```powershell python scripts/smoke_1c_write_matrix.py ` --base-url http://docker-gpu.cin.su:8011 ` --base-id upo_test ` --table ConfigCASSave ` --file-name ` --max-candidates 50 ` --learning-id upo-test-form-write-matrix ` --report reports/1c-sql/upo_test/form-write-matrix-smoke-50.json ``` Successful writes must use `apply_and_rollback`, explicit SQL apply and rollback gates, sha1 preconditions, backup evidence, semantic readback through `metadata.form.decode`, and rollback verification. ## Promotion Gates Read rule promotion requires: - SQL-only decoder output with stable semantic name and value type; - XML fixture agreement for the same form element/property; - no dependency on display strings when a stable id/path exists; - regression coverage on the test form and at least one real extension form. Write rule promotion requires: - exact physical payload path or structural span evidence; - source-aware routing for inherited display values; - `metadata.form.write_target.resolve` success with a deterministic target; - `metadata.form.element.write_apply` or `metadata.write` success in `apply_and_rollback`; - semantic verification and rollback readback success; - registration in the scalar/enum/verified write matrix reports. ## Immediate Work Queue 1. Refresh the test form saved-state row for `upo_test` if `ConfigCASSave`/`ConfigSave` is empty. 2. Capture a fresh `metadata.form.decode` baseline for `ТестНастройки`. 3. Build a form property gap report: decoded SQL semantics versus `Ext/Form.xml` semantics from the test extension. 4. Learn the two remaining command binding cases with a one-property before/after capture: standard command button binding and local button to form command binding. Do not hard-code these from display names. Current captures and exact after-capture commands are in `docs/runbooks/1c-form-command-binding-learning.md`. 5. Expand `parser/form_payload.py` for the next write-relevant properties: availability, read-only, title location, command-bar location, colors, font, and dynamic-list query settings. 5. Rebuild the write matrix and split entries into verified scalar, enum, composite-needs-rule, identity/binding, and structural queues. 6. Learn one property at a time through `metadata.write_learning.capture_before/capture_after/diff/infer_rule`. 7. Promote safe scalar/enum routes into smoke coverage. 8. Add a structural movement scorecard for sibling reorder and parent/group movement, then extend `metadata.form.target.move` beyond sibling swaps only after controlled round-trip proof.