mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-27 21:49:41 +03:00
fix(17 навыков): самозакрывающийся тег без пробела и UTF-8 в декларации (#57)
.NET XmlWriter пишет `<a />`, а Конфигуратор — `<a/>`. Поскольку Save переписывает файл целиком, meta-edit при добавлении одного реквизита переводил в пробельную форму все пустые теги документа. Дефект только у PS-порта: lxml (45 из 49 py-портов) уже пишет плотно, то есть порты расходились побайтово. Канон измерен, а не предположен: чистая выгрузка пустой ИБ на Windows и macOS плюс сплошной скан 8 выгрузок в cfsrc — 476 943 XML, 21 294 119 самозакрывающихся тегов, пробельных 0. Форма не зависит от ОС, версии платформы (8.3.20-8.5) и наличия атрибутов. Правило уже было реализовано в skd-edit — оттуда и взято. Замена безопасна доказуемо: .NET экранирует `>` как `>` и в тексте, и в атрибутах, поэтому ` />` после Save — только конец тега. Лазейки (CDATA, комментарии) в 1С-метаданных не встречаются — 0 из 476 943 файлов; гард на них всё равно стоит. Одиннадцать скриптов писали прямо в FileStream без пост-обработки — переведены на MemoryStream, что заодно чинит `encoding="utf-8"` строчными (335 файлов в снэпшотах). В cfe-borrow правится и сборка Form.xml: куски берутся из OuterXml, а он спацовывает так же, как XmlWriter. Дрейф снэпшотов: 12 838 строк тегов + 335 деклараций, содержательных изменений ноль. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
ccd860ae89
commit
39cf8e49cf
@@ -1,4 +1,4 @@
|
||||
# meta-compile v1.76 — Compile 1C metadata object from JSON
|
||||
# meta-compile v1.77 — Compile 1C metadata object from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
@@ -4990,15 +4990,25 @@ if (Test-Path $configXmlPath) {
|
||||
}
|
||||
}
|
||||
|
||||
# Save
|
||||
# Save. Пишем через MemoryStream, а не прямо в файл: нужен шаг пост-обработки
|
||||
# строки — XmlWriter отдаёт `encoding="utf-8"` и `<a />`, Конфигуратор пишет
|
||||
# `encoding="UTF-8"` и `<a/>`.
|
||||
$cfgSettings = New-Object System.Xml.XmlWriterSettings
|
||||
$cfgSettings.Encoding = New-Object System.Text.UTF8Encoding($true)
|
||||
$cfgSettings.Indent = $false
|
||||
$stream = New-Object System.IO.FileStream($configXmlPath, [System.IO.FileMode]::Create)
|
||||
$writer = [System.Xml.XmlWriter]::Create($stream, $cfgSettings)
|
||||
$memStream = New-Object System.IO.MemoryStream
|
||||
$writer = [System.Xml.XmlWriter]::Create($memStream, $cfgSettings)
|
||||
$configDoc.Save($writer)
|
||||
$writer.Close()
|
||||
$stream.Close()
|
||||
$writer.Flush(); $writer.Close()
|
||||
|
||||
$cfgText = [System.Text.Encoding]::UTF8.GetString($memStream.ToArray())
|
||||
$memStream.Close()
|
||||
if ($cfgText.Length -gt 0 -and $cfgText[0] -eq [char]0xFEFF) { $cfgText = $cfgText.Substring(1) }
|
||||
$cfgText = $cfgText.Replace('encoding="utf-8"', 'encoding="UTF-8"')
|
||||
# Гард на CDATA/комментарии: только там `>` не экранируется, и ` />` может
|
||||
# быть содержимым, а не концом тега.
|
||||
if ($cfgText -notmatch '<!\[CDATA\[|<!--') { $cfgText = [regex]::Replace($cfgText, '(?<=\S) />', '/>') }
|
||||
[System.IO.File]::WriteAllText($configXmlPath, $cfgText, (New-Object System.Text.UTF8Encoding($true)))
|
||||
|
||||
$regResult = "added"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# meta-compile v1.76 — Compile 1C metadata object from JSON
|
||||
# meta-compile v1.77 — Compile 1C metadata object from JSON
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
|
||||
import argparse
|
||||
|
||||
Reference in New Issue
Block a user