From 10224c6344d623c6d7aa0b2b748595ab66aee704 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Wed, 22 Jul 2026 03:31:10 +0300 Subject: [PATCH] Propagate repository lock context through SQL writes --- plugins/1c/connector/adapter_1c_server.py | 25 +++++++++++++++++++++++ tests/1c/test_payload_codec.py | 6 ++++++ 2 files changed, 31 insertions(+) diff --git a/plugins/1c/connector/adapter_1c_server.py b/plugins/1c/connector/adapter_1c_server.py index 1af502f..007afe4 100644 --- a/plugins/1c/connector/adapter_1c_server.py +++ b/plugins/1c/connector/adapter_1c_server.py @@ -11914,6 +11914,7 @@ def metadata_write_rollback(payload: dict[str, Any]) -> dict[str, Any]: } rollback_result = storage_saved_state_rollback( { + **repository_write_context(payload), "base_id": base_id, "backup_id": backup_id, "allow_sql_saved_state_rollback": True, @@ -16783,11 +16784,23 @@ def storage_saved_state_apply_proposal(payload: dict[str, Any]) -> dict[str, Any ) +def repository_write_context(payload: dict[str, Any]) -> dict[str, Any]: + """Carry repository coordination through nested write operations.""" + return { + key: payload[key] + for key in ("lock_session_id", "repository_object") + if payload.get(key) is not None + } + + def storage_saved_state_rollback(payload: dict[str, Any]) -> dict[str, Any]: method = "storage.saved_state.rollback" base_id_or_error = require_base_id(payload, method) if isinstance(base_id_or_error, dict): return base_id_or_error + repository_error = repository_apply_gate(payload, method, "apply_and_rollback") + if repository_error: + return repository_error allow_rollback, allow_error = strict_bool_argument(payload, "allow_sql_saved_state_rollback", method=method, default=False) if allow_error: return allow_error @@ -16827,6 +16840,7 @@ def storage_saved_state_rollback(payload: dict[str, Any]) -> dict[str, Any]: rollback_payload["base_id"] = base_id_or_error rollback_payload["allow_sql_saved_state_apply"] = True rollback_payload["timeout_seconds"] = int(timeout_seconds or 30) + rollback_payload.update(repository_write_context(payload)) apply_result = storage_saved_state_apply_proposal(rollback_payload) return { "schema": "onec_storage_saved_state_rollback.v1", @@ -37883,6 +37897,7 @@ def metadata_form_element_write_apply(payload: dict[str, Any]) -> dict[str, Any] return timeout_error apply_result = storage_saved_state_apply_proposal( { + **repository_write_context(payload), "base_id": payload.get("base_id"), "allow_sql_saved_state_apply": True, "proposal": proposal, @@ -37923,6 +37938,7 @@ def metadata_form_element_write_apply(payload: dict[str, Any]) -> dict[str, Any] return result rollback_result = storage_saved_state_rollback( { + **repository_write_context(payload), "base_id": payload.get("base_id"), "allow_sql_saved_state_rollback": True, "backup_id": backup_id, @@ -38118,6 +38134,7 @@ def metadata_form_target_move(payload: dict[str, Any]) -> dict[str, Any]: return invalid_argument(method, "allow_sql_saved_state_apply", "Apply mode is opt-in; pass allow_sql_saved_state_apply=true.") apply_result = storage_saved_state_apply_proposal( { + **repository_write_context(payload), "base_id": base_id, "allow_sql_saved_state_apply": True, "proposal": proposal, @@ -38141,6 +38158,7 @@ def metadata_form_target_move(payload: dict[str, Any]) -> dict[str, Any]: return result rollback_result = storage_saved_state_rollback( { + **repository_write_context(payload), "base_id": base_id, "allow_sql_saved_state_rollback": True, "backup_id": backup_id, @@ -38747,6 +38765,7 @@ def form_embedded_module_handler_write_apply( return invalid_argument(method, "allow_sql_saved_state_apply", "Apply mode is opt-in; pass allow_sql_saved_state_apply=true.") apply_result = storage_saved_state_apply_proposal( { + **repository_write_context(payload), "base_id": base_id, "allow_sql_saved_state_apply": True, "proposal": proposal, @@ -38775,6 +38794,7 @@ def form_embedded_module_handler_write_apply( return result rollback_result = storage_saved_state_rollback( { + **repository_write_context(payload), "base_id": base_id, "allow_sql_saved_state_rollback": True, "backup_id": backup_id, @@ -39157,6 +39177,7 @@ def metadata_form_command_button_write(payload: dict[str, Any]) -> dict[str, Any return invalid_argument(method, "allow_sql_saved_state_apply", "Apply mode is opt-in; pass allow_sql_saved_state_apply=true.") apply_result = storage_saved_state_apply_proposal( { + **repository_write_context(payload), "base_id": base_id, "allow_sql_saved_state_apply": True, "proposal": proposal, @@ -39176,6 +39197,7 @@ def metadata_form_command_button_write(payload: dict[str, Any]) -> dict[str, Any if backup_id and payload.get("allow_sql_saved_state_rollback") is True: rollback_result = storage_saved_state_rollback( { + **repository_write_context(payload), "base_id": base_id, "allow_sql_saved_state_rollback": True, "backup_id": backup_id, @@ -39227,6 +39249,7 @@ def metadata_form_command_button_write(payload: dict[str, Any]) -> dict[str, Any return finalize_command_button_write_result(result) rollback_result = storage_saved_state_rollback( { + **repository_write_context(payload), "base_id": base_id, "allow_sql_saved_state_rollback": True, "backup_id": backup_id, @@ -39544,6 +39567,7 @@ def metadata_module_write_apply(payload: dict[str, Any]) -> dict[str, Any]: return invalid_argument(method, "allow_sql_saved_state_apply", "Apply mode is opt-in; pass allow_sql_saved_state_apply=true.") apply_result = storage_saved_state_apply_proposal( { + **repository_write_context(payload), "base_id": base_id, "allow_sql_saved_state_apply": True, "proposal": proposal, @@ -39572,6 +39596,7 @@ def metadata_module_write_apply(payload: dict[str, Any]) -> dict[str, Any]: return result rollback_result = storage_saved_state_rollback( { + **repository_write_context(payload), "base_id": base_id, "allow_sql_saved_state_rollback": True, "backup_id": backup_id, diff --git a/tests/1c/test_payload_codec.py b/tests/1c/test_payload_codec.py index 7fa593d..85b6fc0 100644 --- a/tests/1c/test_payload_codec.py +++ b/tests/1c/test_payload_codec.py @@ -21694,6 +21694,8 @@ def test_metadata_module_write_apply_applies_and_rolls_back(monkeypatch: pytest. "mode": "apply_and_rollback", "allow_sql_saved_state_apply": True, "allow_sql_saved_state_rollback": True, + "lock_session_id": "rlock-test", + "repository_object": "Справочник.Тест", "old": "a", "new": "b", } @@ -21701,7 +21703,11 @@ def test_metadata_module_write_apply_applies_and_rolls_back(monkeypatch: pytest. assert seen["proposal_payload"]["include_payload"] is True assert seen["apply"]["proposal"] is proposal + assert seen["apply"]["lock_session_id"] == "rlock-test" + assert seen["apply"]["repository_object"] == "Справочник.Тест" assert seen["rollback"]["backup_id"] == "c" * 32 + assert seen["rollback"]["lock_session_id"] == "rlock-test" + assert seen["rollback"]["repository_object"] == "Справочник.Тест" assert result["proposal"]["encoded"] == {"sha1": "new"} assert result["status"] == "verified_and_rolled_back" assert result["applied"] is True