mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-19 16:35:52 +03:00
feat(meta-validate,meta-compile): гард на нераспознанное имя типа, два уровня
Неизвестное имя типа проходило насквозь молча: meta-compile писал его в XML дословно (<v8:Type>varchar(150)</v8:Type>), meta-validate не смотрел на скалярные типы вовсе — проверка 16 разбирает только ссылочные с известным префиксом. Отказ приходил лишь от платформы при загрузке всей конфигурации, без указания объекта и реквизита. Так вело себя и имя типа СУБД, и опечатка. meta-validate, проверка 22 — два уровня, потому что «невалидно» и «нам незнакомо» разные вещи: Уровень 1, грамматика (ERROR). Содержимое <v8:Type> всегда несёт префикс пространства имён; голое имя платформа не примет никогда, независимо от её версии и состава конфигурации. Сюда же неверная форма ссылочного типа. Уровень 2, словарь по контексту владельца (WARN). У хранимого объекта набор типов у́же, чем у обработки или отчёта, где доступны ТаблицаЗначений, ОписаниеТипов, Картинка. Замер по корпусу подтверждает разделение: v8:ValueTable/ValueTree/StandardPeriod в объектных файлах acc и erp встречаются только у обработок и отчётов, у хранимых — ноль. Оставлено предупреждением намеренно: словарь — та часть, которая расширяется с версиями платформы, и цена ложной ошибки выше пользы. Жёстко только там, где решает грамматика. meta-compile отвергает голое неизвестное имя с перечнем допустимых форм. Имя с готовым префиксом (v8:ValueTable, ent:AccountType, v8ui:Color) по-прежнему проходит как есть — это законный ввод, и правильность имени судит валидатор, которому виден весь файл. check-type-synonyms.mjs — новый гард: по общему ключу meta-edit обязан понимать то же, что meta-compile (авторитет). Отсутствие ключа допустимо, разное значение — нет. Проверено: - корпус, 23430 объектов четырёх выгрузок: ноль ошибок и ноль предупреждений проверки 22; на реальном справочнике разбирается 88 имён типов, то есть проверка работает, а не молчит; - раундтрип A, 13788 объектов: побайтово как эталон, compile-fail 0 — отказ компилятора не задел ни одного законного типа; - meta-compile 94/94 и meta-validate 48/48 в обоих рантаймах, 11 гардов; - снэпшот type-with-prefix-passthrough принят платформой 8.3.24.1691. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBsZA5cr2WFThtgp7i5WVi
This commit is contained in:
co-authored by
Claude Opus 5
parent
eccb11b0ed
commit
ed160c65b5
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# meta-compile v1.110 — Compile 1C metadata object from JSON
|
||||
# meta-compile v1.111 — Compile 1C metadata object from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
@@ -1022,8 +1022,21 @@ def emit_type_content(indent, type_str):
|
||||
else:
|
||||
X(f'{indent}<v8:Type xmlns:d5p1="http://v8.1c.ru/8.1/data/enterprise/current-config">d5p1:{type_str}</v8:Type>')
|
||||
return
|
||||
# Fallback
|
||||
X(f'{indent}<v8:Type>{type_str}</v8:Type>')
|
||||
# Имя с готовым префиксом пропускаем как есть: это законный ввод (v8:ValueTable, ent:AccountType,
|
||||
# v8ui:Color …), и своё пространство имён выбрал вызывающий. Правильность имени судит
|
||||
# meta-validate (проверка 22) — там виден весь файл и вид владельца.
|
||||
if ':' in type_str:
|
||||
X(f'{indent}<v8:Type>{type_str}</v8:Type>')
|
||||
return
|
||||
|
||||
# Голое имя без префикса и без совпадения с известной формой — не тип платформы. Раньше
|
||||
# такое имя уходило в XML дословно, и отказ приходил только от платформы при загрузке
|
||||
# всей конфигурации — «Неизвестное имя типа», без указания объекта и реквизита.
|
||||
print(f"Неизвестный тип '{type_str}'. Допустимые формы: String(N), Number(D,F), Boolean, "
|
||||
"Date/DateTime/Time, ValueStorage, UUID, BinaryData; ссылочные <Вид>Ref.<Имя>; "
|
||||
"DefinedType.<Имя>, Characteristic.<Имя>; типы платформы с префиксом (v8:ValueTable, ent:AccountType).",
|
||||
file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
def emit_value_type(indent, type_str):
|
||||
X(f'{indent}<Type>')
|
||||
|
||||
Reference in New Issue
Block a user