feat(db-*,epf-*,erf-*,web-publish): v8path на уровне записи базы

В одном проекте базы могут жить на разных версиях платформы, а версию формата
XML-выгрузки задаёт та платформа, которая выгружает: без выбора платформы по базе
срабатывает автопоиск и берёт самую старшую установленную — то есть самый новый
формат, который коллега на младшей платформе уже не загрузит.

Теперь порядок такой: явный -V8Path -> v8path записи базы -> корневой v8path ->
автопоиск. Запись базы ищет сам скрипт тем же матчем, которым добывал реквизиты
хранилища (Find-ProjectDatabase): файловую по path, серверную по server + ref.

- в 9 навыков, где матча не было, скопирован блок из авторитета db-repo;
- списки потребителей трёх семей в check-inline-drift расширены; заведена семья
  platform: resolve_v8path — обёртка меняла сигнатуру, а под гардом не была;
- раннер подставляет {workDir}/{fakePlatform} и в содержимое preRun.writeFile,
  иначе кейс про выбор платформы нельзя написать кроссплатформенно;
- в SKILL.md платформа теперь берётся ПОСЛЕ разрешения базы, строка про
  автоопределение через Program Files убрана как деталь реализации.

Живой прогон: две базы в одном проекте при корневом v8path = 8.5 дали формат
2.17 (8.3.24) и 2.20 (8.3.27), оба порта.

Closes #93

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-09-19 20:35:20 +03:00
co-authored by Claude Opus 5
parent 303db4e9f9
commit 874ae650ca
56 changed files with 1249 additions and 193 deletions
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
# db-load-git v1.26 — Load Git changes into 1C database
# db-load-git v1.27 — Load Git changes into 1C database
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -37,8 +37,15 @@ def ci_parse_args(parser, argv=None):
def _find_project_v8path():
"""Walk up from CWD to find .v8-project.json and read its v8path."""
def _find_project_v8path(args):
"""Walk up from CWD to find .v8-project.json and read its v8path.
v8path записи базы сильнее корневого: в одном проекте базы живут на разных версиях
платформы, а версию формата выгрузки задаёт та платформа, которая выгружает.
"""
db = find_project_database(args)
if db and db.get("v8path"):
return db["v8path"]
d = os.getcwd()
while True:
pf = os.path.join(d, ".v8-project.json")
@@ -87,9 +94,10 @@ V8_SECRET_KEYS = ["/P", "/UC", "/WSP", "/AWSP", "/ConfigurationRepositoryP"]
IBCMD_SECRET_KEYS = ["--password", "--token", "--db-pwd"]
# --- Реквизиты хранилища из .v8-project.json ---
# Модель их не передаёт: скрипт сопоставляет параметры соединения с записью в databases[]
# и берёт repository оттуда. Тот же приём, что в cf-edit.py (сопоставление по configSrc).
# --- Запись базы в .v8-project.json ---
# Модель не передаёт ни путь к платформе конкретной базы, ни реквизиты хранилища: скрипт
# сопоставляет параметры соединения с записью в databases[] и берёт их оттуда. Тот же приём,
# что в cf-edit.py (сопоставление по configSrc).
def _sg_find_v8project(start_dir):
d = start_dir
for _ in range(20):
@@ -349,10 +357,10 @@ def _version_key(p):
return [int(x) for x in re.findall(r"\d+", _version_dir(p))]
def resolve_v8path(v8path):
def resolve_v8path(v8path, args):
"""Resolve path to a 1C executable (1cv8; ibcmd only when given explicitly)."""
if not v8path:
v8path = _find_project_v8path()
v8path = _find_project_v8path(args)
if not v8path:
if os.name == "nt":
candidates = (
@@ -714,7 +722,7 @@ def main():
# --- Resolve V8Path (skip if DryRun) ---
v8path = None
if not args.DryRun:
v8path = resolve_v8path(args.V8Path)
v8path = resolve_v8path(args.V8Path, args)
# --- Detect engine + validate connection (skip if DryRun) ---
engine = "1cv8"