fix(cfe-borrow): текст запроса динамического списка — тоже место ссылки

Заимствование дочерних объектов в оболочку шло по трём источникам имён:
*DataPath, <Field> и <AdditionalColumns table=...>. У формы списка с ручным
запросом реквизиты упомянуты ещё и в тексте запроса, и они не заимствовались:
на эталоне Issue66Example2 навык брал 5 реквизитов и 0 табличных частей,
Конфигуратор — 17 и 4.

Правило выведено по эталонам и совпадает с ними в обе стороны: Конфигуратор
переносит то, на что ссылается форма, а у динамического списка с ручным
запросом текст запроса — такое же место ссылки, как DataPath. Имена, которые
встречаются в <QueryText> целым словом, — это 21 из 27 дочерних объектов, и
множество совпадает со взятым Конфигуратором точно.

Разбирать язык запросов не нужно: имена-кандидаты и так фильтруются по
реальному составу объекта, поэтому лишние слова из запроса безвредны.

Состав оболочки теперь совпадает с эталонами на всех четырёх случаях:
форма документа 47 реквизитов и 2 ТЧ, список с запросом 17 и 4, список без
запроса 3 и 0 (Issue66Example3 — там правило «только видимое на форме», и
поведение не меняется), форма записи регистра 3 измерения и 1 ресурс.

По корпусу (13796 форм УТ + ERP) списков с запросом 2584, без него 2411.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-14 15:25:31 +03:00
co-authored by Claude Opus 5
parent 67d7da8285
commit a424e9cd19
45 changed files with 1727 additions and 2 deletions
@@ -1,4 +1,4 @@
# cfe-borrow v1.28 — Borrow objects from configuration into extension (CFE)
# cfe-borrow v1.29 — Borrow objects from configuration into extension (CFE)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)][string]$ExtensionPath,
@@ -1343,6 +1343,20 @@ function Collect-FormDataPaths {
$firstLevel[$seg0] = $true
}
# Текст запроса динамического списка — такое же место ссылки на реквизиты объекта, как DataPath.
# Конфигуратор заимствует всё, что упомянуто в запросе: на эталоне Issue66Example2 это 21 из 27
# дочерних объектов, совпадение с ним точное в обе стороны. У списка без ручного запроса
# (<QueryText> нет) заимствуется только видимое на форме — эталон Issue66Example3.
# Разбирать язык запросов не нужно: имена-кандидаты отфильтрует Resolve-SourceAttributes по
# реальному составу объекта, поэтому лишние слова из запроса безвредны.
foreach ($qm in [regex]::Matches($content, '(?s)<QueryText>(.*?)</QueryText>')) {
foreach ($w in [regex]::Matches($qm.Groups[1].Value, '[\w]+')) {
$word = $w.Value
if ($script:standardFields -contains $word) { continue }
$firstLevel[$word] = $true
}
}
# Deduplicate deep paths
$seen = @{}
$uniqueDeep = @()
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# cfe-borrow v1.28 — Borrow objects from configuration into extension (CFE)
# cfe-borrow v1.29 — Borrow objects from configuration into extension (CFE)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -1027,6 +1027,18 @@ def main():
continue
first_level[seg0] = True
# Текст запроса динамического списка — такое же место ссылки на реквизиты объекта, как DataPath.
# Конфигуратор заимствует всё, что упомянуто в запросе: на эталоне Issue66Example2 это 21 из 27
# дочерних объектов, совпадение с ним точное в обе стороны. У списка без ручного запроса
# (<QueryText> нет) заимствуется только видимое на форме — эталон Issue66Example3.
# Разбирать язык запросов не нужно: имена-кандидаты отфильтрует resolve_source_attributes по
# реальному составу объекта, поэтому лишние слова из запроса безвредны.
for qm in re.finditer(r'(?s)<QueryText>(.*?)</QueryText>', content):
for w in re.finditer(r'\w+', qm.group(1)):
if w.group(0) in STANDARD_FIELDS:
continue
first_level[w.group(0)] = True
# Deduplicate deep paths
seen = set()
unique_deep = []