Model 1C modules as object parts
CI / python (push) Has been cancelled
CI / rust (push) Has been cancelled

This commit is contained in:
2026-05-17 18:43:43 +03:00
parent 1ad103b6dc
commit 35dd134ebc
7 changed files with 298 additions and 32 deletions
+40 -2
View File
@@ -552,6 +552,16 @@ def test_html5_object_context_fragment(tmp_path: Path):
Процедура ПроверитьКонтрагента()
КонецПроцедуры
""",
encoding="utf-8",
)
form_module = tmp_path / "Documents" / "ЗаказПокупателя" / "Forms" / "ФормаДокумента" / "Ext" / "Form" / "Module.bsl"
form_module.parent.mkdir(parents=True)
form_module.write_text(
"""
Процедура ПриОткрытии()
Сообщить("Форма готова");
КонецПроцедуры
""",
encoding="utf-8",
)
@@ -630,6 +640,10 @@ def test_html5_object_context_fragment(tmp_path: Path):
assert 'hx-target="[data-html5-flowchart]"' in context.text
assert f"/html5/projects/{project_id}/flowchart?focus=%D0%94%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82.%D0%97%D0%B0%D0%BA%D0%B0%D0%B7%D0%9F%D0%BE%D0%BA%D1%83%D0%BF%D0%B0%D1%82%D0%B5%D0%BB%D1%8F&depth=1" in context.text
assert 'hx-target="[data-html5-source]"' in context.text
assert 'data-html5-module-action="OBJECT_MODULE"' in context.text
assert 'data-html5-module-action="FORM_MODULE"' in context.text
assert "Модуль объекта" in context.text
assert "Модуль формы ФормаДокумента" in context.text
assert 'hx-target="[data-html5-symbol-detail]"' in context.text
assert "Контрагент" in context.text
assert "Товары" in context.text
@@ -647,6 +661,10 @@ def test_html5_object_context_fragment(tmp_path: Path):
assert 'hx-swap-oob="outerHTML"' in context.text
assert "Карта связей · focus" in context.text
assert "data-html5-source" in context.text
assert 'data-html5-object-cache="warm"' in context.text
assert 'data-html5-owner="Документ.ЗаказПокупателя"' in context.text
assert 'data-html5-object-part="object.module"' in context.text
assert "data-html5-object-cache-summary" in context.text
assert "data-html5-source-summary" in context.text
assert "ObjectModule.bsl" in context.text
assert "Соединение = Новый HTTPСоединение" in context.text
@@ -1626,6 +1644,9 @@ def test_import_edt_full_replace_includes_object_bsl_modules_in_normalized_model
"""
<mdclass:Catalog xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass">
<name>Контрагенты</name>
<forms>
<name>ФормаЭлемента</name>
</forms>
</mdclass:Catalog>
""",
encoding="utf-8",
@@ -1641,6 +1662,15 @@ def test_import_edt_full_replace_includes_object_bsl_modules_in_normalized_model
"""
Процедура Создать() Экспорт
КонецПроцедуры
""",
encoding="utf-8",
)
form_module_dir = catalog_dir / "Forms" / "ФормаЭлемента" / "Ext" / "Form"
form_module_dir.mkdir(parents=True)
(form_module_dir / "Module.bsl").write_text(
"""
Процедура ПриОткрытии()
КонецПроцедуры
""",
encoding="utf-8",
)
@@ -1653,15 +1683,20 @@ def test_import_edt_full_replace_includes_object_bsl_modules_in_normalized_model
)
assert imported.status_code == 200
assert imported.json()["normalized_summary"]["module_count"] == 2
assert imported.json()["normalized_summary"]["module_count"] == 3
detail = client.get(
f"/projects/{project_id}/normalized/object",
params={"qualified_name": "Справочник.Контрагенты"},
)
assert detail.status_code == 200
modules = detail.json()["object"]["modules"]
assert [module["module_kind"] for module in modules] == ["MANAGER_MODULE", "OBJECT_MODULE"]
assert {module["module_kind"] for module in modules} == {"FORM_MODULE", "MANAGER_MODULE", "OBJECT_MODULE"}
assert all(module["attributes"]["source_hash"] for module in modules)
form_module = next(module for module in modules if module["module_kind"] == "FORM_MODULE")
assert form_module["attributes"]["owner_qualified_name"] == "Справочник.Контрагенты"
assert form_module["attributes"]["object_part"] == "form.ФормаЭлемента.module"
assert form_module["attributes"]["form_name"] == "ФормаЭлемента"
assert form_module["attributes"]["form_qualified_name"] == "Справочник.Контрагенты.ФормаЭлемента"
def test_import_edt_full_replace_keeps_tabular_section_columns_nested(tmp_path: Path):
@@ -2176,6 +2211,9 @@ def test_normalized_object_modules_returns_linked_bsl_source(tmp_path: Path):
assert modules.status_code == 200
payload = modules.json()
assert payload[0]["module_role"] == "OBJECT_MODULE"
assert payload[0]["owner_qualified_name"] == "Справочник.Контрагенты"
assert payload[0]["owner_kind"] == "CATALOG"
assert payload[0]["object_part"] == "object.module"
assert "ПередЗаписью" in payload[0]["source_text"]
assert payload[0]["routines_count"] == 2
assert payload[0]["routines"][0]["name"] == "ПередЗаписью"