Compose name-first form write plans

This commit is contained in:
2026-07-26 17:30:04 +03:00
parent c1d5d06f6d
commit 39c8c4ab18
6 changed files with 603 additions and 10 deletions
+174 -8
View File
@@ -41169,14 +41169,29 @@ def metadata_saved_state_forms_search(payload: dict[str, Any]) -> dict[str, Any]
break
if len(rows) >= int(limit or 50):
break
public_rows = rows if include_storage else [
public_saved_state_form_search_row(
row,
requested_owner_kind=owner_kind,
requested_extension=extension_filter or None,
)
for row in rows
]
extension_names_by_guid: dict[str, str] = {}
if not include_storage and not extension_filter and any(row.get("table") == "ConfigCASSave" for row in rows):
extension_names_by_guid = {
guid: str(item.get("name") or guid)
for guid, item in extension_map_by_guid(base_id).items()
}
public_rows = rows if include_storage else []
if not include_storage:
for row in rows:
row_extension = extension_filter or None
if not row_extension and row.get("table") == "ConfigCASSave":
row_source = row.get("source") if isinstance(row.get("source"), dict) else {}
row_file_name = str(row.get("file_name") or row_source.get("file_name") or "")
extension_guid_from_file = row_file_name.split("__", 1)[0].strip().lower() if "__" in row_file_name else ""
if extension_guid_from_file:
row_extension = extension_names_by_guid.get(extension_guid_from_file)
public_rows.append(
public_saved_state_form_search_row(
row,
requested_owner_kind=owner_kind,
requested_extension=row_extension,
)
)
return {
"schema": "onec_saved_state_form_search.v1",
"status": "ok",
@@ -46265,6 +46280,26 @@ def metadata_write_plan_apply_payload_hint(
hint["payload"]["attribute"] = path_resolution.get("attribute_name")
elif form_member_path:
hint["payload"]["element"] = form_member_path[-1]
for field in (
"extension",
"ref",
"object_ref",
"form",
"form_name",
"command",
"element",
"element_name",
"attribute",
"element_path",
"element_id",
"id",
):
value = target.get(field) if target.get(field) not in (None, "") else payload.get(field)
if value not in (None, ""):
hint["payload"][field] = value
edits = payload.get("edits") if isinstance(payload.get("edits"), list) else intent.get("edits")
if isinstance(edits, list) and edits:
hint["payload"]["edits"] = edits
for field in ("table", "property", "value"):
value = metadata_write_plan_first_value(payload, target, intent, field)
if value is not None:
@@ -46681,6 +46716,115 @@ def metadata_write_plan_resolve_public_module_target(
}
def metadata_write_plan_resolve_public_form_target(
payload: dict[str, Any],
target: dict[str, Any],
intent: dict[str, Any],
) -> tuple[dict[str, Any], dict[str, Any]]:
"""Resolve a public 1C form selector to an internal saved-state handle."""
selector_ref = str(target.get("ref") or target.get("object_ref") or payload.get("ref") or payload.get("object_ref") or "").strip()
selector_kind = str(
target.get("object_kind")
or target.get("object_type")
or payload.get("object_kind")
or payload.get("object_type")
or ""
).strip()
selector_name = str(target.get("object_name") or payload.get("object_name") or "").strip()
form_name = str(target.get("form") or target.get("form_name") or payload.get("form") or payload.get("form_name") or "").strip()
parsed_ref = parse_1c_object_path(selector_ref) if selector_ref else {}
if not selector_kind and parsed_ref.get("kind"):
selector_kind = str(parsed_ref.get("kind") or "")
if not selector_name and parsed_ref.get("name"):
selector_name = str(parsed_ref.get("name") or "")
if not form_name and canonical_kind(selector_kind) == "CommonForm":
form_name = selector_name
extension = str(target.get("extension") or payload.get("extension") or "").strip()
member_selector: dict[str, Any] = {}
for key in ("command", "element", "element_name", "attribute", "element_path", "element_id", "id"):
value = target.get(key) if target.get(key) not in (None, "") else payload.get(key)
if value not in (None, ""):
member_selector[key] = value
public_selector = {
**({"extension": extension} if extension else {}),
**({"ref": selector_ref} if selector_ref else {}),
**({"kind": canonical_kind(selector_kind)} if selector_kind and not selector_ref else {}),
**({"name": selector_name} if selector_name and not selector_ref else {}),
**({"form": form_name} if form_name else {}),
**member_selector,
}
if not (selector_ref or (selector_kind and selector_name)):
return target, {
"status": "not_attempted",
"error": "public_object_selector_missing",
"selector": public_selector,
}
if not form_name and canonical_kind(selector_kind) != "CommonForm":
return target, {
"status": "not_attempted",
"error": "public_form_selector_missing",
"selector": public_selector,
}
first_edit = next(
(item for item in payload.get("edits") or [] if isinstance(item, dict)),
{},
)
property_name = metadata_write_plan_first_value(payload, target, intent, "property")
if property_name in (None, ""):
property_name = first_edit.get("property")
value_present = any(
isinstance(source, dict) and "value" in source
for source in (intent, target, payload, first_edit)
)
property_value = metadata_write_plan_first_value(payload, target, intent, "value")
if "value" in first_edit and property_value is None:
property_value = first_edit.get("value")
resolve_payload: dict[str, Any] = {
"base_id": payload.get("base_id"),
"table": str(target.get("table") or payload.get("table") or ("ConfigCASSave" if extension else "ConfigSave")),
"include_storage": True,
"search_limit": int(payload.get("search_limit") or 10),
"scan_limit": int(payload.get("scan_limit") or 1000),
"timeout_seconds": int(payload.get("timeout_seconds") or 60),
**public_selector,
**({"property": property_name} if property_name not in (None, "") else {}),
**({"value": property_value} if value_present else {}),
}
resolved = metadata_form_write_target_resolve(resolve_payload)
if resolved.get("status") != "ok":
return target, {
"status": str(resolved.get("status") or "error"),
"error": "public_form_target_not_resolved",
"selector": public_selector,
"resolution_status": resolved.get("status"),
**({"counts": resolved.get("counts")} if isinstance(resolved.get("counts"), dict) else {}),
}
source = resolved.get("source") if isinstance(resolved.get("source"), dict) else {}
file_name = str(source.get("file_name") or "").strip()
table = str(source.get("table") or resolve_payload.get("table") or "").strip()
if not file_name or table not in FORM_ELEMENT_SAVED_STATE_TABLES:
return target, {
"status": "error",
"error": "public_form_target_storage_handle_missing",
"selector": public_selector,
}
resolved_target = {
**target,
"table": table,
"file_name": file_name,
}
return resolved_target, {
"status": "resolved",
"method": FORM_WRITE_TARGET_RESOLVE_METHOD,
"selector": public_selector,
"counts": {"matches": int((resolved.get("counts") or {}).get("matches") or 1)},
}
def metadata_write_plan(payload: dict[str, Any]) -> dict[str, Any]:
method = METADATA_WRITE_PLAN_METHOD
target = dict(payload.get("target")) if isinstance(payload.get("target"), dict) else {}
@@ -46695,6 +46839,7 @@ def metadata_write_plan(payload: dict[str, Any]) -> dict[str, Any]:
)
target_kind_hint = str(target_kind_raw or "").strip().casefold()
module_name_resolution: dict[str, Any] | None = None
form_name_resolution: dict[str, Any] | None = None
has_public_module_selector = bool(
target.get("ref")
or target.get("object_ref")
@@ -46706,6 +46851,17 @@ def metadata_write_plan(payload: dict[str, Any]) -> dict[str, Any]:
and has_public_module_selector
):
target, module_name_resolution = metadata_write_plan_resolve_public_module_target(payload, target)
has_public_form_selector = bool(
target.get("ref")
or target.get("object_ref")
or ((target.get("object_kind") or target.get("object_type")) and target.get("object_name"))
) and bool(target.get("form") or target.get("form_name") or target.get("command") or target.get("element") or target.get("attribute"))
if (
target_kind_hint in {"form", "форма"}
and not metadata_write_concrete_reference_info(payload, target)
and has_public_form_selector
):
target, form_name_resolution = metadata_write_plan_resolve_public_form_target(payload, target, intent)
canonical_path = str(
target.get("canonical_path")
@@ -46757,6 +46913,14 @@ def metadata_write_plan(payload: dict[str, Any]) -> dict[str, Any]:
"resolution_status": module_name_resolution.get("status"),
}
)
if form_name_resolution and form_name_resolution.get("status") != "resolved":
problems.append(
{
"code": str(form_name_resolution.get("error") or "public_form_target_not_resolved"),
"message": "The public 1C form selector did not resolve to exactly one saved-state form target.",
"resolution_status": form_name_resolution.get("status"),
}
)
if not path_resolution.get("is_full_path") and not concrete_reference:
problems.append(
{
@@ -46833,6 +46997,8 @@ def metadata_write_plan(payload: dict[str, Any]) -> dict[str, Any]:
}
if module_name_resolution:
route["name_resolution"] = module_name_resolution
elif form_name_resolution:
route["name_resolution"] = form_name_resolution
if extension_action:
route["extension_action"] = extension_action
if operation_was_inferred_from_extension_action: