Files
llm/docs/runbooks/1c-form-discovery.md
T

292 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 <form-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":"<form-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":"<form-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":"<element-name>"}}
```
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":"<element-name>"}}
{"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 <form-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 <form-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.