mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-16 16:29:01 +03:00
fix(db-load-git,db-update): ловить тихие отказы платформы, как db-load-xml
Платформа рапортует об успехе (exit 0) и одновременно пишет в /Out-лог, что часть метаданных отброшена. Детектор этого был только в db-load-xml, хотя db-load-git гоняет тот же /LoadConfigFromFiles (и дописывает /UpdateDBCfg в тот же вызов), а db-update — вторую половину той же цепочки. Оба лог печатали, но не разбирали. Детектор извлечён в Find-SilentRejections / find_silent_rejections и внесён в реестр семей check-inline-drift: инлайн-код гард сверять не умеет, а именно расхождение копий и было бы главным риском такого дублирования. Добавлен восьмой паттерн — «Для работы с конфигурацией необходима версия платформы не меньше». Замерено при работе над issue #63: конфигурация с режимом совместимости выше платформы грузится с кодом 0, db-update тоже отвечает 0, объекты в базу не попадают, а отказ приходит только в рантайме. Строка обрезана до инвариантной части — конкретная версия в сообщении меняется. Текст предупреждения переписан. Убрана подсказка «pass -StrictLog to treat as error»: ключ предназначен для регрессов (его передаёт verify-snapshots), а совет бессмысленный — операция уже выполнена, и повторять её ради того же текста незачем. Формулировка больше не утверждает «dropped properties/refs»: класс проблемы разный, а строки лога печатаются следом и говорят за себя. Две правки по дороге: - `return ,$found` в паре с `@()` у вызывающего давал массив из одного пустого массива, то есть предупреждение «1 problem(s)» на чистом логе. Возврат без запятой-обёртки. - py-порт писал предупреждение в stderr, PS1 — в stdout. В самом py-порте stderr занят исключительно фатальными «Error:» перед exit 1, так что не-фатальное предупреждение там было единственным исключением. Приведено к stdout — и к соглашению своего же файла, и к поведению PS1; verify-snapshots на падении читает `stderr || stdout`, поэтому диагностика не теряется. Тесты: фейковая платформа .cmd, которая вычитывает путь из /Out и кладёт туда готовый лог, — по четыре кейса на db-load-xml и db-update (отбраковка, она же под -StrictLog, новый паттерн, чистый лог без предупреждения). Раньше детектор не был покрыт вообще. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
06f21ab3d1
commit
a024b7da9c
@@ -1,4 +1,4 @@
|
||||
# db-load-xml v1.20 — Load 1C configuration from XML files
|
||||
# db-load-xml v1.21 — Load 1C configuration from XML files
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
# NB: *nix-раскладку платформы (/opt/1cv8/<ver>/1cv8, без .exe) знает только .py-порт — PS на *nix не исполняется.
|
||||
<#
|
||||
@@ -416,6 +416,41 @@ function Write-PlatformOutput {
|
||||
Write-Host "--- End ---"
|
||||
}
|
||||
|
||||
# Строки лога, о которых платформа сообщает, НЕ поднимая код возврата: метаданные отброшены или
|
||||
# конфигурация нерабочая, а операция при этом «успешна». Возвращает подошедшие строки.
|
||||
#
|
||||
# Копия этой функции есть в каждом навыке, который читает /Out-лог загрузки (навыки автономны).
|
||||
# Держать копии одинаковыми — сознательно: разошедшиеся копии сводят на нет весь смысл.
|
||||
function Find-SilentRejections {
|
||||
param([string]$LogText)
|
||||
$patterns = @(
|
||||
'Неверное свойство объекта метаданных',
|
||||
'не входит в состав объекта метаданных',
|
||||
'Неизвестное имя типа',
|
||||
'Неизвестный объект метаданных',
|
||||
'Ни один из документов не является регистратором для регистра',
|
||||
'Неверное значение перечисления',
|
||||
'не может быть приведен к типу',
|
||||
# Режим совместимости выше платформы: объекты в базу не попадают, отказ приходит в рантайме.
|
||||
# Обрезано до инвариантной части — конкретная версия в сообщении меняется.
|
||||
'Для работы с конфигурацией необходима версия платформы не меньше'
|
||||
)
|
||||
$found = @()
|
||||
if ($LogText) {
|
||||
foreach ($line in ($LogText -split "`r?`n")) {
|
||||
foreach ($pat in $patterns) {
|
||||
if ($line -match [regex]::Escape($pat)) {
|
||||
$found += $line.Trim()
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
# Возвращаем массив БЕЗ запятой-обёртки: вызывающий берёт результат в @(), а `return ,$found`
|
||||
# дал бы массив из одного пустого массива — фантомное срабатывание на чистом логе.
|
||||
return $found
|
||||
}
|
||||
|
||||
|
||||
$engine = if ((Split-Path $V8Path -Leaf) -match '^ibcmd') { "ibcmd" } else { "1cv8" }
|
||||
|
||||
@@ -607,28 +642,7 @@ try {
|
||||
}
|
||||
|
||||
# --- Scan log for silent rejections ---
|
||||
# Platform often writes load-time rejections into /Out but exits with code 0.
|
||||
# These patterns flag cases where metadata was dropped or rejected silently.
|
||||
$fatalLogPatterns = @(
|
||||
'Неверное свойство объекта метаданных',
|
||||
'не входит в состав объекта метаданных',
|
||||
'Неизвестное имя типа',
|
||||
'Неизвестный объект метаданных',
|
||||
'Ни один из документов не является регистратором для регистра',
|
||||
'Неверное значение перечисления',
|
||||
'не может быть приведен к типу'
|
||||
)
|
||||
$silentFailures = @()
|
||||
if ($logContent) {
|
||||
foreach ($line in ($logContent -split "`r?`n")) {
|
||||
foreach ($pat in $fatalLogPatterns) {
|
||||
if ($line -match [regex]::Escape($pat)) {
|
||||
$silentFailures += $line.Trim()
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$silentFailures = @(Find-SilentRejections $logContent)
|
||||
|
||||
# --- Result ---
|
||||
# Default: mirror platform's verdict via exit code. Log content (including any
|
||||
@@ -647,10 +661,11 @@ try {
|
||||
}
|
||||
Write-PlatformOutput $__v8.Output
|
||||
|
||||
# Причину не называем: строки лога печатаются следом и говорят за себя, а класс проблемы
|
||||
# разный — от отброшенного свойства до нерабочей на этой платформе конфигурации. Подсказку
|
||||
# про -StrictLog не даём: загрузка уже выполнена, повторять её ради того же текста незачем.
|
||||
if ($silentFailures.Count -gt 0) {
|
||||
$msg = "[warning] log contains $($silentFailures.Count) rejection(s) — platform loaded config but dropped properties/refs"
|
||||
if (-not $StrictLog) { $msg += " (pass -StrictLog to treat as error)" }
|
||||
Write-Host $msg -ForegroundColor Yellow
|
||||
Write-Host "[warning] platform reported success, but the log contains $($silentFailures.Count) problem(s):" -ForegroundColor Yellow
|
||||
foreach ($f in $silentFailures) { Write-Host " $f" -ForegroundColor Yellow }
|
||||
if ($StrictLog -and $exitCode -eq 0) { $exitCode = 1 }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user