diff --git a/.claude/skills/help-add/scripts/add-help.ps1 b/.claude/skills/help-add/scripts/add-help.ps1
index 053c5c283..54689ff56 100644
--- a/.claude/skills/help-add/scripts/add-help.ps1
+++ b/.claude/skills/help-add/scripts/add-help.ps1
@@ -1,4 +1,4 @@
-# help-add v1.20 — Add built-in help to 1C object (+write_xml_file/write_utf8_bom: общий эталон записи)
+# help-add v1.21 — Add built-in help to 1C object (+write_xml_file/write_utf8_bom: общий эталон записи)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -184,6 +184,17 @@ if (-not (Test-Path $extDir)) {
exit 1
}
+# Код языка идёт и в текст XML, и в имя файла страницы, поэтому проверяем его до записи:
+# пустое значение дало бы файл «.html» и пустой , а разделитель пути —
+# запись мимо каталога Ext/Help. Оба отказа платформы были бы тихими.
+#
+# Копия этой проверки есть в template-add (навыки автономны, формат «дескриптор +
+# страница» у них общий). Держать копии одинаковыми — сознательно.
+if ($Lang -notmatch '^[A-Za-z0-9_-]+$') {
+ Write-Error "Недопустимый код языка: '$Lang'`nОжидается код вида ru, en (буквы, цифры, дефис, подчёркивание)"
+ exit 1
+}
+
$helpXmlPath = Join-Path $extDir "Help.xml"
if (Test-Path $helpXmlPath) {
Write-Error "Справка уже существует: $helpXmlPath"
diff --git a/.claude/skills/help-add/scripts/add-help.py b/.claude/skills/help-add/scripts/add-help.py
index 6873d2f90..a4639f7ee 100644
--- a/.claude/skills/help-add/scripts/add-help.py
+++ b/.claude/skills/help-add/scripts/add-help.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# help-add v1.20 — Add built-in help to 1C object (+write_xml_file/write_utf8_bom: общий эталон записи)
+# help-add v1.21 — Add built-in help to 1C object (+write_xml_file/write_utf8_bom: общий эталон записи)
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -329,6 +329,17 @@ def main():
print(f"Каталог объекта не найден: {ext_dir}. Проверьте путь ObjectName (например Catalogs/МойСправочник).", file=sys.stderr)
sys.exit(1)
+ # Код языка идёт и в текст XML, и в имя файла страницы, поэтому проверяем его до записи:
+ # пустое значение дало бы файл «.html» и пустой , а разделитель пути —
+ # запись мимо каталога Ext/Help. Оба отказа платформы были бы тихими.
+ #
+ # Копия этой проверки есть в template-add (навыки автономны, формат «дескриптор +
+ # страница» у них общий). Держать копии одинаковыми — сознательно.
+ if not re.match(r"^[A-Za-z0-9_-]+$", lang):
+ print(f"Недопустимый код языка: '{lang}'", file=sys.stderr)
+ print("Ожидается код вида ru, en (буквы, цифры, дефис, подчёркивание)", file=sys.stderr)
+ sys.exit(1)
+
help_xml_path = os.path.join(ext_dir, "Help.xml")
if os.path.exists(help_xml_path):
print(f"Справка уже существует: {help_xml_path}", file=sys.stderr)
diff --git a/tests/skills/cases/help-add/lang-invalid.json b/tests/skills/cases/help-add/lang-invalid.json
new file mode 100644
index 000000000..57aeee00e
--- /dev/null
+++ b/tests/skills/cases/help-add/lang-invalid.json
@@ -0,0 +1,20 @@
+{
+ "name": "Недопустимый код языка отвергается до записи",
+ "preRun": [
+ {
+ "script": "epf-init/scripts/init",
+ "args": {
+ "-Name": "МояОбработка",
+ "-SrcDir": "{workDir}"
+ }
+ }
+ ],
+ "params": {
+ "objectName": "МояОбработка"
+ },
+ "args_extra": [
+ "-Lang",
+ "../evil"
+ ],
+ "expectError": "Недопустимый код языка"
+}