fix(meta-validate): batch выполняется в одном процессе вместо процесса на объект

py-порт в batch-режиме запускал сам себя через subprocess на каждый объект, и на разбор в единицы
миллисекунд приходилось ~146 мс старта интерпретатора с импортом lxml. На корпусном прогоне это
давало 92 мс на объект против 40 мс у PS — при том, что обычно py быстрее в разы. Причина
асимметрии: PS вызывает себя через & в том же процессе, платя свой дорогой старт один раз на батч.

Теперь py делает то же самое: файл компилируется один раз и выполняется в свежем globals() на
каждый объект. Изоляция состояния получается той же, что у & в PowerShell (script-переменные не
переживают вызов), а старт и компиляция платятся однократно.

Прогон по acc_8.3.24 и erp_8.3.24 (33 895 объектов): 274 c против ~2900 c, вывод побайтово тот же
и совпадает с PS-портом строка в строку. Батч с битым объектом в середине по-прежнему доходит до
конца и возвращает ненулевой код, -OutFile пишет те же файлы на объект.

Заодно уточнён комментарий про кэш состава конфигурации: «порождает процесс на объект» было верно
только для py, тогда как в PS кэш не переживает объект из-за новой области видимости.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-22 15:59:57 +03:00
co-authored by Claude Opus 5
parent 18510d65d5
commit 333bcad938
2 changed files with 36 additions and 11 deletions
@@ -1493,8 +1493,9 @@ if ($childObjNode) {
# нет в составе -> платформа отвергнет загрузку всегда -> ERROR
# в составе, файла нет -> полная загрузка упадёт, частичная пройдёт -> WARN
# ChildObjects конфигурации — плоский список <Вид>Имя</Вид>, поэтому ищем подстроку в границах секции
# без копирования и без разбора XML: batch-режим порождает процесс на объект, и полная карта (~100 мс)
# оплачивалась бы каждым объектом.
# без копирования и без разбора XML. Кэш живёт только в пределах одного объекта: в batch-режиме
# каждый следующий разбирается заново (в PS — новая область видимости скрипта при вызове через &,
# в py — вовсе новый процесс), так что полная карта (~100 мс) оплачивалась бы каждым объектом.
$script:cfgText = $null
$script:cfgChildStart = -1