feat(db-repo): подсказки по отказам подключения, смоук каскадных операций

Административные и сервисные команды собирались по документации, а вживую
гонялись сырыми вызовами платформы — сборка аргументов навыком не проверялась.
Прогон через навык показал, что работают dump-cfg (включая -Version), set-label,
add-user, clear-cache во всех областях, optimize, copy-users, create -NoBind.

Нашлись два тупика подряд при переподключении базы: платформа сначала отвергает
непустую конфигурацию, а после -ForceReplaceCfg — то, что за пользователем
хранилища уже числится эта база. Оба раза действие не называется. Добавлены
подсказки на оба сообщения, сценарий описан в references/connect.md.

Заодно постусловие update сработало на настоящей аварии: после неудачного
переподключения база осталась отключённой, и команда отказалась вместо тихой
замены конфигурации.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-23 13:36:42 +03:00
co-authored by Claude Opus 5
parent e64c48cdfd
commit 8faa1f77c0
3 changed files with 25 additions and 3 deletions
@@ -13,6 +13,10 @@ powershell.exe -NoProfile -File "${CLAUDE_SKILL_DIR}/scripts/db-repo.ps1" -Comma
На пустой базе `-ForceReplaceCfg` не нужен.
**Переподключение** базы, которая уже была подключена, обычно требует обоих флагов: конфигурация
в базе не пустая (`-ForceReplaceCfg`), а за пользователем хранилища всё ещё числится эта база
(`-ForceBindAlreadyBindedUser`). Навык подсказывает оба по сообщению платформы.
После подключения добавь `repository` в запись базы в `.v8-project.json` — иначе остальные
подкоманды придётся каждый раз звать с явными реквизитами, а `update` откажется работать.
+11 -1
View File
@@ -1,4 +1,4 @@
# db-repo v1.5 — 1C configuration repository operations
# db-repo v1.6 — 1C configuration repository operations
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# NB: движок только 1cv8 — ibcmd работу с хранилищем не поддерживает (нет такого режима).
<#
@@ -968,6 +968,16 @@ function Write-RepoVerdict {
default {
if ($PlatformExit -ne 0) {
Write-Host "Команда '$Cmd' завершилась с ошибкой (код $PlatformExit)$(Get-ExitAnnotation $PlatformExit)" -ForegroundColor Red
# Подключение базы, у которой конфигурация уже есть, платформа отклоняет без
# подсказки — а действие ровно одно, и оно необратимо.
if ($Log.Raw -match 'связанная с данным хранилищем') {
Write-Host "[hint] за этим пользователем хранилища уже числится другая база." -ForegroundColor Yellow
Write-Host " Подключить всё равно — -ForceBindAlreadyBindedUser." -ForegroundColor Yellow
}
if ($Log.Raw -match 'Конфигурация не пустая') {
Write-Host "[hint] в базе уже есть конфигурация. Замена её конфигурацией из хранилища —" -ForegroundColor Yellow
Write-Host " -ForceReplaceCfg. Операция необратима: спросите подтверждение у пользователя." -ForegroundColor Yellow
}
return 1
}
Write-Host "Команда '$Cmd' выполнена." -ForegroundColor Green
+10 -2
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# db-repo v1.5 — 1C configuration repository operations
# db-repo v1.6 — 1C configuration repository operations
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
# NB: движок только 1cv8 — ibcmd работу с хранилищем не поддерживает (нет такого режима).
"""Работа с хранилищем конфигурации 1С.
@@ -558,7 +558,7 @@ def read_repo_log(log_text):
r = {
"locked": [], "locked_by_other": [], "received": [], "committed": [],
"unchanged": [], "unlocked": [], "not_locked": [], "modified": [], "missing": [],
"has_operation_block": False,
"has_operation_block": False, "raw": log_text,
}
if not log_text:
return r
@@ -852,6 +852,14 @@ def write_repo_verdict(cmd, log, platform_exit, requested, report_format="", out
if platform_exit != 0:
print("Команда '%s' завершилась с ошибкой (код %s)%s"
% (cmd, platform_exit, describe_exit(platform_exit)))
# Подключение базы, у которой конфигурация уже есть, платформа отклоняет без
# подсказки — а действие ровно одно, и оно необратимо.
if "связанная с данным хранилищем" in (log.get("raw") or ""):
print("[hint] за этим пользователем хранилища уже числится другая база.")
print(" Подключить всё равно — -ForceBindAlreadyBindedUser.")
if "Конфигурация не пустая" in (log.get("raw") or ""):
print("[hint] в базе уже есть конфигурация. Замена её конфигурацией из хранилища —")
print(" -ForceReplaceCfg. Операция необратима: спросите подтверждение у пользователя.")
return 1
print("Команда '%s' выполнена." % cmd)
if cmd == "report" and report_format == "txt" and os.path.exists(output_file):