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):