Cover full 1C metadata object catalog
CI / python (push) Has been cancelled
CI / rust (push) Has been cancelled

This commit is contained in:
2026-05-21 18:05:28 +03:00
parent 9dc35bae20
commit 3c7b1825c4
9 changed files with 448 additions and 3 deletions
@@ -506,6 +506,13 @@ _OBJECT_KIND_BY_TAG = {
"subsystem": "SUBSYSTEM", "subsystem": "SUBSYSTEM",
"subsystems": "SUBSYSTEM", "subsystems": "SUBSYSTEM",
"подсистема": "SUBSYSTEM", "подсистема": "SUBSYSTEM",
"sequence": "SEQUENCE",
"sequences": "SEQUENCE",
"последовательность": "SEQUENCE",
"documentnumerator": "DOCUMENT_NUMERATOR",
"documentnumerators": "DOCUMENT_NUMERATOR",
"нумератордокументов": "DOCUMENT_NUMERATOR",
"нумератор": "DOCUMENT_NUMERATOR",
"httpservice": "HTTP_SERVICE", "httpservice": "HTTP_SERVICE",
"httpservices": "HTTP_SERVICE", "httpservices": "HTTP_SERVICE",
"httpсервис": "HTTP_SERVICE", "httpсервис": "HTTP_SERVICE",
@@ -722,6 +729,15 @@ _FORM_ELEMENT_TAGS = {
_QUALIFIED_PREFIX_BY_KIND = { _QUALIFIED_PREFIX_BY_KIND = {
"CATALOG": "Справочник", "CATALOG": "Справочник",
"DOCUMENT": "Документ", "DOCUMENT": "Документ",
"CONSTANT": "Константа",
"DOCUMENT_JOURNAL": "ЖурналДокументов",
"ENUM": "Перечисление",
"REPORT": "Отчет",
"DATA_PROCESSOR": "Обработка",
"CHART_OF_CHARACTERISTIC_TYPES": "ПланВидовХарактеристик",
"CHART_OF_ACCOUNTS": "ПланСчетов",
"CHART_OF_CALCULATION_TYPES": "ПланВидовРасчета",
"EXTERNAL_DATA_SOURCE": "ВнешнийИсточникДанных",
"REGISTER": "Регистр", "REGISTER": "Регистр",
"INFORMATION_REGISTER": "РегистрСведений", "INFORMATION_REGISTER": "РегистрСведений",
"ACCUMULATION_REGISTER": "РегистрНакопления", "ACCUMULATION_REGISTER": "РегистрНакопления",
@@ -734,6 +750,8 @@ _QUALIFIED_PREFIX_BY_KIND = {
"BUSINESS_PROCESS": "БизнесПроцесс", "BUSINESS_PROCESS": "БизнесПроцесс",
"TASK": "Задача", "TASK": "Задача",
"SUBSYSTEM": "Подсистема", "SUBSYSTEM": "Подсистема",
"SEQUENCE": "Последовательность",
"DOCUMENT_NUMERATOR": "НумераторДокументов",
"HTTP_SERVICE": "HTTPСервис", "HTTP_SERVICE": "HTTPСервис",
"WEB_SERVICE": "WebСервис", "WEB_SERVICE": "WebСервис",
"WS_REFERENCE": "WSСсылка", "WS_REFERENCE": "WSСсылка",
@@ -803,6 +821,8 @@ _QUALIFIED_PREFIX_BY_TAG = {
"bot": "Бот", "bot": "Бот",
"interface": "Интерфейс", "interface": "Интерфейс",
"fulltextsearchdictionary": "СловарьПолнотекстовогоПоиска", "fulltextsearchdictionary": "СловарьПолнотекстовогоПоиска",
"sequence": "Последовательность",
"documentnumerator": "НумераторДокументов",
} }
_ROOT_METADATA_OBJECT_KINDS = { _ROOT_METADATA_OBJECT_KINDS = {
@@ -830,6 +850,8 @@ _ROOT_METADATA_OBJECT_KINDS = {
"BUSINESS_PROCESS", "BUSINESS_PROCESS",
"TASK", "TASK",
"SUBSYSTEM", "SUBSYSTEM",
"SEQUENCE",
"DOCUMENT_NUMERATOR",
"HTTP_SERVICE", "HTTP_SERVICE",
"WEB_SERVICE", "WEB_SERVICE",
"WS_REFERENCE", "WS_REFERENCE",
@@ -851,6 +873,7 @@ _ROOT_METADATA_OBJECT_KINDS = {
"COMMON_LAYOUT", "COMMON_LAYOUT",
"COMMON_PICTURE", "COMMON_PICTURE",
"INTEGRATION_SERVICE", "INTEGRATION_SERVICE",
"EXTENSION",
"PALETTE_COLOR", "PALETTE_COLOR",
"STYLE_ITEM", "STYLE_ITEM",
"STYLE", "STYLE",
@@ -861,8 +884,11 @@ _ROOT_METADATA_OBJECT_KINDS = {
_GROUP_BY_OBJECT_KIND = { _GROUP_BY_OBJECT_KIND = {
"PROJECT": "Конфигурация", "PROJECT": "Конфигурация",
"COMMON_MODULE": "Общие модули", "COMMON_MODULE": "Общие модули",
"CONSTANT": "Константы",
"CATALOG": "Справочники", "CATALOG": "Справочники",
"DOCUMENT": "Документы", "DOCUMENT": "Документы",
"DOCUMENT_JOURNAL": "Журналы документов",
"ENUM": "Перечисления",
"REGISTER": "Регистры", "REGISTER": "Регистры",
"INFORMATION_REGISTER": "Регистры сведений", "INFORMATION_REGISTER": "Регистры сведений",
"ACCUMULATION_REGISTER": "Регистры накопления", "ACCUMULATION_REGISTER": "Регистры накопления",
@@ -870,10 +896,18 @@ _GROUP_BY_OBJECT_KIND = {
"CALCULATION_REGISTER": "Регистры расчета", "CALCULATION_REGISTER": "Регистры расчета",
"REPORT": "Отчеты", "REPORT": "Отчеты",
"DATA_PROCESSOR": "Обработки", "DATA_PROCESSOR": "Обработки",
"CHART_OF_CHARACTERISTIC_TYPES": "Планы видов характеристик",
"CHART_OF_ACCOUNTS": "Планы счетов",
"CHART_OF_CALCULATION_TYPES": "Планы видов расчета",
"BUSINESS_PROCESS": "Бизнес-процессы",
"TASK": "Задачи",
"EXTENSION": "Расширения конфигурации",
"FORM": "Формы", "FORM": "Формы",
"COMMAND": "Команды", "COMMAND": "Команды",
"ROLE": "Роли", "ROLE": "Роли",
"SUBSYSTEM": "Подсистемы", "SUBSYSTEM": "Подсистемы",
"SEQUENCE": "Последовательности",
"DOCUMENT_NUMERATOR": "Нумераторы документов",
"HTTP_SERVICE": "HTTP-сервисы", "HTTP_SERVICE": "HTTP-сервисы",
"WEB_SERVICE": "Web-сервисы", "WEB_SERVICE": "Web-сервисы",
"WS_REFERENCE": "WS-ссылки", "WS_REFERENCE": "WS-ссылки",
@@ -34,6 +34,8 @@ COMMON_BRANCH_CHILDREN = (
"Подписки на события", "Подписки на события",
"Критерии отбора", "Критерии отбора",
"Регламентные задания", "Регламентные задания",
"Последовательности",
"Нумераторы документов",
"Функциональные опции", "Функциональные опции",
"Параметры функциональных опций", "Параметры функциональных опций",
"Определяемые типы", "Определяемые типы",
@@ -145,6 +147,7 @@ REPORT_CHILDREN = (
METADATA_TYPE_SPECS: tuple[MetadataTypeSpec, ...] = ( METADATA_TYPE_SPECS: tuple[MetadataTypeSpec, ...] = (
MetadataTypeSpec("COMMON", "Общие", "Общие", "common", COMMON_BRANCH_CHILDREN), MetadataTypeSpec("COMMON", "Общие", "Общие", "common", COMMON_BRANCH_CHILDREN),
MetadataTypeSpec("SUBSYSTEM", "Подсистема", "Подсистемы", "subsystem", ("Состав", "Командный интерфейс", "Права")),
MetadataTypeSpec( MetadataTypeSpec(
"COMMON_MODULE", "COMMON_MODULE",
"Общий модуль", "Общий модуль",
@@ -186,8 +189,11 @@ METADATA_TYPE_SPECS: tuple[MetadataTypeSpec, ...] = (
MetadataTypeSpec("EXTERNAL_DATA_SOURCE", "Внешний источник данных", "Внешние источники данных", "external-source", ("Таблицы", "Кубы", "Функции", "Формы", "Команды", "Макеты")), MetadataTypeSpec("EXTERNAL_DATA_SOURCE", "Внешний источник данных", "Внешние источники данных", "external-source", ("Таблицы", "Кубы", "Функции", "Формы", "Команды", "Макеты")),
MetadataTypeSpec("EXCHANGE_PLAN", "План обмена", "Планы обмена", "exchange-plan", STRUCTURED_OBJECT_CHILDREN + ("Состав",), OBJECT_MODULES), MetadataTypeSpec("EXCHANGE_PLAN", "План обмена", "Планы обмена", "exchange-plan", STRUCTURED_OBJECT_CHILDREN + ("Состав",), OBJECT_MODULES),
MetadataTypeSpec("EVENT_SUBSCRIPTION", "Подписка на событие", "Подписки на события", "event", ("События",), HANDLER_METHOD), MetadataTypeSpec("EVENT_SUBSCRIPTION", "Подписка на событие", "Подписки на события", "event", ("События",), HANDLER_METHOD),
MetadataTypeSpec("ROLE", "Роль", "Роли", "role", ("Права", "Ограничения доступа", "Объекты доступа")),
MetadataTypeSpec("EXTENSION", "Расширение конфигурации", "Расширения конфигурации", "extension", ("Объекты расширения", "Заимствованные объекты", "Добавленные реквизиты", "Формы", "Команды", "Проверки совместимости")), MetadataTypeSpec("EXTENSION", "Расширение конфигурации", "Расширения конфигурации", "extension", ("Объекты расширения", "Заимствованные объекты", "Добавленные реквизиты", "Формы", "Команды", "Проверки совместимости")),
MetadataTypeSpec("SCHEDULED_JOB", "Регламентное задание", "Регламентные задания", "scheduled-job", ("Расписание", "Параметры"), ("Метод",)), MetadataTypeSpec("SCHEDULED_JOB", "Регламентное задание", "Регламентные задания", "scheduled-job", ("Расписание", "Параметры"), ("Метод",)),
MetadataTypeSpec("SEQUENCE", "Последовательность", "Последовательности", "sequence", ("Измерения", "Документы", "Границы")),
MetadataTypeSpec("DOCUMENT_NUMERATOR", "Нумератор документов", "Нумераторы документов", "numbering", ("Документы", "Периодичность", "Длина номера")),
MetadataTypeSpec("SESSION_PARAMETER", "Параметр сеанса", "Параметры сеанса", "parameter"), MetadataTypeSpec("SESSION_PARAMETER", "Параметр сеанса", "Параметры сеанса", "parameter"),
MetadataTypeSpec("COMMON_ATTRIBUTE", "Общий реквизит", "Общие реквизиты", "attribute"), MetadataTypeSpec("COMMON_ATTRIBUTE", "Общий реквизит", "Общие реквизиты", "attribute"),
MetadataTypeSpec("FILTER_CRITERION", "Критерий отбора", "Критерии отбора", "filter"), MetadataTypeSpec("FILTER_CRITERION", "Критерий отбора", "Критерии отбора", "filter"),
@@ -217,6 +223,7 @@ METADATA_TYPE_SPECS: tuple[MetadataTypeSpec, ...] = (
METADATA_TYPE_DESCRIPTIONS = { METADATA_TYPE_DESCRIPTIONS = {
"COMMON": "Служебная ветка дерева конфигурации, объединяющая общие объекты метаданных.", "COMMON": "Служебная ветка дерева конфигурации, объединяющая общие объекты метаданных.",
"SUBSYSTEM": "Подсистема группирует прикладные объекты и участвует в построении командного интерфейса.",
"COMMON_MODULE": "Общий модуль содержит процедуры и функции, доступные из разных областей выполнения конфигурации.", "COMMON_MODULE": "Общий модуль содержит процедуры и функции, доступные из разных областей выполнения конфигурации.",
"CONSTANT": "Константа хранит единичное значение конфигурации и может иметь формы, команды, права и модуль менеджера.", "CONSTANT": "Константа хранит единичное значение конфигурации и может иметь формы, команды, права и модуль менеджера.",
"CATALOG": "Справочник описывает прикладной список объектов с реквизитами, табличными частями, формами, командами, макетами, правами и предопределенными данными.", "CATALOG": "Справочник описывает прикладной список объектов с реквизитами, табличными частями, формами, командами, макетами, правами и предопределенными данными.",
@@ -237,8 +244,11 @@ METADATA_TYPE_DESCRIPTIONS = {
"EXTERNAL_DATA_SOURCE": "Внешний источник данных описывает подключение к внешним таблицам, кубам и функциям.", "EXTERNAL_DATA_SOURCE": "Внешний источник данных описывает подключение к внешним таблицам, кубам и функциям.",
"EXCHANGE_PLAN": "План обмена описывает узлы и состав данных для распределенного обмена.", "EXCHANGE_PLAN": "План обмена описывает узлы и состав данных для распределенного обмена.",
"EVENT_SUBSCRIPTION": "Подписка на событие связывает событие платформы или объекта с обработчиком.", "EVENT_SUBSCRIPTION": "Подписка на событие связывает событие платформы или объекта с обработчиком.",
"ROLE": "Роль описывает набор прав доступа к объектам конфигурации и их данным.",
"EXTENSION": "Расширение конфигурации содержит добавленные и заимствованные объекты, а также проверки совместимости.", "EXTENSION": "Расширение конфигурации содержит добавленные и заимствованные объекты, а также проверки совместимости.",
"SCHEDULED_JOB": "Регламентное задание описывает метод, параметры и расписание фонового выполнения.", "SCHEDULED_JOB": "Регламентное задание описывает метод, параметры и расписание фонового выполнения.",
"SEQUENCE": "Последовательность управляет сквозной последовательностью проведения документов и границами восстановления.",
"DOCUMENT_NUMERATOR": "Нумератор документов задает общие правила нумерации для одного или нескольких видов документов.",
"SESSION_PARAMETER": "Параметр сеанса задает значение, доступное в течение пользовательского сеанса.", "SESSION_PARAMETER": "Параметр сеанса задает значение, доступное в течение пользовательского сеанса.",
"COMMON_ATTRIBUTE": "Общий реквизит добавляет реквизит сразу к выбранному набору объектов конфигурации.", "COMMON_ATTRIBUTE": "Общий реквизит добавляет реквизит сразу к выбранному набору объектов конфигурации.",
"FILTER_CRITERION": "Критерий отбора задает состав реквизитов для универсального отбора ссылочных данных.", "FILTER_CRITERION": "Критерий отбора задает состав реквизитов для универсального отбора ссылочных данных.",
@@ -282,6 +292,7 @@ METADATA_TYPE_DOCUMENTATION_URLS.update(
METADATA_TYPE_PROPERTIES: dict[str, tuple[str, ...]] = { METADATA_TYPE_PROPERTIES: dict[str, tuple[str, ...]] = {
"COMMON": ("Состав общих объектов",), "COMMON": ("Состав общих объектов",),
"SUBSYSTEM": STANDARD_PROPERTIES + ("Состав", "Включать в командный интерфейс", "Картинка", "Родитель"),
"COMMON_MODULE": STANDARD_PROPERTIES + ("Клиент", "Сервер", "Внешнее соединение", "Глобальный", "Вызов сервера", "Повторное использование возвращаемых значений"), "COMMON_MODULE": STANDARD_PROPERTIES + ("Клиент", "Сервер", "Внешнее соединение", "Глобальный", "Вызов сервера", "Повторное использование возвращаемых значений"),
"CONSTANT": STANDARD_PROPERTIES + ("Тип значения", "Основная форма", "Форма выбора"), "CONSTANT": STANDARD_PROPERTIES + ("Тип значения", "Основная форма", "Форма выбора"),
"CATALOG": REFERENCE_OBJECT_PROPERTIES, "CATALOG": REFERENCE_OBJECT_PROPERTIES,
@@ -302,8 +313,11 @@ METADATA_TYPE_PROPERTIES: dict[str, tuple[str, ...]] = {
"EXTERNAL_DATA_SOURCE": STANDARD_PROPERTIES + ("Соединение", "Таблицы", "Кубы", "Функции"), "EXTERNAL_DATA_SOURCE": STANDARD_PROPERTIES + ("Соединение", "Таблицы", "Кубы", "Функции"),
"EXCHANGE_PLAN": DATA_OBJECT_PROPERTIES + ("Состав обмена", "Распределенная ИБ", "Авторегистрация изменений"), "EXCHANGE_PLAN": DATA_OBJECT_PROPERTIES + ("Состав обмена", "Распределенная ИБ", "Авторегистрация изменений"),
"EVENT_SUBSCRIPTION": STANDARD_PROPERTIES + ("Источник", "Событие", "Обработчик", "Перед/после события"), "EVENT_SUBSCRIPTION": STANDARD_PROPERTIES + ("Источник", "Событие", "Обработчик", "Перед/после события"),
"ROLE": STANDARD_PROPERTIES + ("Права", "RLS", "Ограничения доступа"),
"EXTENSION": ("Имя", "Назначение", "Версия", "Режим совместимости", "Заимствованные объекты", "Проверки совместимости"), "EXTENSION": ("Имя", "Назначение", "Версия", "Режим совместимости", "Заимствованные объекты", "Проверки совместимости"),
"SCHEDULED_JOB": STANDARD_PROPERTIES + ("Метод", "Расписание", "Использование", "Параметры", "Предопределенное"), "SCHEDULED_JOB": STANDARD_PROPERTIES + ("Метод", "Расписание", "Использование", "Параметры", "Предопределенное"),
"SEQUENCE": STANDARD_PROPERTIES + ("Документы", "Измерения", "Периодичность", "Заполнение", "Граница"),
"DOCUMENT_NUMERATOR": STANDARD_PROPERTIES + ("Длина номера", "Тип номера", "Периодичность", "Документы"),
"SESSION_PARAMETER": STANDARD_PROPERTIES + ("Тип значения",), "SESSION_PARAMETER": STANDARD_PROPERTIES + ("Тип значения",),
"COMMON_ATTRIBUTE": STANDARD_PROPERTIES + ("Тип значения", "Состав", "Разделение данных", "Автоиспользование"), "COMMON_ATTRIBUTE": STANDARD_PROPERTIES + ("Тип значения", "Состав", "Разделение данных", "Автоиспользование"),
"FILTER_CRITERION": STANDARD_PROPERTIES + ("Тип значения", "Состав реквизитов"), "FILTER_CRITERION": STANDARD_PROPERTIES + ("Тип значения", "Состав реквизитов"),
@@ -219,6 +219,43 @@ def test_normalize_edt_project_preserves_source_path_and_common_object_descripti
assert common_forms[0].metadata["comment"] == "Используется в подборе товаров" 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"""
<mdclass:{class_name} xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass">
<name>{object_name}</name>
</mdclass:{class_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): def test_normalize_edt_project_preserves_localized_descriptions(tmp_path: Path):
catalog = tmp_path / "Контрагенты.mdo" catalog = tmp_path / "Контрагенты.mdo"
catalog.write_text( catalog.write_text(
@@ -78,6 +78,37 @@ _METADATA_OWNER_KINDS = {
NodeKind.SCHEDULED_JOB, NodeKind.SCHEDULED_JOB,
NodeKind.BUSINESS_PROCESS, NodeKind.BUSINESS_PROCESS,
NodeKind.TASK, 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 = { _PATH_METADATA_ALIASES = {
"catalogs": ("Справочник", NodeKind.CATALOG), "catalogs": ("Справочник", NodeKind.CATALOG),
@@ -120,6 +151,69 @@ _PATH_METADATA_ALIASES = {
"бизнеспроцессы": ("БизнесПроцесс", NodeKind.BUSINESS_PROCESS), "бизнеспроцессы": ("БизнесПроцесс", NodeKind.BUSINESS_PROCESS),
"tasks": ("Задача", NodeKind.TASK), "tasks": ("Задача", NodeKind.TASK),
"задачи": ("Задача", 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.SCHEDULED_JOB,
NodeKind.BUSINESS_PROCESS, NodeKind.BUSINESS_PROCESS,
NodeKind.TASK, 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.ROLE,
NodeKind.FORM, NodeKind.FORM,
NodeKind.TABULAR_SECTION, NodeKind.TABULAR_SECTION,
@@ -958,7 +1082,33 @@ def _xml_node_kind(object_kind: str) -> NodeKind | None:
"BUSINESS_PROCESS": NodeKind.BUSINESS_PROCESS, "BUSINESS_PROCESS": NodeKind.BUSINESS_PROCESS,
"TASK": NodeKind.TASK, "TASK": NodeKind.TASK,
"SUBSYSTEM": NodeKind.SUBSYSTEM, "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, "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, "XDTO_PACKAGE": NodeKind.XDTO_PACKAGE,
"EXTENSION": NodeKind.EXTENSION, "EXTENSION": NodeKind.EXTENSION,
"LAYOUT": NodeKind.LAYOUT, "LAYOUT": NodeKind.LAYOUT,
@@ -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) 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(
"""
<Configuration>
<Subsystem name="Продажи" qualifiedName="Подсистема.Продажи" />
<Role name="Менеджер" qualifiedName="Роль.Менеджер" />
<Sequence name="ПроведениеДокументов" qualifiedName="Последовательность.ПроведениеДокументов" />
<DocumentNumerator name="ОбщийНумератор" qualifiedName="НумераторДокументов.ОбщийНумератор" />
<CommonForm name="ФормаПодбора" qualifiedName="ОбщаяФорма.ФормаПодбора" />
<FunctionalOption name="ДоступностьСкидок" qualifiedName="ФункциональнаяОпция.ДоступностьСкидок" />
<WebService name="Обмен" qualifiedName="WebСервис.Обмен" />
<WSReference name="ВнешнийСервис" qualifiedName="WSСсылка.ВнешнийСервис" />
<WebSocketClient name="Чат" qualifiedName="WebSocketКлиент.Чат" />
<IntegrationService name="Интеграция" qualifiedName="СервисИнтеграции.Интеграция" />
</Configuration>
""",
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): def test_index_project_remaps_edges_from_duplicate_metadata_nodes(tmp_path: Path):
first = tmp_path / "first.xml" first = tmp_path / "first.xml"
first.write_text( first.write_text(
+26
View File
@@ -26,6 +26,32 @@ class NodeKind(str, Enum):
BUSINESS_PROCESS = "BUSINESS_PROCESS" BUSINESS_PROCESS = "BUSINESS_PROCESS"
TASK = "TASK" TASK = "TASK"
SUBSYSTEM = "SUBSYSTEM" 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" HTTP_SERVICE = "HTTP_SERVICE"
XDTO_PACKAGE = "XDTO_PACKAGE" XDTO_PACKAGE = "XDTO_PACKAGE"
EXTENSION = "EXTENSION" EXTENSION = "EXTENSION"
@@ -287,6 +287,37 @@ _ACCESS_TARGET_KINDS = {
NodeKind.SCHEDULED_JOB, NodeKind.SCHEDULED_JOB,
NodeKind.BUSINESS_PROCESS, NodeKind.BUSINESS_PROCESS,
NodeKind.TASK, 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: if _EVENT_SUBSCRIPTION_KIND is not None:
_ACCESS_TARGET_KINDS.add(_EVENT_SUBSCRIPTION_KIND) _ACCESS_TARGET_KINDS.add(_EVENT_SUBSCRIPTION_KIND)
@@ -299,6 +330,18 @@ _OWNERSHIP_TARGET_KINDS = {
NodeKind.SCHEDULED_JOB, NodeKind.SCHEDULED_JOB,
NodeKind.BUSINESS_PROCESS, NodeKind.BUSINESS_PROCESS,
NodeKind.TASK, 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: if _EVENT_SUBSCRIPTION_KIND is not None:
_OWNERSHIP_TARGET_KINDS.add(_EVENT_SUBSCRIPTION_KIND) _OWNERSHIP_TARGET_KINDS.add(_EVENT_SUBSCRIPTION_KIND)
@@ -3905,6 +3948,43 @@ _FLOWCHART_KIND_LABELS = {
NodeKind.REGISTER: "Регистры", NodeKind.REGISTER: "Регистры",
NodeKind.REPORT: "Отчеты", NodeKind.REPORT: "Отчеты",
NodeKind.DATA_PROCESSOR: "Обработки", 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.HTTP_SERVICE: "HTTP-сервисы",
NodeKind.INTEGRATION_ENDPOINT: "Интеграции", NodeKind.INTEGRATION_ENDPOINT: "Интеграции",
NodeKind.SCHEDULED_JOB: "Регламентные задания", NodeKind.SCHEDULED_JOB: "Регламентные задания",
@@ -19,6 +19,10 @@ _EVENT_SUBSCRIPTION_KIND = getattr(NodeKind, "EVENT_SUBSCRIPTION", None)
_METADATA_ICON_BY_NODE_KIND = { _METADATA_ICON_BY_NODE_KIND = {
NodeKind.EXCHANGE_PLAN: "exchange-plan", NodeKind.EXCHANGE_PLAN: "exchange-plan",
NodeKind.SCHEDULED_JOB: "scheduled-job", NodeKind.SCHEDULED_JOB: "scheduled-job",
NodeKind.SUBSYSTEM: "subsystem",
NodeKind.SEQUENCE: "sequence",
NodeKind.DOCUMENT_NUMERATOR: "numbering",
NodeKind.EVENT_SUBSCRIPTION: "event",
NodeKind.ATTRIBUTE: "attribute", NodeKind.ATTRIBUTE: "attribute",
NodeKind.COMMAND: "command", NodeKind.COMMAND: "command",
NodeKind.FORM: "form", NodeKind.FORM: "form",
@@ -52,6 +56,36 @@ _METADATA_SPEC_PREFIXES = {
"EXCHANGE_PLAN": "ПланОбмена.", "EXCHANGE_PLAN": "ПланОбмена.",
"EVENT_SUBSCRIPTION": "ПодпискаНаСобытие.", "EVENT_SUBSCRIPTION": "ПодпискаНаСобытие.",
"SCHEDULED_JOB": "РегламентноеЗадание.", "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}, "TASK": {NodeKind.TASK},
"EXCHANGE_PLAN": {NodeKind.EXCHANGE_PLAN}, "EXCHANGE_PLAN": {NodeKind.EXCHANGE_PLAN},
"SCHEDULED_JOB": {NodeKind.SCHEDULED_JOB}, "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: if _EVENT_SUBSCRIPTION_KIND is not None:
_METADATA_SPEC_NODE_KINDS["EVENT_SUBSCRIPTION"] = {_EVENT_SUBSCRIPTION_KIND} _METADATA_SPEC_NODE_KINDS["EVENT_SUBSCRIPTION"] = {_EVENT_SUBSCRIPTION_KIND}
+6 -3
View File
@@ -1471,6 +1471,8 @@ def test_import_supports_structure_only_indexing(tmp_path: Path):
<Configuration> <Configuration>
<HTTPService name="ПубличныйAPI" qualifiedName="HTTPСервис.ПубличныйAPI" /> <HTTPService name="ПубличныйAPI" qualifiedName="HTTPСервис.ПубличныйAPI" />
<Subsystem name="Продажи" qualifiedName="Подсистема.Продажи" /> <Subsystem name="Продажи" qualifiedName="Подсистема.Продажи" />
<Sequence name="ПроведениеДокументов" qualifiedName="Последовательность.ПроведениеДокументов" />
<DocumentNumerator name="ОбщийНумератор" qualifiedName="НумераторДокументов.ОбщийНумератор" />
<Role name="Менеджер" qualifiedName="Роль.Менеджер"> <Role name="Менеджер" qualifiedName="Роль.Менеджер">
<Right object="HTTPСервис.ПубличныйAPI" read="true" /> <Right object="HTTPСервис.ПубличныйAPI" read="true" />
</Role> </Role>
@@ -1491,7 +1493,7 @@ def test_import_supports_structure_only_indexing(tmp_path: Path):
assert payload["status"] == "structure_indexed" assert payload["status"] == "structure_indexed"
assert payload["snapshot"]["project_id"] == project_id assert payload["snapshot"]["project_id"] == project_id
assert payload["object_count"] >= 2 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 assert payload["normalized_summary"]["rights_count"] == 1
setup = client.get(f"/projects/{project_id}/setup") 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") normalized = client.get(f"/projects/{project_id}/normalized")
assert normalized.status_code == 200 assert normalized.status_code == 200
groups = {group["name"] for group in normalized.json()["configuration"]["groups"]} groups = {group["name"] for group in normalized.json()["configuration"]["groups"]}
assert {"HTTP-сервисы", "Подсистемы", "Роли"}.issubset(groups) assert {"HTTP-сервисы", "Подсистемы", "Роли", "Последовательности", "Нумераторы документов"}.issubset(groups)
detail = client.get( detail = client.get(
f"/projects/{project_id}/normalized/object", 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] main_configuration = root["children"][0]
common = next(item for item in main_configuration["children"] if item["label"] == "Общие") 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): def test_import_full_replace_replaces_current_normalized_project(tmp_path: Path):