diff --git a/packages/one-c-normalizer/src/one_c_normalizer/__init__.py b/packages/one-c-normalizer/src/one_c_normalizer/__init__.py index ab91e3a..0fc449b 100644 --- a/packages/one-c-normalizer/src/one_c_normalizer/__init__.py +++ b/packages/one-c-normalizer/src/one_c_normalizer/__init__.py @@ -506,6 +506,13 @@ _OBJECT_KIND_BY_TAG = { "subsystem": "SUBSYSTEM", "subsystems": "SUBSYSTEM", "подсистема": "SUBSYSTEM", + "sequence": "SEQUENCE", + "sequences": "SEQUENCE", + "последовательность": "SEQUENCE", + "documentnumerator": "DOCUMENT_NUMERATOR", + "documentnumerators": "DOCUMENT_NUMERATOR", + "нумератордокументов": "DOCUMENT_NUMERATOR", + "нумератор": "DOCUMENT_NUMERATOR", "httpservice": "HTTP_SERVICE", "httpservices": "HTTP_SERVICE", "httpсервис": "HTTP_SERVICE", @@ -722,6 +729,15 @@ _FORM_ELEMENT_TAGS = { _QUALIFIED_PREFIX_BY_KIND = { "CATALOG": "Справочник", "DOCUMENT": "Документ", + "CONSTANT": "Константа", + "DOCUMENT_JOURNAL": "ЖурналДокументов", + "ENUM": "Перечисление", + "REPORT": "Отчет", + "DATA_PROCESSOR": "Обработка", + "CHART_OF_CHARACTERISTIC_TYPES": "ПланВидовХарактеристик", + "CHART_OF_ACCOUNTS": "ПланСчетов", + "CHART_OF_CALCULATION_TYPES": "ПланВидовРасчета", + "EXTERNAL_DATA_SOURCE": "ВнешнийИсточникДанных", "REGISTER": "Регистр", "INFORMATION_REGISTER": "РегистрСведений", "ACCUMULATION_REGISTER": "РегистрНакопления", @@ -734,6 +750,8 @@ _QUALIFIED_PREFIX_BY_KIND = { "BUSINESS_PROCESS": "БизнесПроцесс", "TASK": "Задача", "SUBSYSTEM": "Подсистема", + "SEQUENCE": "Последовательность", + "DOCUMENT_NUMERATOR": "НумераторДокументов", "HTTP_SERVICE": "HTTPСервис", "WEB_SERVICE": "WebСервис", "WS_REFERENCE": "WSСсылка", @@ -803,6 +821,8 @@ _QUALIFIED_PREFIX_BY_TAG = { "bot": "Бот", "interface": "Интерфейс", "fulltextsearchdictionary": "СловарьПолнотекстовогоПоиска", + "sequence": "Последовательность", + "documentnumerator": "НумераторДокументов", } _ROOT_METADATA_OBJECT_KINDS = { @@ -830,6 +850,8 @@ _ROOT_METADATA_OBJECT_KINDS = { "BUSINESS_PROCESS", "TASK", "SUBSYSTEM", + "SEQUENCE", + "DOCUMENT_NUMERATOR", "HTTP_SERVICE", "WEB_SERVICE", "WS_REFERENCE", @@ -851,6 +873,7 @@ _ROOT_METADATA_OBJECT_KINDS = { "COMMON_LAYOUT", "COMMON_PICTURE", "INTEGRATION_SERVICE", + "EXTENSION", "PALETTE_COLOR", "STYLE_ITEM", "STYLE", @@ -861,8 +884,11 @@ _ROOT_METADATA_OBJECT_KINDS = { _GROUP_BY_OBJECT_KIND = { "PROJECT": "Конфигурация", "COMMON_MODULE": "Общие модули", + "CONSTANT": "Константы", "CATALOG": "Справочники", "DOCUMENT": "Документы", + "DOCUMENT_JOURNAL": "Журналы документов", + "ENUM": "Перечисления", "REGISTER": "Регистры", "INFORMATION_REGISTER": "Регистры сведений", "ACCUMULATION_REGISTER": "Регистры накопления", @@ -870,10 +896,18 @@ _GROUP_BY_OBJECT_KIND = { "CALCULATION_REGISTER": "Регистры расчета", "REPORT": "Отчеты", "DATA_PROCESSOR": "Обработки", + "CHART_OF_CHARACTERISTIC_TYPES": "Планы видов характеристик", + "CHART_OF_ACCOUNTS": "Планы счетов", + "CHART_OF_CALCULATION_TYPES": "Планы видов расчета", + "BUSINESS_PROCESS": "Бизнес-процессы", + "TASK": "Задачи", + "EXTENSION": "Расширения конфигурации", "FORM": "Формы", "COMMAND": "Команды", "ROLE": "Роли", "SUBSYSTEM": "Подсистемы", + "SEQUENCE": "Последовательности", + "DOCUMENT_NUMERATOR": "Нумераторы документов", "HTTP_SERVICE": "HTTP-сервисы", "WEB_SERVICE": "Web-сервисы", "WS_REFERENCE": "WS-ссылки", diff --git a/packages/one-c-normalizer/src/one_c_normalizer/metadata_catalog.py b/packages/one-c-normalizer/src/one_c_normalizer/metadata_catalog.py index 3dbffc2..a741bdc 100644 --- a/packages/one-c-normalizer/src/one_c_normalizer/metadata_catalog.py +++ b/packages/one-c-normalizer/src/one_c_normalizer/metadata_catalog.py @@ -34,6 +34,8 @@ COMMON_BRANCH_CHILDREN = ( "Подписки на события", "Критерии отбора", "Регламентные задания", + "Последовательности", + "Нумераторы документов", "Функциональные опции", "Параметры функциональных опций", "Определяемые типы", @@ -145,6 +147,7 @@ REPORT_CHILDREN = ( METADATA_TYPE_SPECS: tuple[MetadataTypeSpec, ...] = ( MetadataTypeSpec("COMMON", "Общие", "Общие", "common", COMMON_BRANCH_CHILDREN), + MetadataTypeSpec("SUBSYSTEM", "Подсистема", "Подсистемы", "subsystem", ("Состав", "Командный интерфейс", "Права")), MetadataTypeSpec( "COMMON_MODULE", "Общий модуль", @@ -186,8 +189,11 @@ METADATA_TYPE_SPECS: tuple[MetadataTypeSpec, ...] = ( MetadataTypeSpec("EXTERNAL_DATA_SOURCE", "Внешний источник данных", "Внешние источники данных", "external-source", ("Таблицы", "Кубы", "Функции", "Формы", "Команды", "Макеты")), MetadataTypeSpec("EXCHANGE_PLAN", "План обмена", "Планы обмена", "exchange-plan", STRUCTURED_OBJECT_CHILDREN + ("Состав",), OBJECT_MODULES), MetadataTypeSpec("EVENT_SUBSCRIPTION", "Подписка на событие", "Подписки на события", "event", ("События",), HANDLER_METHOD), + MetadataTypeSpec("ROLE", "Роль", "Роли", "role", ("Права", "Ограничения доступа", "Объекты доступа")), MetadataTypeSpec("EXTENSION", "Расширение конфигурации", "Расширения конфигурации", "extension", ("Объекты расширения", "Заимствованные объекты", "Добавленные реквизиты", "Формы", "Команды", "Проверки совместимости")), MetadataTypeSpec("SCHEDULED_JOB", "Регламентное задание", "Регламентные задания", "scheduled-job", ("Расписание", "Параметры"), ("Метод",)), + MetadataTypeSpec("SEQUENCE", "Последовательность", "Последовательности", "sequence", ("Измерения", "Документы", "Границы")), + MetadataTypeSpec("DOCUMENT_NUMERATOR", "Нумератор документов", "Нумераторы документов", "numbering", ("Документы", "Периодичность", "Длина номера")), MetadataTypeSpec("SESSION_PARAMETER", "Параметр сеанса", "Параметры сеанса", "parameter"), MetadataTypeSpec("COMMON_ATTRIBUTE", "Общий реквизит", "Общие реквизиты", "attribute"), MetadataTypeSpec("FILTER_CRITERION", "Критерий отбора", "Критерии отбора", "filter"), @@ -217,6 +223,7 @@ METADATA_TYPE_SPECS: tuple[MetadataTypeSpec, ...] = ( METADATA_TYPE_DESCRIPTIONS = { "COMMON": "Служебная ветка дерева конфигурации, объединяющая общие объекты метаданных.", + "SUBSYSTEM": "Подсистема группирует прикладные объекты и участвует в построении командного интерфейса.", "COMMON_MODULE": "Общий модуль содержит процедуры и функции, доступные из разных областей выполнения конфигурации.", "CONSTANT": "Константа хранит единичное значение конфигурации и может иметь формы, команды, права и модуль менеджера.", "CATALOG": "Справочник описывает прикладной список объектов с реквизитами, табличными частями, формами, командами, макетами, правами и предопределенными данными.", @@ -237,8 +244,11 @@ METADATA_TYPE_DESCRIPTIONS = { "EXTERNAL_DATA_SOURCE": "Внешний источник данных описывает подключение к внешним таблицам, кубам и функциям.", "EXCHANGE_PLAN": "План обмена описывает узлы и состав данных для распределенного обмена.", "EVENT_SUBSCRIPTION": "Подписка на событие связывает событие платформы или объекта с обработчиком.", + "ROLE": "Роль описывает набор прав доступа к объектам конфигурации и их данным.", "EXTENSION": "Расширение конфигурации содержит добавленные и заимствованные объекты, а также проверки совместимости.", "SCHEDULED_JOB": "Регламентное задание описывает метод, параметры и расписание фонового выполнения.", + "SEQUENCE": "Последовательность управляет сквозной последовательностью проведения документов и границами восстановления.", + "DOCUMENT_NUMERATOR": "Нумератор документов задает общие правила нумерации для одного или нескольких видов документов.", "SESSION_PARAMETER": "Параметр сеанса задает значение, доступное в течение пользовательского сеанса.", "COMMON_ATTRIBUTE": "Общий реквизит добавляет реквизит сразу к выбранному набору объектов конфигурации.", "FILTER_CRITERION": "Критерий отбора задает состав реквизитов для универсального отбора ссылочных данных.", @@ -282,6 +292,7 @@ METADATA_TYPE_DOCUMENTATION_URLS.update( METADATA_TYPE_PROPERTIES: dict[str, tuple[str, ...]] = { "COMMON": ("Состав общих объектов",), + "SUBSYSTEM": STANDARD_PROPERTIES + ("Состав", "Включать в командный интерфейс", "Картинка", "Родитель"), "COMMON_MODULE": STANDARD_PROPERTIES + ("Клиент", "Сервер", "Внешнее соединение", "Глобальный", "Вызов сервера", "Повторное использование возвращаемых значений"), "CONSTANT": STANDARD_PROPERTIES + ("Тип значения", "Основная форма", "Форма выбора"), "CATALOG": REFERENCE_OBJECT_PROPERTIES, @@ -302,8 +313,11 @@ METADATA_TYPE_PROPERTIES: dict[str, tuple[str, ...]] = { "EXTERNAL_DATA_SOURCE": STANDARD_PROPERTIES + ("Соединение", "Таблицы", "Кубы", "Функции"), "EXCHANGE_PLAN": DATA_OBJECT_PROPERTIES + ("Состав обмена", "Распределенная ИБ", "Авторегистрация изменений"), "EVENT_SUBSCRIPTION": STANDARD_PROPERTIES + ("Источник", "Событие", "Обработчик", "Перед/после события"), + "ROLE": STANDARD_PROPERTIES + ("Права", "RLS", "Ограничения доступа"), "EXTENSION": ("Имя", "Назначение", "Версия", "Режим совместимости", "Заимствованные объекты", "Проверки совместимости"), "SCHEDULED_JOB": STANDARD_PROPERTIES + ("Метод", "Расписание", "Использование", "Параметры", "Предопределенное"), + "SEQUENCE": STANDARD_PROPERTIES + ("Документы", "Измерения", "Периодичность", "Заполнение", "Граница"), + "DOCUMENT_NUMERATOR": STANDARD_PROPERTIES + ("Длина номера", "Тип номера", "Периодичность", "Документы"), "SESSION_PARAMETER": STANDARD_PROPERTIES + ("Тип значения",), "COMMON_ATTRIBUTE": STANDARD_PROPERTIES + ("Тип значения", "Состав", "Разделение данных", "Автоиспользование"), "FILTER_CRITERION": STANDARD_PROPERTIES + ("Тип значения", "Состав реквизитов"), diff --git a/packages/one-c-normalizer/tests/test_normalizer.py b/packages/one-c-normalizer/tests/test_normalizer.py index 45fba65..a596863 100644 --- a/packages/one-c-normalizer/tests/test_normalizer.py +++ b/packages/one-c-normalizer/tests/test_normalizer.py @@ -219,6 +219,43 @@ def test_normalize_edt_project_preserves_source_path_and_common_object_descripti assert common_forms[0].metadata["comment"] == "Используется в подборе товаров" +def test_normalize_edt_project_knows_full_common_metadata_catalog(tmp_path: Path): + for file_name, class_name, object_name in [ + ("Продажи.mdo", "Subsystem", "Продажи"), + ("Менеджер.mdo", "Role", "Менеджер"), + ("ПроведениеДокументов.mdo", "Sequence", "ПроведениеДокументов"), + ("ОбщийНумератор.mdo", "DocumentNumerator", "ОбщийНумератор"), + ("ДоступностьСкидок.mdo", "FunctionalOption", "ДоступностьСкидок"), + ("ФормаПодбора.mdo", "CommonForm", "ФормаПодбора"), + ("ПубличныйAPI.mdo", "HTTPService", "ПубличныйAPI"), + ]: + (tmp_path / file_name).write_text( + f""" + + {object_name} + +""", + encoding="utf-8", + ) + + normalized = normalize_one_c_project(tmp_path, project_id="edt-full-common") + objects = { + item.qualified_name + for group in normalized.configuration.groups + for item in group.objects + } + + assert { + "Подсистема.Продажи", + "Роль.Менеджер", + "Последовательность.ПроведениеДокументов", + "НумераторДокументов.ОбщийНумератор", + "ФункциональнаяОпция.ДоступностьСкидок", + "ОбщаяФорма.ФормаПодбора", + "HTTPСервис.ПубличныйAPI", + }.issubset(objects) + + def test_normalize_edt_project_preserves_localized_descriptions(tmp_path: Path): catalog = tmp_path / "Контрагенты.mdo" catalog.write_text( diff --git a/packages/semantic-kernel/src/semantic_kernel/__init__.py b/packages/semantic-kernel/src/semantic_kernel/__init__.py index 798f27b..c6caf56 100644 --- a/packages/semantic-kernel/src/semantic_kernel/__init__.py +++ b/packages/semantic-kernel/src/semantic_kernel/__init__.py @@ -78,6 +78,37 @@ _METADATA_OWNER_KINDS = { NodeKind.SCHEDULED_JOB, NodeKind.BUSINESS_PROCESS, NodeKind.TASK, + NodeKind.SUBSYSTEM, + NodeKind.SEQUENCE, + NodeKind.DOCUMENT_NUMERATOR, + NodeKind.EVENT_SUBSCRIPTION, + NodeKind.SESSION_PARAMETER, + NodeKind.COMMON_ATTRIBUTE, + NodeKind.FILTER_CRITERION, + NodeKind.FUNCTIONAL_OPTION, + NodeKind.FUNCTIONAL_OPTION_PARAMETER, + NodeKind.DEFINED_TYPE, + NodeKind.SETTINGS_STORAGE, + NodeKind.COMMON_COMMAND, + NodeKind.COMMAND_GROUP, + NodeKind.COMMON_FORM, + NodeKind.COMMON_LAYOUT, + NodeKind.COMMON_PICTURE, + NodeKind.WEB_SERVICE, + NodeKind.HTTP_SERVICE, + NodeKind.WS_REFERENCE, + NodeKind.WEBSOCKET_CLIENT, + NodeKind.INTEGRATION_SERVICE, + NodeKind.BOT, + NodeKind.INTERFACE, + NodeKind.FULL_TEXT_SEARCH_DICTIONARY, + NodeKind.PALETTE_COLOR, + NodeKind.STYLE_ITEM, + NodeKind.STYLE, + NodeKind.LANGUAGE, + NodeKind.XDTO_PACKAGE, + NodeKind.EXTENSION, + NodeKind.ROLE, } _PATH_METADATA_ALIASES = { "catalogs": ("Справочник", NodeKind.CATALOG), @@ -120,6 +151,69 @@ _PATH_METADATA_ALIASES = { "бизнеспроцессы": ("БизнесПроцесс", NodeKind.BUSINESS_PROCESS), "tasks": ("Задача", NodeKind.TASK), "задачи": ("Задача", NodeKind.TASK), + "subsystems": ("Подсистема", NodeKind.SUBSYSTEM), + "подсистемы": ("Подсистема", NodeKind.SUBSYSTEM), + "roles": ("Роль", NodeKind.ROLE), + "роли": ("Роль", NodeKind.ROLE), + "sequences": ("Последовательность", NodeKind.SEQUENCE), + "последовательности": ("Последовательность", NodeKind.SEQUENCE), + "documentnumerators": ("НумераторДокументов", NodeKind.DOCUMENT_NUMERATOR), + "нумераторыдокументов": ("НумераторДокументов", NodeKind.DOCUMENT_NUMERATOR), + "eventsubscriptions": ("ПодпискаНаСобытие", NodeKind.EVENT_SUBSCRIPTION), + "подпискинасобытия": ("ПодпискаНаСобытие", NodeKind.EVENT_SUBSCRIPTION), + "sessionparameters": ("ПараметрСеанса", NodeKind.SESSION_PARAMETER), + "параметрысеанса": ("ПараметрСеанса", NodeKind.SESSION_PARAMETER), + "commonattributes": ("ОбщийРеквизит", NodeKind.COMMON_ATTRIBUTE), + "общиереквизиты": ("ОбщийРеквизит", NodeKind.COMMON_ATTRIBUTE), + "filtercriteria": ("КритерийОтбора", NodeKind.FILTER_CRITERION), + "критерииотбора": ("КритерийОтбора", NodeKind.FILTER_CRITERION), + "functionaloptions": ("ФункциональнаяОпция", NodeKind.FUNCTIONAL_OPTION), + "функциональныеопции": ("ФункциональнаяОпция", NodeKind.FUNCTIONAL_OPTION), + "functionaloptionsparameters": ("ПараметрФункциональнойОпции", NodeKind.FUNCTIONAL_OPTION_PARAMETER), + "параметрыфункциональныхопций": ("ПараметрФункциональнойОпции", NodeKind.FUNCTIONAL_OPTION_PARAMETER), + "definedtypes": ("ОпределяемыйТип", NodeKind.DEFINED_TYPE), + "определяемыетипы": ("ОпределяемыйТип", NodeKind.DEFINED_TYPE), + "settingsstorages": ("ХранилищеНастроек", NodeKind.SETTINGS_STORAGE), + "хранилищанастроек": ("ХранилищеНастроек", NodeKind.SETTINGS_STORAGE), + "commoncommands": ("ОбщаяКоманда", NodeKind.COMMON_COMMAND), + "общиекоманды": ("ОбщаяКоманда", NodeKind.COMMON_COMMAND), + "commandgroups": ("ГруппаКоманд", NodeKind.COMMAND_GROUP), + "группыкоманд": ("ГруппаКоманд", NodeKind.COMMAND_GROUP), + "commonforms": ("ОбщаяФорма", NodeKind.COMMON_FORM), + "общиеформы": ("ОбщаяФорма", NodeKind.COMMON_FORM), + "commontemplates": ("ОбщийМакет", NodeKind.COMMON_LAYOUT), + "commonlayouts": ("ОбщийМакет", NodeKind.COMMON_LAYOUT), + "общиемакеты": ("ОбщийМакет", NodeKind.COMMON_LAYOUT), + "commonpictures": ("ОбщаяКартинка", NodeKind.COMMON_PICTURE), + "общиекартинки": ("ОбщаяКартинка", NodeKind.COMMON_PICTURE), + "xdtopackages": ("XDTO", NodeKind.XDTO_PACKAGE), + "xdtoпакеты": ("XDTO", NodeKind.XDTO_PACKAGE), + "webservices": ("WebСервис", NodeKind.WEB_SERVICE), + "webсервисы": ("WebСервис", NodeKind.WEB_SERVICE), + "httpservices": ("HTTPСервис", NodeKind.HTTP_SERVICE), + "httpсервисы": ("HTTPСервис", NodeKind.HTTP_SERVICE), + "wsreferences": ("WSСсылка", NodeKind.WS_REFERENCE), + "wsссылки": ("WSСсылка", NodeKind.WS_REFERENCE), + "websocketclients": ("WebSocketКлиент", NodeKind.WEBSOCKET_CLIENT), + "websocketклиенты": ("WebSocketКлиент", NodeKind.WEBSOCKET_CLIENT), + "integrationservices": ("СервисИнтеграции", NodeKind.INTEGRATION_SERVICE), + "сервисыинтеграции": ("СервисИнтеграции", NodeKind.INTEGRATION_SERVICE), + "bots": ("Бот", NodeKind.BOT), + "боты": ("Бот", NodeKind.BOT), + "interfaces": ("Интерфейс", NodeKind.INTERFACE), + "интерфейсы": ("Интерфейс", NodeKind.INTERFACE), + "fulltextsearchdictionaries": ("СловарьПолнотекстовогоПоиска", NodeKind.FULL_TEXT_SEARCH_DICTIONARY), + "словариполнотекстовогопоиска": ("СловарьПолнотекстовогоПоиска", NodeKind.FULL_TEXT_SEARCH_DICTIONARY), + "palettecolors": ("ЦветПалитры", NodeKind.PALETTE_COLOR), + "цветапалитры": ("ЦветПалитры", NodeKind.PALETTE_COLOR), + "styleitems": ("ЭлементСтиля", NodeKind.STYLE_ITEM), + "элементыстиля": ("ЭлементСтиля", NodeKind.STYLE_ITEM), + "styles": ("Стиль", NodeKind.STYLE), + "стили": ("Стиль", NodeKind.STYLE), + "languages": ("Язык", NodeKind.LANGUAGE), + "языки": ("Язык", NodeKind.LANGUAGE), + "extensions": ("Расширение", NodeKind.EXTENSION), + "расширения": ("Расширение", NodeKind.EXTENSION), } @@ -348,6 +442,36 @@ def index_project(path: str | Path, *, project_id: str | None = None, structure_ NodeKind.SCHEDULED_JOB, NodeKind.BUSINESS_PROCESS, NodeKind.TASK, + NodeKind.SUBSYSTEM, + NodeKind.SEQUENCE, + NodeKind.DOCUMENT_NUMERATOR, + NodeKind.EVENT_SUBSCRIPTION, + NodeKind.SESSION_PARAMETER, + NodeKind.COMMON_ATTRIBUTE, + NodeKind.FILTER_CRITERION, + NodeKind.FUNCTIONAL_OPTION, + NodeKind.FUNCTIONAL_OPTION_PARAMETER, + NodeKind.DEFINED_TYPE, + NodeKind.SETTINGS_STORAGE, + NodeKind.COMMON_COMMAND, + NodeKind.COMMAND_GROUP, + NodeKind.COMMON_FORM, + NodeKind.COMMON_LAYOUT, + NodeKind.COMMON_PICTURE, + NodeKind.WEB_SERVICE, + NodeKind.HTTP_SERVICE, + NodeKind.WS_REFERENCE, + NodeKind.WEBSOCKET_CLIENT, + NodeKind.INTEGRATION_SERVICE, + NodeKind.BOT, + NodeKind.INTERFACE, + NodeKind.FULL_TEXT_SEARCH_DICTIONARY, + NodeKind.PALETTE_COLOR, + NodeKind.STYLE_ITEM, + NodeKind.STYLE, + NodeKind.LANGUAGE, + NodeKind.XDTO_PACKAGE, + NodeKind.EXTENSION, NodeKind.ROLE, NodeKind.FORM, NodeKind.TABULAR_SECTION, @@ -958,7 +1082,33 @@ def _xml_node_kind(object_kind: str) -> NodeKind | None: "BUSINESS_PROCESS": NodeKind.BUSINESS_PROCESS, "TASK": NodeKind.TASK, "SUBSYSTEM": NodeKind.SUBSYSTEM, + "SEQUENCE": NodeKind.SEQUENCE, + "DOCUMENT_NUMERATOR": NodeKind.DOCUMENT_NUMERATOR, + "EVENT_SUBSCRIPTION": NodeKind.EVENT_SUBSCRIPTION, + "SESSION_PARAMETER": NodeKind.SESSION_PARAMETER, + "COMMON_ATTRIBUTE": NodeKind.COMMON_ATTRIBUTE, + "FILTER_CRITERION": NodeKind.FILTER_CRITERION, + "FUNCTIONAL_OPTION": NodeKind.FUNCTIONAL_OPTION, + "FUNCTIONAL_OPTION_PARAMETER": NodeKind.FUNCTIONAL_OPTION_PARAMETER, + "DEFINED_TYPE": NodeKind.DEFINED_TYPE, + "SETTINGS_STORAGE": NodeKind.SETTINGS_STORAGE, + "COMMON_COMMAND": NodeKind.COMMON_COMMAND, + "COMMAND_GROUP": NodeKind.COMMAND_GROUP, + "COMMON_FORM": NodeKind.COMMON_FORM, + "COMMON_LAYOUT": NodeKind.COMMON_LAYOUT, + "COMMON_PICTURE": NodeKind.COMMON_PICTURE, + "WEB_SERVICE": NodeKind.WEB_SERVICE, "HTTP_SERVICE": NodeKind.HTTP_SERVICE, + "WS_REFERENCE": NodeKind.WS_REFERENCE, + "WEBSOCKET_CLIENT": NodeKind.WEBSOCKET_CLIENT, + "INTEGRATION_SERVICE": NodeKind.INTEGRATION_SERVICE, + "BOT": NodeKind.BOT, + "INTERFACE": NodeKind.INTERFACE, + "FULL_TEXT_SEARCH_DICTIONARY": NodeKind.FULL_TEXT_SEARCH_DICTIONARY, + "PALETTE_COLOR": NodeKind.PALETTE_COLOR, + "STYLE_ITEM": NodeKind.STYLE_ITEM, + "STYLE": NodeKind.STYLE, + "LANGUAGE": NodeKind.LANGUAGE, "XDTO_PACKAGE": NodeKind.XDTO_PACKAGE, "EXTENSION": NodeKind.EXTENSION, "LAYOUT": NodeKind.LAYOUT, diff --git a/packages/semantic-kernel/tests/test_xml_indexing.py b/packages/semantic-kernel/tests/test_xml_indexing.py index 5b2f458..b566d75 100644 --- a/packages/semantic-kernel/tests/test_xml_indexing.py +++ b/packages/semantic-kernel/tests/test_xml_indexing.py @@ -70,6 +70,43 @@ def test_index_project_extracts_1c_metadata_objects(tmp_path: Path): assert any(edge.kind == EdgeKind.HAS_COMMAND for edge in snapshot.edges) +def test_index_project_keeps_extended_1c_metadata_objects(tmp_path: Path): + xml = tmp_path / "metadata.xml" + xml.write_text( + """ + + + + + + + + + + + + +""", + encoding="utf-8", + ) + + snapshot = index_project(tmp_path, project_id="extended-metadata") + by_kind = {node.kind for node in snapshot.nodes} + + assert { + NodeKind.SUBSYSTEM, + NodeKind.ROLE, + NodeKind.SEQUENCE, + NodeKind.DOCUMENT_NUMERATOR, + NodeKind.COMMON_FORM, + NodeKind.FUNCTIONAL_OPTION, + NodeKind.WEB_SERVICE, + NodeKind.WS_REFERENCE, + NodeKind.WEBSOCKET_CLIENT, + NodeKind.INTEGRATION_SERVICE, + }.issubset(by_kind) + + def test_index_project_remaps_edges_from_duplicate_metadata_nodes(tmp_path: Path): first = tmp_path / "first.xml" first.write_text( diff --git a/packages/sir/src/sir/enums.py b/packages/sir/src/sir/enums.py index f914bb2..635835f 100644 --- a/packages/sir/src/sir/enums.py +++ b/packages/sir/src/sir/enums.py @@ -26,6 +26,32 @@ class NodeKind(str, Enum): BUSINESS_PROCESS = "BUSINESS_PROCESS" TASK = "TASK" SUBSYSTEM = "SUBSYSTEM" + SEQUENCE = "SEQUENCE" + DOCUMENT_NUMERATOR = "DOCUMENT_NUMERATOR" + EVENT_SUBSCRIPTION = "EVENT_SUBSCRIPTION" + SESSION_PARAMETER = "SESSION_PARAMETER" + COMMON_ATTRIBUTE = "COMMON_ATTRIBUTE" + FILTER_CRITERION = "FILTER_CRITERION" + FUNCTIONAL_OPTION = "FUNCTIONAL_OPTION" + FUNCTIONAL_OPTION_PARAMETER = "FUNCTIONAL_OPTION_PARAMETER" + DEFINED_TYPE = "DEFINED_TYPE" + SETTINGS_STORAGE = "SETTINGS_STORAGE" + COMMON_COMMAND = "COMMON_COMMAND" + COMMAND_GROUP = "COMMAND_GROUP" + COMMON_FORM = "COMMON_FORM" + COMMON_LAYOUT = "COMMON_LAYOUT" + COMMON_PICTURE = "COMMON_PICTURE" + WEB_SERVICE = "WEB_SERVICE" + WS_REFERENCE = "WS_REFERENCE" + WEBSOCKET_CLIENT = "WEBSOCKET_CLIENT" + INTEGRATION_SERVICE = "INTEGRATION_SERVICE" + BOT = "BOT" + INTERFACE = "INTERFACE" + FULL_TEXT_SEARCH_DICTIONARY = "FULL_TEXT_SEARCH_DICTIONARY" + PALETTE_COLOR = "PALETTE_COLOR" + STYLE_ITEM = "STYLE_ITEM" + STYLE = "STYLE" + LANGUAGE = "LANGUAGE" HTTP_SERVICE = "HTTP_SERVICE" XDTO_PACKAGE = "XDTO_PACKAGE" EXTENSION = "EXTENSION" diff --git a/services/api-server/src/api_server/main.py b/services/api-server/src/api_server/main.py index fda14d0..1f1eb25 100644 --- a/services/api-server/src/api_server/main.py +++ b/services/api-server/src/api_server/main.py @@ -287,6 +287,37 @@ _ACCESS_TARGET_KINDS = { NodeKind.SCHEDULED_JOB, NodeKind.BUSINESS_PROCESS, NodeKind.TASK, + NodeKind.SUBSYSTEM, + NodeKind.SEQUENCE, + NodeKind.DOCUMENT_NUMERATOR, + NodeKind.EVENT_SUBSCRIPTION, + NodeKind.SESSION_PARAMETER, + NodeKind.COMMON_ATTRIBUTE, + NodeKind.FILTER_CRITERION, + NodeKind.FUNCTIONAL_OPTION, + NodeKind.FUNCTIONAL_OPTION_PARAMETER, + NodeKind.DEFINED_TYPE, + NodeKind.SETTINGS_STORAGE, + NodeKind.COMMON_COMMAND, + NodeKind.COMMAND_GROUP, + NodeKind.COMMON_FORM, + NodeKind.COMMON_LAYOUT, + NodeKind.COMMON_PICTURE, + NodeKind.WEB_SERVICE, + NodeKind.HTTP_SERVICE, + NodeKind.WS_REFERENCE, + NodeKind.WEBSOCKET_CLIENT, + NodeKind.INTEGRATION_SERVICE, + NodeKind.BOT, + NodeKind.INTERFACE, + NodeKind.FULL_TEXT_SEARCH_DICTIONARY, + NodeKind.PALETTE_COLOR, + NodeKind.STYLE_ITEM, + NodeKind.STYLE, + NodeKind.LANGUAGE, + NodeKind.XDTO_PACKAGE, + NodeKind.EXTENSION, + NodeKind.ROLE, } if _EVENT_SUBSCRIPTION_KIND is not None: _ACCESS_TARGET_KINDS.add(_EVENT_SUBSCRIPTION_KIND) @@ -299,6 +330,18 @@ _OWNERSHIP_TARGET_KINDS = { NodeKind.SCHEDULED_JOB, NodeKind.BUSINESS_PROCESS, NodeKind.TASK, + NodeKind.SUBSYSTEM, + NodeKind.SEQUENCE, + NodeKind.DOCUMENT_NUMERATOR, + NodeKind.COMMON_FORM, + NodeKind.COMMON_COMMAND, + NodeKind.HTTP_SERVICE, + NodeKind.WEB_SERVICE, + NodeKind.WS_REFERENCE, + NodeKind.WEBSOCKET_CLIENT, + NodeKind.INTEGRATION_SERVICE, + NodeKind.BOT, + NodeKind.ROLE, } if _EVENT_SUBSCRIPTION_KIND is not None: _OWNERSHIP_TARGET_KINDS.add(_EVENT_SUBSCRIPTION_KIND) @@ -3905,6 +3948,43 @@ _FLOWCHART_KIND_LABELS = { NodeKind.REGISTER: "Регистры", NodeKind.REPORT: "Отчеты", NodeKind.DATA_PROCESSOR: "Обработки", + NodeKind.CONSTANT: "Константы", + NodeKind.DOCUMENT_JOURNAL: "Журналы документов", + NodeKind.ENUM: "Перечисления", + NodeKind.CHART_OF_CHARACTERISTIC_TYPES: "Планы видов характеристик", + NodeKind.CHART_OF_ACCOUNTS: "Планы счетов", + NodeKind.CHART_OF_CALCULATION_TYPES: "Планы видов расчета", + NodeKind.EXCHANGE_PLAN: "Планы обмена", + NodeKind.EXTERNAL_DATA_SOURCE: "Внешние источники данных", + NodeKind.BUSINESS_PROCESS: "Бизнес-процессы", + NodeKind.TASK: "Задачи", + NodeKind.SUBSYSTEM: "Подсистемы", + NodeKind.SEQUENCE: "Последовательности", + NodeKind.DOCUMENT_NUMERATOR: "Нумераторы документов", + NodeKind.EVENT_SUBSCRIPTION: "Подписки на события", + NodeKind.SESSION_PARAMETER: "Параметры сеанса", + NodeKind.COMMON_ATTRIBUTE: "Общие реквизиты", + NodeKind.FILTER_CRITERION: "Критерии отбора", + NodeKind.FUNCTIONAL_OPTION: "Функциональные опции", + NodeKind.FUNCTIONAL_OPTION_PARAMETER: "Параметры функциональных опций", + NodeKind.DEFINED_TYPE: "Определяемые типы", + NodeKind.SETTINGS_STORAGE: "Хранилища настроек", + NodeKind.COMMON_COMMAND: "Общие команды", + NodeKind.COMMAND_GROUP: "Группы команд", + NodeKind.COMMON_FORM: "Общие формы", + NodeKind.COMMON_LAYOUT: "Общие макеты", + NodeKind.COMMON_PICTURE: "Общие картинки", + NodeKind.WEB_SERVICE: "Web-сервисы", + NodeKind.WS_REFERENCE: "WS-ссылки", + NodeKind.WEBSOCKET_CLIENT: "WebSocket-клиенты", + NodeKind.INTEGRATION_SERVICE: "Сервисы интеграции", + NodeKind.BOT: "Боты", + NodeKind.INTERFACE: "Интерфейсы", + NodeKind.FULL_TEXT_SEARCH_DICTIONARY: "Словари полнотекстового поиска", + NodeKind.PALETTE_COLOR: "Цвета палитры", + NodeKind.STYLE_ITEM: "Элементы стиля", + NodeKind.STYLE: "Стили", + NodeKind.LANGUAGE: "Языки", NodeKind.HTTP_SERVICE: "HTTP-сервисы", NodeKind.INTEGRATION_ENDPOINT: "Интеграции", NodeKind.SCHEDULED_JOB: "Регламентные задания", diff --git a/services/api-server/src/api_server/metadata_tree_builder.py b/services/api-server/src/api_server/metadata_tree_builder.py index ca4140e..8bd4444 100644 --- a/services/api-server/src/api_server/metadata_tree_builder.py +++ b/services/api-server/src/api_server/metadata_tree_builder.py @@ -19,6 +19,10 @@ _EVENT_SUBSCRIPTION_KIND = getattr(NodeKind, "EVENT_SUBSCRIPTION", None) _METADATA_ICON_BY_NODE_KIND = { NodeKind.EXCHANGE_PLAN: "exchange-plan", NodeKind.SCHEDULED_JOB: "scheduled-job", + NodeKind.SUBSYSTEM: "subsystem", + NodeKind.SEQUENCE: "sequence", + NodeKind.DOCUMENT_NUMERATOR: "numbering", + NodeKind.EVENT_SUBSCRIPTION: "event", NodeKind.ATTRIBUTE: "attribute", NodeKind.COMMAND: "command", NodeKind.FORM: "form", @@ -52,6 +56,36 @@ _METADATA_SPEC_PREFIXES = { "EXCHANGE_PLAN": "ПланОбмена.", "EVENT_SUBSCRIPTION": "ПодпискаНаСобытие.", "SCHEDULED_JOB": "РегламентноеЗадание.", + "SUBSYSTEM": "Подсистема.", + "ROLE": "Роль.", + "SEQUENCE": "Последовательность.", + "DOCUMENT_NUMERATOR": "НумераторДокументов.", + "EXTENSION": "Расширение.", + "SESSION_PARAMETER": "ПараметрСеанса.", + "COMMON_ATTRIBUTE": "ОбщийРеквизит.", + "FILTER_CRITERION": "КритерийОтбора.", + "FUNCTIONAL_OPTION": "ФункциональнаяОпция.", + "FUNCTIONAL_OPTION_PARAMETER": "ПараметрФункциональнойОпции.", + "DEFINED_TYPE": "ОпределяемыйТип.", + "SETTINGS_STORAGE": "ХранилищеНастроек.", + "COMMON_COMMAND": "ОбщаяКоманда.", + "COMMAND_GROUP": "ГруппаКоманд.", + "COMMON_FORM": "ОбщаяФорма.", + "COMMON_LAYOUT": "ОбщийМакет.", + "COMMON_PICTURE": "ОбщаяКартинка.", + "XDTO_PACKAGE": "XDTO.", + "WEB_SERVICE": "WebСервис.", + "HTTP_SERVICE": "HTTPСервис.", + "WS_REFERENCE": "WSСсылка.", + "WEBSOCKET_CLIENT": "WebSocketКлиент.", + "INTEGRATION_SERVICE": "СервисИнтеграции.", + "BOT": "Бот.", + "INTERFACE": "Интерфейс.", + "FULL_TEXT_SEARCH_DICTIONARY": "СловарьПолнотекстовогоПоиска.", + "PALETTE_COLOR": "ЦветПалитры.", + "STYLE_ITEM": "ЭлементСтиля.", + "STYLE": "Стиль.", + "LANGUAGE": "Язык.", } @@ -67,6 +101,36 @@ _METADATA_SPEC_NODE_KINDS = { "TASK": {NodeKind.TASK}, "EXCHANGE_PLAN": {NodeKind.EXCHANGE_PLAN}, "SCHEDULED_JOB": {NodeKind.SCHEDULED_JOB}, + "SUBSYSTEM": {NodeKind.SUBSYSTEM}, + "ROLE": {NodeKind.ROLE}, + "SEQUENCE": {NodeKind.SEQUENCE}, + "DOCUMENT_NUMERATOR": {NodeKind.DOCUMENT_NUMERATOR}, + "EXTENSION": {NodeKind.EXTENSION}, + "SESSION_PARAMETER": {NodeKind.SESSION_PARAMETER}, + "COMMON_ATTRIBUTE": {NodeKind.COMMON_ATTRIBUTE}, + "FILTER_CRITERION": {NodeKind.FILTER_CRITERION}, + "FUNCTIONAL_OPTION": {NodeKind.FUNCTIONAL_OPTION}, + "FUNCTIONAL_OPTION_PARAMETER": {NodeKind.FUNCTIONAL_OPTION_PARAMETER}, + "DEFINED_TYPE": {NodeKind.DEFINED_TYPE}, + "SETTINGS_STORAGE": {NodeKind.SETTINGS_STORAGE}, + "COMMON_COMMAND": {NodeKind.COMMON_COMMAND}, + "COMMAND_GROUP": {NodeKind.COMMAND_GROUP}, + "COMMON_FORM": {NodeKind.COMMON_FORM}, + "COMMON_LAYOUT": {NodeKind.COMMON_LAYOUT}, + "COMMON_PICTURE": {NodeKind.COMMON_PICTURE}, + "XDTO_PACKAGE": {NodeKind.XDTO_PACKAGE}, + "WEB_SERVICE": {NodeKind.WEB_SERVICE}, + "HTTP_SERVICE": {NodeKind.HTTP_SERVICE}, + "WS_REFERENCE": {NodeKind.WS_REFERENCE}, + "WEBSOCKET_CLIENT": {NodeKind.WEBSOCKET_CLIENT}, + "INTEGRATION_SERVICE": {NodeKind.INTEGRATION_SERVICE}, + "BOT": {NodeKind.BOT}, + "INTERFACE": {NodeKind.INTERFACE}, + "FULL_TEXT_SEARCH_DICTIONARY": {NodeKind.FULL_TEXT_SEARCH_DICTIONARY}, + "PALETTE_COLOR": {NodeKind.PALETTE_COLOR}, + "STYLE_ITEM": {NodeKind.STYLE_ITEM}, + "STYLE": {NodeKind.STYLE}, + "LANGUAGE": {NodeKind.LANGUAGE}, } if _EVENT_SUBSCRIPTION_KIND is not None: _METADATA_SPEC_NODE_KINDS["EVENT_SUBSCRIPTION"] = {_EVENT_SUBSCRIPTION_KIND} diff --git a/services/api-server/tests/test_api.py b/services/api-server/tests/test_api.py index 5f33942..8a8719d 100644 --- a/services/api-server/tests/test_api.py +++ b/services/api-server/tests/test_api.py @@ -1471,6 +1471,8 @@ def test_import_supports_structure_only_indexing(tmp_path: Path): + + @@ -1491,7 +1493,7 @@ def test_import_supports_structure_only_indexing(tmp_path: Path): assert payload["status"] == "structure_indexed" assert payload["snapshot"]["project_id"] == project_id assert payload["object_count"] >= 2 - assert payload["normalized_summary"]["group_count"] >= 3 + assert payload["normalized_summary"]["group_count"] >= 5 assert payload["normalized_summary"]["rights_count"] == 1 setup = client.get(f"/projects/{project_id}/setup") @@ -1513,7 +1515,7 @@ def test_import_supports_structure_only_indexing(tmp_path: Path): normalized = client.get(f"/projects/{project_id}/normalized") assert normalized.status_code == 200 groups = {group["name"] for group in normalized.json()["configuration"]["groups"]} - assert {"HTTP-сервисы", "Подсистемы", "Роли"}.issubset(groups) + assert {"HTTP-сервисы", "Подсистемы", "Роли", "Последовательности", "Нумераторы документов"}.issubset(groups) detail = client.get( f"/projects/{project_id}/normalized/object", @@ -1535,7 +1537,8 @@ def test_import_supports_structure_only_indexing(tmp_path: Path): ] main_configuration = root["children"][0] common = next(item for item in main_configuration["children"] if item["label"] == "Общие") - assert any(item["label"] == "HTTP-сервисы" for item in common["children"]) + common_labels = {item["label"] for item in common["children"]} + assert {"HTTP-сервисы", "Подсистемы", "Последовательности", "Нумераторы документов"}.issubset(common_labels) def test_import_full_replace_replaces_current_normalized_project(tmp_path: Path):