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 ed716b8ea..1cbc5965a 100644
--- a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.ps1
+++ b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.ps1
@@ -487,18 +487,25 @@ function Parse-MarkedBody {
while ($i -lt $bodyLines.Count) {
$kind = Get-BslMarkerKind $bodyLines[$i]
if ($kind -eq 'Insert') {
+ # Marker lines are kept verbatim: they carry the author's spelling, indent and — since
+ # a tail comment is legal — the note explaining the edit. Re-emitting a bare keyword
+ # would silently drop that note on -Actualize.
+ $open = $bodyLines[$i]
$ins = @()
$i++
while ($i -lt $bodyLines.Count -and (Get-BslMarkerKind $bodyLines[$i]) -ne 'EndInsert') { $ins += $bodyLines[$i]; $i++ }
+ $close = if ($i -lt $bodyLines.Count) { $bodyLines[$i] } else { $null }
$i++ # skip #КонецВставки
- $ops += @{ Kind = 'insert'; After = ($v1.Count - 1); Lines = $ins }
+ $ops += @{ Kind = 'insert'; After = ($v1.Count - 1); Lines = $ins; Open = $open; Close = $close }
} elseif ($kind -eq 'Delete') {
+ $open = $bodyLines[$i]
$startIdx = $v1.Count
$i++
$del = @()
while ($i -lt $bodyLines.Count -and (Get-BslMarkerKind $bodyLines[$i]) -ne 'EndDelete') { $del += $bodyLines[$i]; $v1 += $bodyLines[$i]; $i++ }
+ $close = if ($i -lt $bodyLines.Count) { $bodyLines[$i] } else { $null }
$i++ # skip #КонецУдаления
- $ops += @{ Kind = 'delete'; Start = $startIdx; End = ($v1.Count - 1); Lines = $del }
+ $ops += @{ Kind = 'delete'; Start = $startIdx; End = ($v1.Count - 1); Lines = $del; Open = $open; Close = $close }
} else {
$v1 += $bodyLines[$i]
$i++
@@ -715,7 +722,9 @@ function Write-ConflictFolder {
$md += "### Конфликт №$cn — вставка"
$md += "Как блок стоял в вашей версии (local):"
if ($d.Before -and $d.Before.Count -gt 0) { foreach ($l in $d.Before) { $md += $l } }
- $md += "#$($kw.Insert)"; foreach ($l in $d.Lines) { $md += $l }; $md += "#$($kw.EndInsert)"
+ $openLine = if ([string]::IsNullOrEmpty($d.Open)) { "#$($kw.Insert)" } else { $d.Open }
+ $closeLine = if ([string]::IsNullOrEmpty($d.Close)) { "#$($kw.EndInsert)" } else { $d.Close }
+ $md += $openLine; foreach ($l in $d.Lines) { $md += $l }; $md += $closeLine
if ($d.After -and $d.After.Count -gt 0) { foreach ($l in $d.After) { $md += $l } }
$md += ""
$md += "Якорь (строки вокруг #$($kw.Insert)) изменился/исчез в новом оригинале — блок не лёг автоматически (см. дифф base→remote ниже)."
@@ -809,14 +818,14 @@ function Invoke-Resync {
elseif ($null -eq $k) {
$dbefore = @(); if ($op.After -ge 0) { $bz = [Math]::Max(0, $op.After - 2); for ($z = $bz; $z -le $op.After; $z++) { $dbefore += $v1[$z] } }
$dafter = @(); $az = [Math]::Min($v1.Count - 1, $op.After + 3); for ($z = $op.After + 1; $z -le $az; $z++) { $dafter += $v1[$z] }
- $disputed += @{ Kind = 'insert'; Lines = $op.Lines; Before = $dbefore; After = $dafter }
+ $disputed += @{ Kind = 'insert'; Lines = $op.Lines; Open = $op.Open; Close = $op.Close; Before = $dbefore; After = $dafter }
}
- elseif ($k -lt 0) { $insertTop += ,$op.Lines; $transferred += @{ Kind = 'insert' } }
- else { if (-not $insertAfter.ContainsKey($k)) { $insertAfter[$k] = @() }; $insertAfter[$k] += ,$op.Lines; $transferred += @{ Kind = 'insert' } }
+ elseif ($k -lt 0) { $insertTop += $op; $transferred += @{ Kind = 'insert' } }
+ else { if (-not $insertAfter.ContainsKey($k)) { $insertAfter[$k] = @() }; $insertAfter[$k] += $op; $transferred += @{ Kind = 'insert' } }
} else {
$keys = @(); for ($m = $op.Start; $m -le $op.End; $m++) { $keys += $v1norm[$m] }
$p = Find-UniqueRun $v2norm $keys
- if ($p -ge 0) { $delStart[$p] = $true; $delEnd[$p + $keys.Count - 1] = $true; $transferred += @{ Kind = 'delete' } }
+ if ($p -ge 0) { $delStart[$p] = $op.Open; $delEnd[$p + $keys.Count - 1] = $op.Close; $transferred += @{ Kind = 'delete' } }
else {
# Nearest significant neighbours around the deleted block; adjacency in the significant
# projection means the block is already cut (blanks/comments left behind don't matter).
@@ -836,14 +845,16 @@ function Invoke-Resync {
return @{ Id = $methodId; Status = $st; ExtBsl = $extBsl; Transferred = $transferred.Count; Absorbed = $absorbed.Count; Disputed = $disputed.Count; Reason = $rsn; AbsorbedNotes = $absorbedNotes }
}
- # assemble new marked body
+ # assemble new marked body. Marker lines come back as they were read (Open/Close); the keyword
+ # form is only a fallback for a block whose closing marker the module never had.
+ $mk = { param($orig, [string]$key) if ([string]::IsNullOrEmpty($orig)) { "#$($kw[$key])" } else { $orig } }
$newBody = @()
- foreach ($blk in $insertTop) { $newBody += "#$($kw.Insert)"; foreach ($l in $blk) { $newBody += $l }; $newBody += "#$($kw.EndInsert)" }
+ foreach ($blk in $insertTop) { $newBody += (& $mk $blk.Open 'Insert'); foreach ($l in $blk.Lines) { $newBody += $l }; $newBody += (& $mk $blk.Close 'EndInsert') }
for ($k = 0; $k -lt $v2.Count; $k++) {
- if ($delStart.ContainsKey($k)) { $newBody += "#$($kw.Delete)" }
+ if ($delStart.ContainsKey($k)) { $newBody += (& $mk $delStart[$k] 'Delete') }
$newBody += $v2[$k]
- if ($delEnd.ContainsKey($k)) { $newBody += "#$($kw.EndDelete)" }
- if ($insertAfter.ContainsKey($k)) { foreach ($blk in $insertAfter[$k]) { $newBody += "#$($kw.Insert)"; foreach ($l in $blk) { $newBody += $l }; $newBody += "#$($kw.EndInsert)" } }
+ if ($delEnd.ContainsKey($k)) { $newBody += (& $mk $delEnd[$k] 'EndDelete') }
+ if ($insertAfter.ContainsKey($k)) { foreach ($blk in $insertAfter[$k]) { $newBody += (& $mk $blk.Open 'Insert'); foreach ($l in $blk.Lines) { $newBody += $l }; $newBody += (& $mk $blk.Close 'EndInsert') } }
}
if ($disputed.Count -gt 0) {
$newBody += "`t// [РЕСИНК-КОНФЛИКТ] блоки ниже не легли автоматически — перенесите вручную (по № см. conflict.md / index.md в merge-воркспейсе, путь в выводе)."
@@ -852,7 +863,7 @@ function Invoke-Resync {
$cn++
if ($d.Kind -eq 'insert') {
$newBody += "`t// [РЕСИНК-КОНФЛИКТ №$cn] вставка — исходный якорь изменён в новом оригинале."
- $newBody += "#$($kw.Insert)"; foreach ($l in $d.Lines) { $newBody += $l }; $newBody += "#$($kw.EndInsert)"
+ $newBody += (& $mk $d.Open 'Insert'); foreach ($l in $d.Lines) { $newBody += $l }; $newBody += (& $mk $d.Close 'EndInsert')
}
else {
$newBody += "`t// [РЕСИНК-КОНФЛИКТ №$cn] удаление — строки не найдены в новом оригинале:"
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 6f2c67d67..e29c4f003 100644
--- a/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py
+++ b/.claude/skills/cfe-patch-method/scripts/cfe-patch-method.py
@@ -616,14 +616,21 @@ def parse_marked_body(body_lines):
while i < n:
kind = bsl_marker_kind(body_lines[i])
if kind == "Insert":
+ # Marker lines are kept verbatim: they carry the author's spelling, indent and — since
+ # a tail comment is legal — the note explaining the edit. Re-emitting a bare keyword
+ # would silently drop that note on -Actualize.
+ open_line = body_lines[i]
ins = []
i += 1
while i < n and bsl_marker_kind(body_lines[i]) != "EndInsert":
ins.append(body_lines[i])
i += 1
+ close_line = body_lines[i] if i < n else None
i += 1
- ops.append({"kind": "insert", "after": len(v1) - 1, "lines": ins})
+ ops.append({"kind": "insert", "after": len(v1) - 1, "lines": ins,
+ "open": open_line, "close": close_line})
elif kind == "Delete":
+ open_line = body_lines[i]
start_idx = len(v1)
i += 1
dels = []
@@ -631,8 +638,10 @@ def parse_marked_body(body_lines):
dels.append(body_lines[i])
v1.append(body_lines[i])
i += 1
+ close_line = body_lines[i] if i < n else None
i += 1
- ops.append({"kind": "delete", "start": start_idx, "end": len(v1) - 1, "lines": dels})
+ ops.append({"kind": "delete", "start": start_idx, "end": len(v1) - 1, "lines": dels,
+ "open": open_line, "close": close_line})
else:
v1.append(body_lines[i])
i += 1
@@ -1207,7 +1216,8 @@ def write_conflict_folder(folder, method_id, ext_bsl, existing_name, method, v1,
if d.get("before"):
for l in d["before"]:
md.append(l)
- md.append("#" + kw["Insert"]); md.extend(d["lines"]); md.append("#" + kw["EndInsert"])
+ md.append(d.get("open") or ("#" + kw["Insert"])); md.extend(d["lines"])
+ md.append(d.get("close") or ("#" + kw["EndInsert"]))
if d.get("after"):
for l in d["after"]:
md.append(l)
@@ -1280,7 +1290,7 @@ def resync_one(ext_bsl, ext_lines, dup, method, logical_module, conflict_folder,
if not params_drift and control_key(v1) == control_key(v2):
return {"id": method_id, "status": "АКТУАЛЕН", "ext_bsl": ext_bsl}
- insert_top = []; insert_after = {}; del_start = set(); del_end = set(); disputed = []; transferred = 0; absorbed = 0; absorbed_notes = []
+ insert_top = []; insert_after = {}; del_start = {}; del_end = {}; disputed = []; transferred = 0; absorbed = 0; absorbed_notes = []
v2sig, v2map = significant_projection(v2norm)
for op in ops:
if op["kind"] == "insert":
@@ -1306,16 +1316,17 @@ def resync_one(ext_bsl, ext_lines, dup, method, logical_module, conflict_folder,
elif k is None:
dbefore = v1[max(0, after - 2):after + 1] if after >= 0 else []
dafter = v1[after + 1:after + 4]
- disputed.append({"kind": "insert", "lines": op["lines"], "before": dbefore, "after": dafter})
+ disputed.append({"kind": "insert", "lines": op["lines"], "open": op.get("open"),
+ "close": op.get("close"), "before": dbefore, "after": dafter})
elif k < 0:
- insert_top.append(op["lines"]); transferred += 1
+ insert_top.append(op); transferred += 1
else:
- insert_after.setdefault(k, []).append(op["lines"]); transferred += 1
+ insert_after.setdefault(k, []).append(op); transferred += 1
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 += 1
+ del_start[p] = op.get("open"); del_end[p + len(keys) - 1] = op.get("close"); transferred += 1
else:
# Nearest significant neighbours; adjacency in the significant projection means the
# block is already cut (blanks/comments left behind don't matter).
@@ -1347,18 +1358,25 @@ def resync_one(ext_bsl, ext_lines, dup, method, logical_module, conflict_folder,
return {"id": method_id, "status": st, "ext_bsl": ext_bsl, "transferred": transferred,
"absorbed": absorbed, "disputed": len(disputed), "reason": rsn, "absorbed_notes": absorbed_notes}
+ # Marker lines come back as they were read (open/close); the keyword form is only a fallback
+ # for a block whose closing marker the module never had.
+ def mk(orig, key):
+ return ("#" + kw[key]) if not orig else orig
+
new_body = []
for blk in insert_top:
- new_body.append("#" + kw["Insert"]); new_body.extend(blk); new_body.append("#" + kw["EndInsert"])
+ new_body.append(mk(blk.get("open"), "Insert")); new_body.extend(blk["lines"])
+ new_body.append(mk(blk.get("close"), "EndInsert"))
for k in range(len(v2)):
if k in del_start:
- new_body.append("#" + kw["Delete"])
+ new_body.append(mk(del_start[k], "Delete"))
new_body.append(v2[k])
if k in del_end:
- new_body.append("#" + kw["EndDelete"])
+ new_body.append(mk(del_end[k], "EndDelete"))
if k in insert_after:
for blk in insert_after[k]:
- new_body.append("#" + kw["Insert"]); new_body.extend(blk); new_body.append("#" + kw["EndInsert"])
+ new_body.append(mk(blk.get("open"), "Insert")); new_body.extend(blk["lines"])
+ new_body.append(mk(blk.get("close"), "EndInsert"))
if disputed:
new_body.append("\t// [РЕСИНК-КОНФЛИКТ] блоки ниже не легли автоматически — перенесите вручную (по № см. conflict.md / index.md в merge-воркспейсе, путь в выводе).")
cn = 0
@@ -1366,7 +1384,8 @@ def resync_one(ext_bsl, ext_lines, dup, method, logical_module, conflict_folder,
cn += 1
if d["kind"] == "insert":
new_body.append("\t// [РЕСИНК-КОНФЛИКТ №%d] вставка — исходный якорь изменён в новом оригинале." % cn)
- new_body.append("#" + kw["Insert"]); new_body.extend(d["lines"]); new_body.append("#" + kw["EndInsert"])
+ new_body.append(mk(d.get("open"), "Insert")); new_body.extend(d["lines"])
+ new_body.append(mk(d.get("close"), "EndInsert"))
else:
new_body.append("\t// [РЕСИНК-КОНФЛИКТ №%d] удаление — строки не найдены в новом оригинале:" % cn)
for l in d["lines"]:
diff --git a/.claude/skills/cfe-validate/scripts/cfe-validate.ps1 b/.claude/skills/cfe-validate/scripts/cfe-validate.ps1
index c489e2fe4..2156b3985 100644
--- a/.claude/skills/cfe-validate/scripts/cfe-validate.ps1
+++ b/.claude/skills/cfe-validate/scripts/cfe-validate.ps1
@@ -1338,7 +1338,7 @@ function Get-BslKeywords {
# --- Breadcrumb: controlled methods (&ИзменениеИКонтроль) drift is not checked here ---
$extRootDir = Split-Path $resolvedPath -Parent
$ctrlKw = Get-BslKeywords
-$ctrlRe = '(?m)^\s*&(?:' + $ctrlKw.ru.Control + '|' + $ctrlKw.en.Control + ')\('
+$ctrlRe = '(?im)^\s*&(?:' + $ctrlKw.ru.Control + '|' + $ctrlKw.en.Control + ')\('
$ctrlCount = 0
foreach ($bslFile in (Get-ChildItem -Path $extRootDir -Recurse -Filter *.bsl -File -ErrorAction SilentlyContinue)) {
$txt = [System.IO.File]::ReadAllText($bslFile.FullName, [System.Text.Encoding]::UTF8)
diff --git a/.claude/skills/cfe-validate/scripts/cfe-validate.py b/.claude/skills/cfe-validate/scripts/cfe-validate.py
index 86f0e9d1e..38748c686 100644
--- a/.claude/skills/cfe-validate/scripts/cfe-validate.py
+++ b/.claude/skills/cfe-validate/scripts/cfe-validate.py
@@ -1304,7 +1304,7 @@ def main():
# --- Breadcrumb: controlled methods (&ИзменениеИКонтроль) drift is not checked here ---
ctrl_kw = bsl_keywords()
- ctrl_re = re.compile(r'^\s*&(?:' + ctrl_kw["ru"]["Control"] + '|' + ctrl_kw["en"]["Control"] + r')\(')
+ ctrl_re = re.compile(r'^\s*&(?:' + ctrl_kw["ru"]["Control"] + '|' + ctrl_kw["en"]["Control"] + r')\(', re.IGNORECASE)
ctrl_count = 0
for dp, _dn, files in os.walk(config_dir):
for fn in files:
diff --git a/tests/skills/cases/cfe-patch-method/actualize-marker-tail-comment.json b/tests/skills/cases/cfe-patch-method/actualize-marker-tail-comment.json
new file mode 100644
index 000000000..e0a887809
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/actualize-marker-tail-comment.json
@@ -0,0 +1,33 @@
+{
+ "name": "-Actualize: комментарий на строке маркера не теряется при перезаписи блока",
+ "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Спр.Записать();\n\tЗаписатьЖурнал();\n\tЗафиксироватьТранзакцию();\nКонецПроцедуры\n\n#КонецОбласти\n"
+ }
+ },
+ {
+ "script": "cfe-init/scripts/cfe-init",
+ "args": { "-Name": "Тест", "-OutputDir": "{workDir}/cfe", "-ConfigPath": "{workDir}" }
+ },
+ {
+ "script": "cfe-borrow/scripts/cfe-borrow",
+ "args": { "-ExtensionPath": "{workDir}/cfe", "-ConfigPath": "{workDir}", "-Object": "CommonModule.ХвостМод" }
+ },
+ {
+ "writeFile": {
+ "path": "cfe/CommonModules/ХвостМод/Ext/Module.bsl",
+ "content": "#Область ПрограммныйИнтерфейс\n&ИзменениеИКонтроль(\"Записать\")\nПроцедура Тест_Записать(Спр)\n\tНачатьТранзакцию();\n\tСпр.Записать();\n#Вставка // проверка прав, ТЗ-142\n\tПроверитьПрава(Спр);\n#КонецВставки // конец проверки прав\n\tЗафиксироватьТранзакцию();\nКонецПроцедуры\n#КонецОбласти\n"
+ }
+ }
+ ],
+ "params": { "extensionPath": "cfe" },
+ "args_extra": ["-Actualize"],
+ "expect": { "stdoutContains": "актуализировано: 1" }
+}
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/CommonModules/ХвостМод.xml b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/CommonModules/ХвостМод.xml
new file mode 100644
index 000000000..7e61d98c1
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/CommonModules/ХвостМод.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ ХвостМод
+
+
+ ru
+ Хвост мод
+
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ false
+ DontUse
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/CommonModules/ХвостМод/Ext/Module.bsl b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/CommonModules/ХвостМод/Ext/Module.bsl
new file mode 100644
index 000000000..c547bb1d5
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/CommonModules/ХвостМод/Ext/Module.bsl
@@ -0,0 +1,10 @@
+#Область ПрограммныйИнтерфейс
+
+Процедура Записать(Спр) Экспорт
+ НачатьТранзакцию();
+ Спр.Записать();
+ ЗаписатьЖурнал();
+ ЗафиксироватьТранзакцию();
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/Configuration.xml b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/Configuration.xml
new file mode 100644
index 000000000..22c3f67fa
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/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/actualize-marker-tail-comment/Ext/ClientApplicationInterface.xml b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/Ext/ClientApplicationInterface.xml
new file mode 100644
index 000000000..3c1161b2d
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/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/actualize-marker-tail-comment/Languages/Русский.xml b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/Languages/Русский.xml
new file mode 100644
index 000000000..37c60d786
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/CommonModules/ХвостМод.xml b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/CommonModules/ХвостМод.xml
new file mode 100644
index 000000000..12debb939
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/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/actualize-marker-tail-comment/cfe/CommonModules/ХвостМод/Ext/Module.bsl b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/CommonModules/ХвостМод/Ext/Module.bsl
new file mode 100644
index 000000000..2f430f5c7
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/CommonModules/ХвостМод/Ext/Module.bsl
@@ -0,0 +1,12 @@
+#Область ПрограммныйИнтерфейс
+&ИзменениеИКонтроль("Записать")
+Процедура Тест_Записать(Спр)
+ НачатьТранзакцию();
+ Спр.Записать();
+#Вставка // проверка прав, ТЗ-142
+ ПроверитьПрава(Спр);
+#КонецВставки // конец проверки прав
+ ЗаписатьЖурнал();
+ ЗафиксироватьТранзакцию();
+КонецПроцедуры
+#КонецОбласти
diff --git a/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/Configuration.xml b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/Configuration.xml
new file mode 100644
index 000000000..dbf074f68
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/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/actualize-marker-tail-comment/cfe/Languages/Русский.xml b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/Languages/Русский.xml
new file mode 100644
index 000000000..c21624f52
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/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/actualize-marker-tail-comment/cfe/Roles/Тест_ОсновнаяРоль.xml b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/Roles/Тест_ОсновнаяРоль.xml
new file mode 100644
index 000000000..ec9dfbaf6
--- /dev/null
+++ b/tests/skills/cases/cfe-patch-method/snapshots/actualize-marker-tail-comment/cfe/Roles/Тест_ОсновнаяРоль.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ Тест_ОсновнаяРоль
+
+
+
+
+
\ No newline at end of file