diff --git a/plugins/1c/connector/adapter_1c_server.py b/plugins/1c/connector/adapter_1c_server.py index 75aafff..61eecba 100644 --- a/plugins/1c/connector/adapter_1c_server.py +++ b/plugins/1c/connector/adapter_1c_server.py @@ -40949,7 +40949,7 @@ def saved_state_form_search_row( if descriptor_identity.get("guid") and not form.get("guid"): form["guid"] = descriptor_identity.get("guid") owner = decoded.get("owner") if isinstance(decoded.get("owner"), dict) else {} - if not owner.get("name") and not bool(payload.get("include_storage")): + if not owner.get("name"): related_owner = saved_state_related_descriptor_identity( base_id=base_id, table=table, @@ -40986,6 +40986,7 @@ def public_saved_state_form_search_row( row: dict[str, Any], *, requested_owner_kind: str | None = None, + requested_extension: str | None = None, ) -> dict[str, Any]: owner = row.get("owner") if isinstance(row.get("owner"), dict) else {} form = row.get("form") if isinstance(row.get("form"), dict) else {} @@ -41011,6 +41012,7 @@ def public_saved_state_form_search_row( if part ) form_selector = { + **({"extension": requested_extension} if requested_extension else {}), **({"ref": owner_ref} if owner_ref else {}), **({"form": form_name} if form_name else {}), **({"qualified_name": qualified_name} if qualified_name else {}), @@ -41168,7 +41170,11 @@ def metadata_saved_state_forms_search(payload: dict[str, Any]) -> dict[str, Any] 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) + public_saved_state_form_search_row( + row, + requested_owner_kind=owner_kind, + requested_extension=extension_filter or None, + ) for row in rows ] return { diff --git a/tests/1c/test_payload_codec.py b/tests/1c/test_payload_codec.py index b44ec98..b329276 100644 --- a/tests/1c/test_payload_codec.py +++ b/tests/1c/test_payload_codec.py @@ -3024,6 +3024,7 @@ def test_saved_state_forms_search_disambiguates_same_form_name_by_owner(monkeypa def test_saved_state_forms_search_default_is_name_first(monkeypatch: pytest.MonkeyPatch) -> None: file_name = "extension-guid__form-guid.0" + monkeypatch.setattr(adapter_server, "extension_filter_to_guid", lambda *args, **kwargs: ("extension-guid", None)) monkeypatch.setattr( adapter_server, "storage_files_list", @@ -3080,6 +3081,7 @@ def test_saved_state_forms_search_default_is_name_first(monkeypatch: pytest.Monk { "base_id": "upo_test", "tables": ["ConfigCASSave"], + "extension": "test2", "ref": "Catalog.test2", "form": "t_Форма", "command": "ЗаменаДомена", @@ -3092,11 +3094,13 @@ def test_saved_state_forms_search_default_is_name_first(monkeypatch: pytest.Monk form = result["forms"][0] assert form["qualified_name"] == "test2.t_Форма" assert form["selector"] == { + "extension": "test2", "ref": "Catalog.test2", "form": "t_Форма", "qualified_name": "test2.t_Форма", } assert form["matches"][0]["selector"] == { + "extension": "test2", "ref": "Catalog.test2", "form": "t_Форма", "qualified_name": "test2.t_Форма", @@ -3125,6 +3129,47 @@ def test_saved_state_forms_search_default_is_name_first(monkeypatch: pytest.Monk assert storage_marker not in str(result) +def test_saved_state_form_search_resolves_owner_for_internal_name_first_write(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr( + adapter_server, + "metadata_form_decode", + lambda payload: { + "status": "ok", + "source": {"kind": "live_sql", "table": payload["table"], "file_name": payload["file_name"]}, + "form": {"file_name": payload["file_name"]}, + "profile": {"items": [], "commands": []}, + "counts": {"items": 0, "commands": 0}, + }, + ) + monkeypatch.setattr( + adapter_server, + "saved_state_form_descriptor_identity", + lambda **kwargs: {"name": "t_Форма", "synonym": "T форма", "guid": "form-guid"}, + ) + monkeypatch.setattr( + adapter_server, + "saved_state_related_descriptor_identity", + lambda **kwargs: { + "kind": "Catalog", + "name": "test2", + "synonym": "Test2", + "guid": "owner-guid", + }, + ) + + row = adapter_server.saved_state_form_search_row( + base_id="upo_test", + table="ConfigCASSave", + file_name="extension-guid__form-guid.0", + payload={"include_storage": True, "form": "t_Форма"}, + timeout_seconds=30, + ) + + assert row is not None + assert row["owner"]["kind"] == "Catalog" + assert row["owner"]["name"] == "test2" + + def test_saved_state_forms_search_help_exposes_owner_and_form_selectors() -> None: method = { row["name"]: row