diff --git a/.claude/skills/cfe-patch-method/SKILL.md b/.claude/skills/cfe-patch-method/SKILL.md
index 0e9ae6cc..0239fcbb 100644
--- a/.claude/skills/cfe-patch-method/SKILL.md
+++ b/.claude/skills/cfe-patch-method/SKILL.md
@@ -77,8 +77,8 @@ allowed-tools:
Если для метода уже есть перехватчик `&ИзменениеИКонтроль`, повторный вызов **актуализирует** его по текущему оригиналу:
- `[АКТУАЛЕН]` — оригинал не менялся, изменений нет;
-- `[АКТУАЛИЗИРОВАН]` — тело обновлено по новому оригиналу, правки (`#Вставка`/`#Удаление`) перенесены автоматически;
-- `[АКТУАЛИЗИРОВАН-ЧАСТИЧНО]` — часть правок не удалось разместить (изменился якорь). Они помечены `// [РЕСИНК-КОНФЛИКТ]` и не потеряны; для анализа выгружаются файлы-версии (`v1.bsl`, `v2.bsl`, `current.bsl`, `diff.txt`) — путь печатается в выводе. Проверь конфликтные блоки и размести вручную.
+- `[АКТУАЛИЗИРОВАН]` — тело обновлено по новому оригиналу, правки (`#Вставка`/`#Удаление`) перенесены автоматически (в выводе — сводка перенесённого);
+- `[АКТУАЛИЗИРОВАН-ЧАСТИЧНО]` — часть правок не удалось разместить (окружающий контекст изменился). Они помечены `// [РЕСИНК-КОНФЛИКТ]` и не потеряны; в системный temp выгружается merge-воркспейс (`base.bsl` — предок, `local.bsl` — твоя версия с маркерами, `remote.bsl` — новый оригинал, `merged.bsl` — результат, `diff.txt` — base→remote) — путь печатается в выводе. Проверь конфликтные блоки и размести вручную.
Повторный вызов `Before`/`After`/`Instead` для уже перехваченного метода не создаёт дубль (`[ПРОПУЩЕН]`).
diff --git a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.ps1 b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.ps1
index 4c083c93..83aa1f13 100644
--- a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.ps1
+++ b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.ps1
@@ -1,4 +1,4 @@
-# cfe-patch-method v2.0 — Source-aware method interceptor for 1C extension (CFE)
+# cfe-patch-method v2.1 — Source-aware method interceptor for 1C extension (CFE)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -419,6 +419,62 @@ function Find-UniqueRun {
return $found
}
+# Resolve where an insertion lands in v2 using two-sided context.
+# Returns index to "insert after" (-1 = top of body), or $null if ambiguous/conflict.
+function Resolve-InsertionPoint {
+ param($v2norm, $beforeLines, $afterLines)
+ $nb = $beforeLines.Count; $na = $afterLines.Count
+
+ # Tier A: adjacent pair (before[-1] immediately followed by after[0] in v2), widening symmetrically
+ if ($nb -ge 1 -and $na -ge 1) {
+ $cands = @()
+ for ($k = 0; $k -lt ($v2norm.Count - 1); $k++) {
+ if ($v2norm[$k] -eq $beforeLines[$nb - 1] -and $v2norm[$k + 1] -eq $afterLines[0]) { $cands += $k }
+ }
+ if ($cands.Count -eq 1) { return $cands[0] }
+ if ($cands.Count -gt 1) {
+ $w = 1
+ while ($cands.Count -gt 1 -and ($w -lt $nb -or $w -lt $na)) {
+ $w++
+ $filtered = @()
+ foreach ($k in $cands) {
+ $ok = $true
+ if ($w -le $nb) {
+ if (($k - ($w - 1)) -lt 0 -or $v2norm[$k - ($w - 1)] -ne $beforeLines[$nb - $w]) { $ok = $false }
+ }
+ if ($ok -and $w -le $na) {
+ if (($k + $w) -ge $v2norm.Count -or $v2norm[$k + $w] -ne $afterLines[$w - 1]) { $ok = $false }
+ }
+ if ($ok) { $filtered += $k }
+ }
+ if ($filtered.Count -eq 0) { break }
+ $cands = $filtered
+ }
+ if ($cands.Count -eq 1) { return $cands[0] }
+ return $null
+ }
+ }
+
+ # Tier B: one side changed -> single-side uniqueness
+ if ($nb -ge 1) {
+ $bk = Find-UniqueIndex $v2norm $beforeLines[$nb - 1]
+ if ($bk -ge 0) { return $bk }
+ }
+ if ($na -ge 1) {
+ $ak = Find-UniqueIndex $v2norm $afterLines[0]
+ if ($ak -ge 0) { return ($ak - 1) }
+ }
+ return $null
+}
+
+# Truncate a line for compact summary output
+function Get-Truncated {
+ param([string]$s, [int]$n = 60)
+ $t = $s.Trim()
+ if ($t.Length -gt $n) { return $t.Substring(0, $n) + "…" }
+ return $t
+}
+
# ============================================================================
# Main
# ============================================================================
@@ -556,17 +612,30 @@ if ($dup) {
$delStart = @{} # v2 index -> $true
$delEnd = @{}
$disputed = @()
+ $transferred = @() # for the summary: @{ Kind; Anchor }
foreach ($op in $ops) {
if ($op.Kind -eq 'insert') {
- if ($op.After -lt 0) { $insertTop += ,$op.Lines; continue }
- $anchorKey = $v1norm[$op.After]
- $k = Find-UniqueIndex $v2norm $anchorKey
- if ($k -ge 0) {
+ # two-sided context anchor
+ $beforeLines = @()
+ if ($op.After -ge 0) {
+ $bs = [Math]::Max(0, $op.After - 2)
+ for ($m = $bs; $m -le $op.After; $m++) { $beforeLines += $v1norm[$m] }
+ }
+ $afterLines = @()
+ $ae = [Math]::Min($v1norm.Count - 1, $op.After + 3)
+ for ($m = $op.After + 1; $m -le $ae; $m++) { $afterLines += $v1norm[$m] }
+
+ $k = Resolve-InsertionPoint $v2norm $beforeLines $afterLines
+ if ($null -eq $k) {
+ $disputed += @{ Kind = 'insert'; Lines = $op.Lines }
+ } elseif ($k -lt 0) {
+ $insertTop += ,$op.Lines
+ $transferred += @{ Kind = 'insert'; Anchor = '(в начало метода)' }
+ } else {
if (-not $insertAfter.ContainsKey($k)) { $insertAfter[$k] = @() }
$insertAfter[$k] += ,$op.Lines
- } else {
- $disputed += @{ Kind = 'insert'; Lines = $op.Lines }
+ $transferred += @{ Kind = 'insert'; Anchor = $v2[$k] }
}
} else {
$keys = @()
@@ -575,6 +644,7 @@ if ($dup) {
if ($p -ge 0) {
$delStart[$p] = $true
$delEnd[$p + $keys.Count - 1] = $true
+ $transferred += @{ Kind = 'delete'; Anchor = $op.Lines[0] }
} else {
$disputed += @{ Kind = 'delete'; Lines = $op.Lines }
}
@@ -599,7 +669,7 @@ if ($dup) {
# disputed blocks appended with conflict markers (never lost)
if ($disputed.Count -gt 0) {
$newBody += "`t// [РЕСИНК-КОНФЛИКТ] перенесите блоки ниже вручную — исходный якорь изменился в новой версии оригинала."
- $newBody += "`t// Материалы для анализа см. в выводе команды (файлы v1/v2/current/diff)."
+ $newBody += "`t// Материалы для анализа см. в выводе команды (файлы base/local/remote/merged)."
foreach ($d in $disputed) {
if ($d.Kind -eq 'insert') {
$newBody += "#Вставка"; foreach ($l in $d.Lines) { $newBody += $l }; $newBody += "#КонецВставки"
@@ -632,26 +702,37 @@ if ($dup) {
[System.IO.File]::WriteAllText($extBsl, (($out -join "`r`n") + "`r`n"), $enc)
+ # transferred summary (shared by full-auto and partial)
+ function Write-TransferSummary {
+ param($items)
+ foreach ($t in $items) {
+ if ($t.Kind -eq 'insert') { Write-Host " • вставка после «$(Get-Truncated $t.Anchor)»" }
+ else { Write-Host " • удаление «$(Get-Truncated $t.Anchor)»" }
+ }
+ }
+
if ($disputed.Count -gt 0) {
- # write version files
+ # merge workspace (git-mergetool convention: base/local/remote/merged)
$tmpRoot = Join-Path ([System.IO.Path]::GetTempPath()) ("cfe-resync\" + ($ModulePath -replace '[\\/:*?"<>|]', '_') + "." + $MethodName)
if (-not (Test-Path $tmpRoot)) { New-Item -ItemType Directory -Path $tmpRoot -Force | Out-Null }
- [System.IO.File]::WriteAllText((Join-Path $tmpRoot "v1.bsl"), (($v1 -join "`r`n") + "`r`n"), $enc)
- [System.IO.File]::WriteAllText((Join-Path $tmpRoot "v2.bsl"), (($v2 -join "`r`n") + "`r`n"), $enc)
- [System.IO.File]::WriteAllText((Join-Path $tmpRoot "current.bsl"), (($markedBody -join "`r`n") + "`r`n"), $enc)
+ [System.IO.File]::WriteAllText((Join-Path $tmpRoot "base.bsl"), (($v1 -join "`r`n") + "`r`n"), $enc)
+ [System.IO.File]::WriteAllText((Join-Path $tmpRoot "local.bsl"), (($markedBody -join "`r`n") + "`r`n"), $enc)
+ [System.IO.File]::WriteAllText((Join-Path $tmpRoot "remote.bsl"), (($v2 -join "`r`n") + "`r`n"), $enc)
+ [System.IO.File]::WriteAllText((Join-Path $tmpRoot "merged.bsl"), (($newBlock -join "`r`n") + "`r`n"), $enc)
$diff = @()
- $diff += "--- v1 (что было скопировано) vs v2 (новый оригинал) ---"
+ $diff += "--- base -> remote (что изменилось в оригинале) ---"
foreach ($l in $v1) { if ($v2norm -notcontains (Get-Normalized $l)) { $diff += "- $l" } }
foreach ($l in $v2) { if ($v1norm -notcontains (Get-Normalized $l)) { $diff += "+ $l" } }
[System.IO.File]::WriteAllText((Join-Path $tmpRoot "diff.txt"), (($diff -join "`r`n") + "`r`n"), $enc)
- Write-Host "[АКТУАЛИЗИРОВАН-ЧАСТИЧНО] &ИзменениеИКонтроль(`"$MethodName`")"
- Write-Host " Перенесено автоматически, конфликтов: $($disputed.Count) (помечены // [РЕСИНК-КОНФЛИКТ])"
- Write-Host " Файлы-версии для анализа:"
+ Write-Host "[АКТУАЛИЗИРОВАН-ЧАСТИЧНО] &ИзменениеИКонтроль(`"$MethodName`") — перенесено: $($transferred.Count), конфликтов: $($disputed.Count)"
+ Write-TransferSummary $transferred
+ Write-Host " Конфликтные блоки помечены // [РЕСИНК-КОНФЛИКТ] — разместите вручную."
+ Write-Host " Merge-воркспейс (base/local/remote/merged/diff):"
Write-Host " $tmpRoot"
- Write-Host " Проверьте конфликтные блоки и разместите их вручную."
} else {
- Write-Host "[АКТУАЛИЗИРОВАН] &ИзменениеИКонтроль(`"$MethodName`") — тело обновлено по новому оригиналу, правки перенесены."
+ Write-Host "[АКТУАЛИЗИРОВАН] &ИзменениеИКонтроль(`"$MethodName`") — тело обновлено, перенесено правок: $($transferred.Count)"
+ Write-TransferSummary $transferred
}
Write-Host " Файл: $extBsl"
exit 0
diff --git a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py
index f8f33efb..8a4f6b36 100644
--- a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py
+++ b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# cfe-patch-method v2.0 — Source-aware method interceptor for 1C extension (CFE)
+# cfe-patch-method v2.1 — Source-aware method interceptor for 1C extension (CFE)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -410,6 +410,57 @@ def find_unique_run(v2norm, keys):
return found
+def resolve_insertion_point(v2norm, before_lines, after_lines):
+ """Where an insertion lands in v2 using two-sided context.
+ Returns index to insert-after (-1 = top), or None if ambiguous/conflict."""
+ nb = len(before_lines)
+ na = len(after_lines)
+
+ # Tier A: adjacent pair (before[-1] then after[0] in v2), widening symmetrically
+ if nb >= 1 and na >= 1:
+ cands = [k for k in range(len(v2norm) - 1)
+ if v2norm[k] == before_lines[-1] and v2norm[k + 1] == after_lines[0]]
+ if len(cands) == 1:
+ return cands[0]
+ if len(cands) > 1:
+ w = 1
+ while len(cands) > 1 and (w < nb or w < na):
+ w += 1
+ filtered = []
+ for k in cands:
+ ok = True
+ if w <= nb:
+ if k - (w - 1) < 0 or v2norm[k - (w - 1)] != before_lines[nb - w]:
+ ok = False
+ if ok and w <= na:
+ if k + w >= len(v2norm) or v2norm[k + w] != after_lines[w - 1]:
+ ok = False
+ if ok:
+ filtered.append(k)
+ if not filtered:
+ break
+ cands = filtered
+ if len(cands) == 1:
+ return cands[0]
+ return None
+
+ # Tier B: one side changed -> single-side uniqueness
+ if nb >= 1:
+ bk = find_unique_index(v2norm, before_lines[-1])
+ if bk >= 0:
+ return bk
+ if na >= 1:
+ ak = find_unique_index(v2norm, after_lines[0])
+ if ak >= 0:
+ return ak - 1
+ return None
+
+
+def truncate(s, n=60):
+ t = s.strip()
+ return (t[:n] + "…") if len(t) > n else t
+
+
def die(msg):
print(msg, file=sys.stderr)
sys.exit(1)
@@ -677,23 +728,29 @@ def resync(ext_bsl, ext_lines, dup, method, method_name, module_path):
del_start = set()
del_end = set()
disputed = []
+ transferred = [] # for the summary: {"kind", "anchor"}
for op in ops:
if op["kind"] == "insert":
- if op["after"] < 0:
- insert_top.append(op["lines"])
- continue
- k = find_unique_index(v2norm, v1norm[op["after"]])
- if k >= 0:
- insert_after.setdefault(k, []).append(op["lines"])
- else:
+ after = op["after"]
+ before_lines = v1norm[max(0, after - 2):after + 1] if after >= 0 else []
+ after_lines = v1norm[after + 1:after + 4]
+ k = resolve_insertion_point(v2norm, before_lines, after_lines)
+ if k is None:
disputed.append({"kind": "insert", "lines": op["lines"]})
+ elif k < 0:
+ insert_top.append(op["lines"])
+ transferred.append({"kind": "insert", "anchor": "(в начало метода)"})
+ else:
+ insert_after.setdefault(k, []).append(op["lines"])
+ transferred.append({"kind": "insert", "anchor": v2[k]})
else:
keys = v1norm[op["start"]:op["end"] + 1]
p = find_unique_run(v2norm, keys)
if p >= 0:
del_start.add(p)
del_end.add(p + len(keys) - 1)
+ transferred.append({"kind": "delete", "anchor": op["lines"][0]})
else:
disputed.append({"kind": "delete", "lines": op["lines"]})
@@ -716,7 +773,7 @@ def resync(ext_bsl, ext_lines, dup, method, method_name, module_path):
if disputed:
new_body.append("\t// [РЕСИНК-КОНФЛИКТ] перенесите блоки ниже вручную — исходный якорь изменился в новой версии оригинала.")
- new_body.append("\t// Материалы для анализа см. в выводе команды (файлы v1/v2/current/diff).")
+ new_body.append("\t// Материалы для анализа см. в выводе команды (файлы base/local/remote/merged).")
for d in disputed:
if d["kind"] == "insert":
new_body.append("#Вставка")
@@ -747,14 +804,23 @@ def resync(ext_bsl, ext_lines, dup, method, method_name, module_path):
out.extend(ext_lines[block_end + 1:])
write_bsl(ext_bsl, out)
+ def print_transfer_summary(items):
+ for t in items:
+ if t["kind"] == "insert":
+ print(" • вставка после «%s»" % truncate(t["anchor"]))
+ else:
+ print(" • удаление «%s»" % truncate(t["anchor"]))
+
if disputed:
+ # merge workspace (git-mergetool convention: base/local/remote/merged)
safe = re.sub(r'[\\/:*?"<>|]', '_', module_path)
tmp_root = os.path.join(tempfile.gettempdir(), "cfe-resync", safe + "." + method_name)
os.makedirs(tmp_root, exist_ok=True)
- write_bsl(os.path.join(tmp_root, "v1.bsl"), v1)
- write_bsl(os.path.join(tmp_root, "v2.bsl"), v2)
- write_bsl(os.path.join(tmp_root, "current.bsl"), marked_body)
- diff = ["--- v1 (что было скопировано) vs v2 (новый оригинал) ---"]
+ write_bsl(os.path.join(tmp_root, "base.bsl"), v1)
+ write_bsl(os.path.join(tmp_root, "local.bsl"), marked_body)
+ write_bsl(os.path.join(tmp_root, "remote.bsl"), v2)
+ write_bsl(os.path.join(tmp_root, "merged.bsl"), new_block)
+ diff = ["--- base -> remote (что изменилось в оригинале) ---"]
for l in v1:
if normalize(l) not in v2norm:
diff.append("- " + l)
@@ -763,13 +829,16 @@ def resync(ext_bsl, ext_lines, dup, method, method_name, module_path):
diff.append("+ " + l)
write_bsl(os.path.join(tmp_root, "diff.txt"), diff)
- print('[АКТУАЛИЗИРОВАН-ЧАСТИЧНО] &ИзменениеИКонтроль("%s")' % method_name)
- print(" Перенесено автоматически, конфликтов: %d (помечены // [РЕСИНК-КОНФЛИКТ])" % len(disputed))
- print(" Файлы-версии для анализа:")
+ print('[АКТУАЛИЗИРОВАН-ЧАСТИЧНО] &ИзменениеИКонтроль("%s") — перенесено: %d, конфликтов: %d'
+ % (method_name, len(transferred), len(disputed)))
+ print_transfer_summary(transferred)
+ print(" Конфликтные блоки помечены // [РЕСИНК-КОНФЛИКТ] — разместите вручную.")
+ print(" Merge-воркспейс (base/local/remote/merged/diff):")
print(" %s" % tmp_root)
- print(" Проверьте конфликтные блоки и разместите их вручную.")
else:
- print('[АКТУАЛИЗИРОВАН] &ИзменениеИКонтроль("%s") — тело обновлено по новому оригиналу, правки перенесены.' % method_name)
+ print('[АКТУАЛИЗИРОВАН] &ИзменениеИКонтроль("%s") — тело обновлено, перенесено правок: %d'
+ % (method_name, len(transferred)))
+ print_transfer_summary(transferred)
print(" Файл: %s" % ext_bsl)
diff --git a/tests/skills/cases/cfe-patch-method/resync-conflict.json b/tests/skills/cases/cfe-patch-method/resync-conflict.json
index 8ca4cd52..d7e76d26 100644
--- a/tests/skills/cases/cfe-patch-method/resync-conflict.json
+++ b/tests/skills/cases/cfe-patch-method/resync-conflict.json
@@ -1,5 +1,5 @@
{
- "name": "Ресинк ИзменениеИКонтроль: изменился якорь вставки (конфликт)",
+ "name": "Ресинк ИзменениеИКонтроль: окружающий блок исчез (настоящий конфликт)",
"preRun": [
{
"script": "meta-compile/scripts/meta-compile",
@@ -9,7 +9,7 @@
{
"writeFile": {
"path": "CommonModules/РесинкКонфл/Ext/Module.bsl",
- "content": "#Область ПрограммныйИнтерфейс\n\nФункция Расчёт(А, Б) Экспорт\n\tИтог = 0.00;\n\tИтог = А + Б;\n\tИтог = ОкруглитьВверх(Итог);\n\tВозврат Итог;\nКонецФункции\n\n#КонецОбласти\n"
+ "content": "#Область ПрограммныйИнтерфейс\n\nФункция Расчёт(А, Б) Экспорт\n\tВозврат 0;\nКонецФункции\n\n#КонецОбласти\n"
}
},
{
@@ -23,7 +23,7 @@
{
"writeFile": {
"path": "ext/CommonModules/РесинкКонфл/Ext/Module.bsl",
- "content": "#Область ПрограммныйИнтерфейс\n&ИзменениеИКонтроль(\"Расчёт\")\nФункция Тест_Расчёт(А, Б)\n\tИтог = 0;\n#Вставка\n\tИтог = 999;\n#КонецВставки\n\tИтог = А + Б;\n\tВозврат Итог;\nКонецФункции\n#КонецОбласти\n"
+ "content": "#Область ПрограммныйИнтерфейс\n&ИзменениеИКонтроль(\"Расчёт\")\nФункция Тест_Расчёт(А, Б)\n\tИтог = 0;\n\tДля Сч = 1 По А Цикл\n#Вставка\n\t\tИтог = Итог + Б;\n#КонецВставки\n\t\tИтог = Итог + 1;\n\tКонецЦикла;\n\tВозврат Итог;\nКонецФункции\n#КонецОбласти\n"
}
}
],
diff --git a/tests/skills/cases/cfe-patch-method/resync-reanchor.json b/tests/skills/cases/cfe-patch-method/resync-reanchor.json
new file mode 100644
index 00000000..2b9eb271
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/resync-reanchor.json
@@ -0,0 +1,37 @@
+{
+ "name": "Ресинк: generic строка перед вставкой — двусторонний якорь размещает автоматически",
+ "preRun": [
+ {
+ "script": "meta-compile/scripts/meta-compile",
+ "input": { "type": "CommonModule", "name": "РеанкорМод", "properties": { "Server": true } },
+ "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
+ },
+ {
+ "writeFile": {
+ "path": "CommonModules/РеанкорМод/Ext/Module.bsl",
+ "content": "#Область ПрограммныйИнтерфейс\n\nПроцедура П(Сп) Экспорт\n\tДля Каждого Э Из Сп Цикл\n\t\tЭ.Обработать();\n\tКонецЦикла;\n\tСообщить(\"A\");\n\tДля Каждого Э Из Сп Цикл\n\t\tЭ.Проверить(Истина);\n\tКонецЦикла;\nКонецПроцедуры\n\n#КонецОбласти\n"
+ }
+ },
+ {
+ "script": "cfe-init/scripts/cfe-init",
+ "args": { "-Name": "Тест", "-OutputDir": "{workDir}/ext", "-ConfigPath": "{workDir}" }
+ },
+ {
+ "script": "cfe-borrow/scripts/cfe-borrow",
+ "args": { "-ExtensionPath": "{workDir}/ext", "-ConfigPath": "{workDir}", "-Object": "CommonModule.РеанкорМод" }
+ },
+ {
+ "writeFile": {
+ "path": "ext/CommonModules/РеанкорМод/Ext/Module.bsl",
+ "content": "#Область ПрограммныйИнтерфейс\n&ИзменениеИКонтроль(\"П\")\nПроцедура Тест_П(Сп)\n\tДля Каждого Э Из Сп Цикл\n\t\tЭ.Обработать();\n\tКонецЦикла;\n#Вставка\n\tСообщить(\"вставка\");\n#КонецВставки\n\tСообщить(\"A\");\n\tДля Каждого Э Из Сп Цикл\n\t\tЭ.Проверить();\n\tКонецЦикла;\nКонецПроцедуры\n#КонецОбласти\n"
+ }
+ }
+ ],
+ "params": {
+ "extensionPath": "ext",
+ "modulePath": "CommonModule.РеанкорМод",
+ "methodName": "П",
+ "interceptorType": "ModificationAndControl"
+ },
+ "expect": { "stdoutContains": "перенесено правок:" }
+}
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/CommonModules/РесинкКонфл/Ext/Module.bsl b/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/CommonModules/РесинкКонфл/Ext/Module.bsl
index 18d1baed..a4ca73f3 100644
--- a/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/CommonModules/РесинкКонфл/Ext/Module.bsl
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/CommonModules/РесинкКонфл/Ext/Module.bsl
@@ -1,10 +1,7 @@
#Область ПрограммныйИнтерфейс
Функция Расчёт(А, Б) Экспорт
- Итог = 0.00;
- Итог = А + Б;
- Итог = ОкруглитьВверх(Итог);
- Возврат Итог;
+ Возврат 0;
КонецФункции
#КонецОбласти
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/Ext/CommonModules/РесинкКонфл/Ext/Module.bsl b/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/Ext/CommonModules/РесинкКонфл/Ext/Module.bsl
index f297bccc..06f77da8 100644
--- a/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/Ext/CommonModules/РесинкКонфл/Ext/Module.bsl
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-conflict/Ext/CommonModules/РесинкКонфл/Ext/Module.bsl
@@ -1,14 +1,11 @@
#Область ПрограммныйИнтерфейс
&ИзменениеИКонтроль("Расчёт")
Функция Тест_Расчёт(А, Б)
- Итог = 0.00;
- Итог = А + Б;
- Итог = ОкруглитьВверх(Итог);
- Возврат Итог;
+ Возврат 0;
// [РЕСИНК-КОНФЛИКТ] перенесите блоки ниже вручную — исходный якорь изменился в новой версии оригинала.
- // Материалы для анализа см. в выводе команды (файлы v1/v2/current/diff).
+ // Материалы для анализа см. в выводе команды (файлы base/local/remote/merged).
#Вставка
- Итог = 999;
+ Итог = Итог + Б;
#КонецВставки
КонецФункции
#КонецОбласти
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод.xml
new file mode 100644
index 00000000..72a3d4be
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ РеанкорМод
+
+
+ ru
+ Реанкор мод
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ DontUse
+
+
+
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод/Ext/Module.bsl b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод/Ext/Module.bsl
new file mode 100644
index 00000000..35dbbe38
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/CommonModules/РеанкорМод/Ext/Module.bsl
@@ -0,0 +1,13 @@
+#Область ПрограммныйИнтерфейс
+
+Процедура П(Сп) Экспорт
+ Для Каждого Э Из Сп Цикл
+ Э.Обработать();
+ КонецЦикла;
+ Сообщить("A");
+ Для Каждого Э Из Сп Цикл
+ Э.Проверить(Истина);
+ КонецЦикла;
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Configuration.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Configuration.xml
new file mode 100644
index 00000000..6600d990
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Configuration.xml
@@ -0,0 +1,252 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+ UUID-008
+ UUID-009
+
+
+ UUID-010
+ UUID-011
+
+
+ UUID-012
+ UUID-013
+
+
+ UUID-014
+ UUID-015
+
+
+
+ TestConfig
+
+
+ ru
+ TestConfig
+
+
+
+
+ Version8_3_24
+ ManagedApplication
+
+ PlatformApplication
+
+ Russian
+
+
+
+
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Biometrics
+ true
+
+
+ Location
+ false
+
+
+ BackgroundLocation
+ false
+
+
+ BluetoothPrinters
+ false
+
+
+ WiFiPrinters
+ false
+
+
+ Contacts
+ false
+
+
+ Calendars
+ false
+
+
+ PushNotifications
+ false
+
+
+ LocalNotifications
+ false
+
+
+ InAppPurchases
+ false
+
+
+ PersonalComputerFileExchange
+ false
+
+
+ Ads
+ false
+
+
+ NumberDialing
+ false
+
+
+ CallProcessing
+ false
+
+
+ CallLog
+ false
+
+
+ AutoSendSMS
+ false
+
+
+ ReceiveSMS
+ false
+
+
+ SMSLog
+ false
+
+
+ Camera
+ false
+
+
+ Microphone
+ false
+
+
+ MusicLibrary
+ false
+
+
+ PictureAndVideoLibraries
+ false
+
+
+ AudioPlaybackAndVibration
+ false
+
+
+ BackgroundAudioPlaybackAndVibration
+ false
+
+
+ InstallPackages
+ false
+
+
+ OSBackup
+ true
+
+
+ ApplicationUsageStatistics
+ false
+
+
+ BarcodeScanning
+ false
+
+
+ BackgroundAudioRecording
+ false
+
+
+ AllFilesAccess
+ false
+
+
+ Videoconferences
+ false
+
+
+ NFC
+ false
+
+
+ DocumentScanning
+ false
+
+
+ SpeechToText
+ false
+
+
+ Geofences
+ false
+
+
+ IncomingShareRequests
+ false
+
+
+ AllIncomingShareRequestsTypesProcessing
+ false
+
+
+
+
+
+ Normal
+
+
+ Language.Русский
+
+
+
+
+
+ Managed
+ NotAutoFree
+ DontUse
+ DontUse
+ TaxiEnableVersion8_2
+ DontUse
+ Version8_3_24
+
+
+
+ Русский
+ РеанкорМод
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/ClientApplicationInterface.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/ClientApplicationInterface.xml
new file mode 100644
index 00000000..3c1161b2
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/ClientApplicationInterface.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ UUID-002
+
+
+
+
+ UUID-004
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод.xml
new file mode 100644
index 00000000..a73c0d52
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+ Adopted
+ РеанкорМод
+
+ UUID-002
+ false
+ false
+ false
+ false
+ false
+ false
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод/Ext/Module.bsl b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод/Ext/Module.bsl
new file mode 100644
index 00000000..755428aa
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/CommonModules/РеанкорМод/Ext/Module.bsl
@@ -0,0 +1,15 @@
+#Область ПрограммныйИнтерфейс
+&ИзменениеИКонтроль("П")
+Процедура Тест_П(Сп)
+ Для Каждого Э Из Сп Цикл
+ Э.Обработать();
+ КонецЦикла;
+#Вставка
+ Сообщить("вставка");
+#КонецВставки
+ Сообщить("A");
+ Для Каждого Э Из Сп Цикл
+ Э.Проверить(Истина);
+ КонецЦикла;
+КонецПроцедуры
+#КонецОбласти
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Configuration.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Configuration.xml
new file mode 100644
index 00000000..5dffb5f7
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Configuration.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+ UUID-008
+ UUID-009
+
+
+ UUID-010
+ UUID-011
+
+
+ UUID-012
+ UUID-013
+
+
+ UUID-014
+ UUID-015
+
+
+
+ Adopted
+ Тест
+
+
+ ru
+ Тест
+
+
+
+ Customization
+ true
+ Тест_
+ Version8_3_24
+ ManagedApplication
+
+ PlatformApplication
+
+ Russian
+
+ Role.Тест_ОсновнаяРоль
+
+
+
+ Language.Русский
+
+
+
+
+
+ TaxiEnableVersion8_2
+
+
+ Русский
+ Тест_ОсновнаяРоль
+ РеанкорМод
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Languages/Русский.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Languages/Русский.xml
new file mode 100644
index 00000000..c21624f5
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Languages/Русский.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+ Adopted
+ Русский
+
+ UUID-002
+ ru
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Roles/Тест_ОсновнаяРоль.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Roles/Тест_ОсновнаяРоль.xml
new file mode 100644
index 00000000..ec9dfbaf
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Ext/Roles/Тест_ОсновнаяРоль.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ Тест_ОсновнаяРоль
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Languages/Русский.xml b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Languages/Русский.xml
new file mode 100644
index 00000000..37c60d78
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/resync-reanchor/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file