Initial SQL-only 1C adapter baseline
This commit is contained in:
@@ -0,0 +1,176 @@
|
||||
# 1C Form Command Binding Learning
|
||||
|
||||
This runbook tracks the two remaining `ТестНастройки` SQL/XML gaps after the
|
||||
form decoder reached zero missing items and zero mismatches.
|
||||
|
||||
## Target
|
||||
|
||||
- Base: `upo_test`
|
||||
- Adapter: `http://docker-gpu.cin.su:8011`
|
||||
- Saved-state table: `ConfigCASSave`
|
||||
- Form payload file:
|
||||
`f96a0c45-3eff-11f1-8287-005056b0d483__25c39fbf-35a4-4b43-8e3f-cd1f91082c88.0`
|
||||
- Form: `ТестНастройки`
|
||||
- Current baseline payload SHA1:
|
||||
`0ca61aa4ed041fc4219cada0126d5f144e59d30d`
|
||||
|
||||
## Before Captures
|
||||
|
||||
The baseline captures were created on 2026-07-02.
|
||||
|
||||
| Learning ID | Element | Expected XML binding | Snapshot |
|
||||
| --- | --- | --- | --- |
|
||||
| `form-command-binding-standard-customize-form` | `ТЗИзменитьФорму` | `Form.StandardCommand.CustomizeForm` | `38cab2dc00c9465e9dc42a17548d3170` |
|
||||
| `form-command-binding-local-apply-command` | `ФормаКомандаОбновить` | `Form.Command.КомандаПрименить` | `e312ccc2e6ed45fbb6ebac187d30ba7a` |
|
||||
|
||||
Adapter-side capture paths:
|
||||
|
||||
- `/data/adapter-write-learning/form-command-binding-standard-customize-form/before-38cab2dc00c9465e9dc42a17548d3170.json`
|
||||
- `/data/adapter-write-learning/form-command-binding-local-apply-command/before-e312ccc2e6ed45fbb6ebac187d30ba7a.json`
|
||||
|
||||
## XML Fixture Workflow
|
||||
|
||||
Use the XML workflow first, matching the moxel discovery flow: edit/generate XML,
|
||||
load it into the test extension, then inspect the changed SQL payload.
|
||||
|
||||
Generate fixtures:
|
||||
|
||||
```powershell
|
||||
python scripts/create_1c_form_command_binding_xml_fixtures.py
|
||||
```
|
||||
|
||||
Generated files:
|
||||
|
||||
| Fixture | Purpose |
|
||||
| --- | --- |
|
||||
| `reports/1c-sql/upo_test/xml-command-binding-fixtures/00-original/Form.xml` | baseline copy |
|
||||
| `reports/1c-sql/upo_test/xml-command-binding-fixtures/01-local-button-command-example1/Form.xml` | changes `ФормаКомандаОбновить` to `Form.Command.КомандаПример1` |
|
||||
| `reports/1c-sql/upo_test/xml-command-binding-fixtures/02-standard-button-to-local-command/Form.xml` | changes `ТЗИзменитьФорму` to `Form.Command.КомандаПример1` |
|
||||
| `reports/1c-sql/upo_test/xml-command-binding-fixtures/03-combined-command-binding-switches/Form.xml` | applies both existing-button changes |
|
||||
| `reports/1c-sql/upo_test/xml-command-binding-fixtures/04-add-two-learning-buttons/Form.xml` | adds two new learning buttons under `Группа2` |
|
||||
|
||||
Preferred first load:
|
||||
|
||||
1. Load `01-local-button-command-example1/Form.xml` into
|
||||
`фс_ДоработкиОбщее.DataProcessor.фс_НастройкаУсловногоОформления.Forms.ТестНастройки`.
|
||||
2. Update/save the extension so `ConfigCASSave` receives a new form payload.
|
||||
3. Run:
|
||||
|
||||
```powershell
|
||||
python scripts/run_1c_form_command_binding_learning.py `
|
||||
--wait-for-sha-change 0ca61aa4ed041fc4219cada0126d5f144e59d30d `
|
||||
--max-wait-seconds 300 `
|
||||
--report reports/1c-sql/upo_test/form-command-binding-learning-run.json
|
||||
```
|
||||
|
||||
Then use the adapter diff/inference output to promote a decoder/write rule.
|
||||
If the first load is clean, repeat with `02-standard-button-to-local-command`
|
||||
or `03-combined-command-binding-switches`.
|
||||
|
||||
## Experiment A: Standard Command Binding
|
||||
|
||||
Goal: learn where marker `34` stores a standard command binding.
|
||||
|
||||
After any manual save, the preferred one-command runner is:
|
||||
|
||||
```powershell
|
||||
python scripts/run_1c_form_command_binding_learning.py `
|
||||
--wait-for-sha-change 0ca61aa4ed041fc4219cada0126d5f144e59d30d `
|
||||
--max-wait-seconds 300 `
|
||||
--report reports/1c-sql/upo_test/form-command-binding-learning-run.json
|
||||
```
|
||||
|
||||
Manual edit in Designer:
|
||||
|
||||
1. Open form `ТестНастройки`.
|
||||
2. Select button `ТЗИзменитьФорму`.
|
||||
3. Change only `CommandName` from `Form.StandardCommand.CustomizeForm` to a
|
||||
different standard command if Designer allows it.
|
||||
4. Save the form once.
|
||||
|
||||
After save, capture:
|
||||
|
||||
```powershell
|
||||
@'
|
||||
import json, urllib.request
|
||||
payload = {
|
||||
"base_id": "upo_test",
|
||||
"learning_id": "form-command-binding-standard-customize-form",
|
||||
"table": "ConfigCASSave",
|
||||
"file_name": "f96a0c45-3eff-11f1-8287-005056b0d483__25c39fbf-35a4-4b43-8e3f-cd1f91082c88.0",
|
||||
"form": "ТестНастройки",
|
||||
"element": "ТЗИзменитьФорму",
|
||||
"property": "ИмяКоманды",
|
||||
"timeout_seconds": 60,
|
||||
"max_items": 5000
|
||||
}
|
||||
req = urllib.request.Request("http://docker-gpu.cin.su:8011/rpc", data=json.dumps({"method":"metadata.write_learning.capture_after","payload":payload}, ensure_ascii=False).encode("utf-8"), headers={"Content-Type":"application/json"})
|
||||
print(urllib.request.urlopen(req, timeout=90).read().decode("utf-8"))
|
||||
'@ | python -
|
||||
```
|
||||
|
||||
Then run:
|
||||
|
||||
```powershell
|
||||
@'
|
||||
import json, urllib.request
|
||||
for method in ("metadata.write_learning.diff", "metadata.write_learning.infer_rule"):
|
||||
payload = {"learning_id": "form-command-binding-standard-customize-form"}
|
||||
req = urllib.request.Request("http://docker-gpu.cin.su:8011/rpc", data=json.dumps({"method": method, "payload": payload}, ensure_ascii=False).encode("utf-8"), headers={"Content-Type":"application/json"})
|
||||
print(urllib.request.urlopen(req, timeout=90).read().decode("utf-8"))
|
||||
'@ | python -
|
||||
```
|
||||
|
||||
## Experiment B: Local Form Command Binding
|
||||
|
||||
Goal: learn where marker `34` stores a local form command binding.
|
||||
|
||||
Use the same one-command runner above after the manual save.
|
||||
|
||||
Manual edit in Designer:
|
||||
|
||||
1. Open form `ТестНастройки`.
|
||||
2. Select button `ФормаКомандаОбновить`.
|
||||
3. Change only `CommandName` from `Form.Command.КомандаПрименить` to
|
||||
`Form.Command.КомандаПример1` or `Form.Command.КомандаПример2`.
|
||||
4. Save the form once.
|
||||
|
||||
After save, capture:
|
||||
|
||||
```powershell
|
||||
@'
|
||||
import json, urllib.request
|
||||
payload = {
|
||||
"base_id": "upo_test",
|
||||
"learning_id": "form-command-binding-local-apply-command",
|
||||
"table": "ConfigCASSave",
|
||||
"file_name": "f96a0c45-3eff-11f1-8287-005056b0d483__25c39fbf-35a4-4b43-8e3f-cd1f91082c88.0",
|
||||
"form": "ТестНастройки",
|
||||
"element": "ФормаКомандаОбновить",
|
||||
"property": "ИмяКоманды",
|
||||
"timeout_seconds": 60,
|
||||
"max_items": 5000
|
||||
}
|
||||
req = urllib.request.Request("http://docker-gpu.cin.su:8011/rpc", data=json.dumps({"method":"metadata.write_learning.capture_after","payload":payload}, ensure_ascii=False).encode("utf-8"), headers={"Content-Type":"application/json"})
|
||||
print(urllib.request.urlopen(req, timeout=90).read().decode("utf-8"))
|
||||
'@ | python -
|
||||
```
|
||||
|
||||
Then run:
|
||||
|
||||
```powershell
|
||||
@'
|
||||
import json, urllib.request
|
||||
for method in ("metadata.write_learning.diff", "metadata.write_learning.infer_rule"):
|
||||
payload = {"learning_id": "form-command-binding-local-apply-command"}
|
||||
req = urllib.request.Request("http://docker-gpu.cin.su:8011/rpc", data=json.dumps({"method": method, "payload": payload}, ensure_ascii=False).encode("utf-8"), headers={"Content-Type":"application/json"})
|
||||
print(urllib.request.urlopen(req, timeout=90).read().decode("utf-8"))
|
||||
'@ | python -
|
||||
```
|
||||
|
||||
## Promotion Gate
|
||||
|
||||
Promote a decoder/write rule only when the after capture changes exactly one
|
||||
intended command binding. If `metadata.write_learning.diff` reports
|
||||
`no_changes`, use low-level `payload.diff` against the baseline payload SHA1
|
||||
and implement a dedicated command-binding decoder from the scalar tree diff.
|
||||
Reference in New Issue
Block a user