7.1 KiB
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:
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:
- Load
01-local-button-command-example1/Form.xmlintoфс_ДоработкиОбщее.DataProcessor.фс_НастройкаУсловногоОформления.Forms.ТестНастройки. - Update/save the extension so
ConfigCASSavereceives a new form payload. - Run:
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:
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:
- Open form
ТестНастройки. - Select button
ТЗИзменитьФорму. - Change only
CommandNamefromForm.StandardCommand.CustomizeFormto a different standard command if Designer allows it. - Save the form once.
After save, capture:
@'
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:
@'
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:
- Open form
ТестНастройки. - Select button
ФормаКомандаОбновить. - Change only
CommandNamefromForm.Command.КомандаПрименитьtoForm.Command.КомандаПример1orForm.Command.КомандаПример2. - Save the form once.
After save, capture:
@'
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:
@'
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.