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",
"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-ссылки",
@@ -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 + ("Тип значения", "Состав реквизитов"),
@@ -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"""
<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):
catalog = tmp_path / "Контрагенты.mdo"
catalog.write_text(