mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-27 23:21:02 +03:00
feat(meta-compile,meta-decompile): свойства формата 2.20 (платформа 8.3.27)
Дельта формата 2.17→2.20 содержит три безусловных свойства, которых компилятор
не эмитил. Все три пишутся ТОЛЬКО при формате >= 2.20 (Detect-FormatVersion),
поэтому 2.17-проекты не меняются: полная сюита зелёная, ни один существующий
снэпшот не сдвинулся.
- xr:TypeReductionMode — каждому стандартному реквизиту, после CreateOnInput.
TransformValues, кроме Owner → Deny (правило проверено против выгрузки acc:
9 из 9 реквизитов совпали, включая Owner).
- TypeReductionMode — измерениям регистра СВЕДЕНИЙ (у прочих семейств и у
реквизитов/ресурсов платформа его не пишет).
- LineNumberLength — табличным частям, последним в Properties.
LineNumberLength — прикладная возможность 8.3.27 (5..9 → до 999 999 999 строк
вместо 99 999), поэтому получил полноценный DSL-ключ и описание в spec §5.2.
Его дефолт зависит НЕ от версии формата, а от режима совместимости на момент
создания ТЧ (<=8_3_26 → 5, >=8_3_27 → 9) — платформа фиксирует значение и позже
не пересчитывает, поэтому в одной конфигурации соседствуют ТЧ с 5 и 9. Отсюда
новая Detect-CompatibilityMode: читает CompatibilityMode из Configuration.xml
(префикс 64 КБ — тег лежит на ~11-12 КБ, существующим 2000 байт не хватает).
Декомпилятор: TypeReductionMode захватывается только при отклонении от правила
(компилятор выводит его сам), LineNumberLength — всегда при наличии тега:
выводить его дефолт значило бы дублировать логику компилятора с риском разойтись.
Компараторы версий числовые по компонентам — строковое сравнение неверно
("2.9" > "2.17" лексикографически).
Тест-инфра: setup-фикстуры empty-config-220 и empty-config-220-compat24
(строятся тем же cf-init), два кейса — по одному на каждую ось.
Проверка: роундтрип реального 2.20-документа БП (АвансовыйОтчет, 7 ТЧ) —
по новым тегам 0 расхождений, значения и позиции совпали; остаточный хвост
52/39 идентичен такому же на 2.17, то есть пред-существующий. Сюита 570/570
ps1, 567+3 skipped py, ps1==py. 1С-сертификация обоих кейсов на 8.3.27 ✓.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
769b4d3dbd
commit
068928646d
+12
-4
@@ -122,17 +122,25 @@ function ensureSetup(setupName, runtime, skillCasesDir) {
|
||||
return extPath;
|
||||
}
|
||||
|
||||
if (setupName === 'empty-config') {
|
||||
const cached = join(CACHE, 'empty-config');
|
||||
// Пустые конфигурации-фикстуры. Версия формата и режим совместимости — независимые оси:
|
||||
// формат задаёт платформа выгрузки, а режим влияет на дефолт <LineNumberLength> у ТЧ
|
||||
// (<=8_3_26 → 5, >=8_3_27 → 9). Отсюда две 2.20-фикстуры с разными режимами.
|
||||
const EMPTY_CONFIGS = {
|
||||
'empty-config': [],
|
||||
'empty-config-220': ['-FormatVersion', '2.20', '-CompatibilityMode', 'Version8_3_27'],
|
||||
'empty-config-220-compat24': ['-FormatVersion', '2.20', '-CompatibilityMode', 'Version8_3_24'],
|
||||
};
|
||||
if (EMPTY_CONFIGS[setupName]) {
|
||||
const cached = join(CACHE, setupName);
|
||||
if (existsSync(cached)) return cached;
|
||||
|
||||
mkdirSync(cached, { recursive: true });
|
||||
const script = resolveScript('cf-init/scripts/cf-init', runtime);
|
||||
try {
|
||||
execSkillRaw(runtime, script, ['-Name', 'TestConfig', '-OutputDir', cached]);
|
||||
execSkillRaw(runtime, script, ['-Name', 'TestConfig', '-OutputDir', cached, ...EMPTY_CONFIGS[setupName]]);
|
||||
} catch (e) {
|
||||
rmSync(cached, { recursive: true, force: true });
|
||||
throw new Error(`Failed to create empty-config fixture: ${e.message}`);
|
||||
throw new Error(`Failed to create ${setupName} fixture: ${e.message}`);
|
||||
}
|
||||
return cached;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user