From 52875b4deaef3a65535059f6ddc864882be132c9 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 15 Feb 2026 17:26:50 +0300 Subject: [PATCH 1/7] Expand build-spec.md to full 1C Designer batch mode reference MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cover configuration operations (CF, XML dump/load, partial load), DB update, enterprise mode, connection params, authentication, ConfigDumpInfo.xml — verified against vendor docs and real scripts. Co-Authored-By: Claude Opus 4.6 --- docs/build-spec.md | 344 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 316 insertions(+), 28 deletions(-) diff --git a/docs/build-spec.md b/docs/build-spec.md index ebcb1c5c..01880a65 100644 --- a/docs/build-spec.md +++ b/docs/build-spec.md @@ -1,12 +1,273 @@ -# Сборка и разборка внешних обработок 1С (EPF/ERF) +# Пакетный режим конфигуратора 1С ## Общие сведения -Конфигуратор 1С:Предприятия 8.3 поддерживает пакетный режим для сборки `.epf`/`.erf` файлов из XML-исходников и обратной разборки. Это позволяет хранить исходники в Git и собирать бинарные файлы по необходимости. +Конфигуратор 1С:Предприятия 8.3 поддерживает пакетный (безоконный) режим для автоматизации операций с конфигурациями, информационными базами и внешними обработками. Все операции выполняются через командную строку `1cv8.exe`. -**Требования**: для работы команд необходимо подключение к информационной базе (может быть пустой). +**Два режима запуска:** -## Команды +| Режим | Назначение | +|-------|-----------| +| `DESIGNER` | Конфигуратор — работа с конфигурацией, сборка EPF, обновление БД | +| `ENTERPRISE` | Предприятие — запуск обработок, навигация по ссылкам | +| `CREATEINFOBASE` | Создание новой информационной базы | + +**Путь к 1cv8.exe** зависит от версии платформы: `C:\Program Files\1cv8\8.3.27.1859\bin\1cv8.exe`. + +## Подключение к информационной базе + +| Параметр | Описание | +|----------|----------| +| `/F <каталог>` | Файловая база — каталог с файлом `1Cv8.1CD` | +| `/S <адрес>` | Серверная база — формат `server/ibname` | +| `/IBName <имя>` | По имени из списка баз (в кавычках если содержит пробелы) | +| `/IBConnectionString` | Полная строка соединения | + +Примеры: +``` +1cv8.exe DESIGNER /F "C:\Bases\MyBase" ... +1cv8.exe DESIGNER /S server-pc/accounting ... +1cv8.exe DESIGNER /IBName "Бухгалтерия предприятия" ... +``` + +### Аутентификация + +| Параметр | Описание | +|----------|----------| +| `/N<имя>` | Имя пользователя (**без пробела** после `/N`) | +| `/P<пароль>` | Пароль (**без пробела** после `/P`). Можно опустить если пароля нет | +| `/WA-` | Запретить аутентификацию ОС | +| `/WA+` | Обязательная аутентификация ОС (по умолчанию) | + +> **Важно**: между `/N` и именем, а также между `/P` и паролем пробела нет: `/NАдмин /PSecret123`. + +## Общие параметры пакетного режима + +| Параметр | Описание | +|----------|----------| +| `/DisableStartupDialogs` | Подавляет интерактивные диалоги. **Обязательно** для пакетного режима — без него конфигуратор может зависнуть в ожидании ввода | +| `/DisableStartupMessages` | Подавляет стартовые предупреждения (несоответствие конфигурации БД и т.п.) | +| `/Out <файл> [-NoTruncate]` | Файл для вывода служебных сообщений (UTF-8). `-NoTruncate` — не очищать файл перед записью | +| `/DumpResult <файл>` | Записать числовой код результата в файл (0 — успех, 1 — ошибка, 101 — ошибки проверки) | +| `/Visible` | Показать окно конфигуратора (по умолчанию скрыто в пакетном режиме) | + +## Создание информационной базы + +``` +1cv8.exe CREATEINFOBASE <строка_соединения> [/AddToList [<имя>]] [/UseTemplate <файл>] [/DumpResult <файл>] +``` + +### Файловая база + +``` +1cv8.exe CREATEINFOBASE File="C:\Bases\EmptyDB" +``` + +### Серверная база + +``` +1cv8.exe CREATEINFOBASE Srvr="server-pc";Ref="new_db" +``` + +### Параметры + +| Параметр | Описание | +|----------|----------| +| `File="<путь>"` | Строка соединения для файловой базы | +| `Srvr="<сервер>";Ref="<имя>"` | Строка соединения для серверной базы | +| `/AddToList [<имя>]` | Добавить в список баз. Имя — необязательно | +| `/UseTemplate <файл>` | Создать по шаблону (.cf или .dt) | +| `/DumpResult <файл>` | Записать результат (0 — успех) | + +## Работа с конфигурацией — бинарные файлы (CF) + +### Выгрузка конфигурации в CF-файл + +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /DumpCfg config.cf /Out log.txt +``` + +**`/DumpCfg <файл> [-Extension <имя>]`** — сохранить конфигурацию в .cf-файл. + +### Загрузка конфигурации из CF-файла + +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /LoadCfg config.cf /Out log.txt +``` + +**`/LoadCfg <файл> [-Extension <имя>] [-AllExtensions]`** — загрузить конфигурацию из .cf-файла. + +| Параметр | Описание | +|----------|----------| +| `-Extension <имя>` | Работа с расширением (указать имя) | +| `-AllExtensions` | Работа со всеми расширениями (файл — архив расширений) | + +> После `/LoadCfg` конфигурация загружается в «основную» конфигурацию конфигуратора. Для применения к БД необходим `/UpdateDBCfg`. + +## Работа с конфигурацией — XML-исходники + +### Выгрузка `/DumpConfigToFiles` + +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /DumpConfigToFiles <каталог> [параметры] /Out log.txt +``` + +Полная сигнатура: +``` +/DumpConfigToFiles <каталог> [-Extension <имя>] [-AllExtensions] + [-update] [-force] [-getChanges <файл>] + [-configDumpInfoForChanges <файл>] [-listFile <файл>] + [-configDumpInfoOnly] [-Server] [-Format <формат>] + [-Archive <файл>] [-ignoreUnresolvedReferences] +``` + +#### Режимы выгрузки + +**Полная выгрузка** — все объекты конфигурации: +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /DumpConfigToFiles "C:\src\config" /Out log.txt +``` + +**Инкрементальная выгрузка** — только изменённые объекты: +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /DumpConfigToFiles "C:\src\config" -update -force /Out log.txt +``` + +Инкрементальная выгрузка с отслеживанием изменений: +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /DumpConfigToFiles "C:\src\config" -update -getChanges "changes.txt" -configDumpInfoForChanges "old\ConfigDumpInfo.xml" /Out log.txt +``` + +**Частичная выгрузка** — выбранные объекты по списку: +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /DumpConfigToFiles "C:\src\config" -listFile "dump_objects.txt" /Out log.txt +``` + +**Обновление ConfigDumpInfo.xml** — без выгрузки файлов: +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /DumpConfigToFiles "C:\src\config" -configDumpInfoOnly /Out log.txt +``` + +#### Параметры выгрузки + +| Параметр | Описание | +|----------|----------| +| `-update` | Обновляющая (инкрементальная) выгрузка — только изменённые объекты | +| `-force` | Принудительная полная выгрузка. Используется с `-update` при несовпадении версий | +| `-getChanges <файл>` | Записать список изменённых файлов | +| `-configDumpInfoForChanges <файл>` | Файл ConfigDumpInfo.xml для определения изменений | +| `-listFile <файл>` | Файл со списком выгружаемых объектов (по одному на строку) | +| `-configDumpInfoOnly` | Выгрузить только ConfigDumpInfo.xml | +| `-Extension <имя>` | Выгрузить расширение | +| `-AllExtensions` | Выгрузить все расширения | +| `-Server` | Выгрузка на стороне сервера | +| `-Format <формат>` | Формат файлов (Hierarchical / Plain) | +| `-Archive <файл>` | Выгрузка в архивный файл | +| `-ignoreUnresolvedReferences` | Игнорировать неразрешённые ссылки | + +#### Формат listFile для выгрузки + +Файл содержит **имена объектов метаданных** (одно на строку): +``` +Справочник.Номенклатура +Справочник.Валюты +Документ.РеализацияТоваровУслуг +Отчет.АнализПродаж +``` + +Кодировка: UTF-8 с BOM. + +### Загрузка `/LoadConfigFromFiles` + +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /LoadConfigFromFiles <каталог> [параметры] /Out log.txt +``` + +Полная сигнатура: +``` +/LoadConfigFromFiles <каталог> [-Extension <имя>] [-AllExtensions] + [-updateConfigDumpInfo] [-listFile <файл>] + [-Server] [-Archive <файл>] [-Format <формат>] +``` + +#### Режимы загрузки + +**Полная загрузка** — замена всей конфигурации: +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /LoadConfigFromFiles "C:\src\config" /Out log.txt +``` + +**Частичная загрузка** — выбранные файлы по списку: +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /LoadConfigFromFiles "C:\src\config" -listFile "load_list.txt" -Format Hierarchical -partial -updateConfigDumpInfo /Out log.txt +``` + +#### Параметры загрузки + +| Параметр | Описание | +|----------|----------| +| `-listFile <файл>` | Файл со списком загружаемых файлов (по одному на строку) | +| `-partial` | Частичная загрузка — **не заменять** всю конфигурацию, а внести точечные изменения. Недокументированный, но рабочий параметр | +| `-updateConfigDumpInfo` | Обновить ConfigDumpInfo.xml после загрузки | +| `-Extension <имя>` | Загрузить в расширение | +| `-AllExtensions` | Загрузить все расширения | +| `-Server` | Загрузка на стороне сервера | +| `-Archive <файл>` | Загрузка из архивного файла | +| `-Format <формат>` | Формат файлов (Hierarchical / Plain) | + +#### Формат listFile для загрузки + +Файл содержит **относительные пути к файлам** в каталоге выгрузки (один на строку): +``` +Catalogs/Валюты.xml +Catalogs/Валюты/Ext/ObjectModule.bsl +Documents/РеализацияТоваровУслуг.xml +Documents/РеализацияТоваровУслуг/Forms/ФормаДокумента.xml +``` + +Кодировка: UTF-8 с BOM. + +> **Важно: различие форматов listFile для dump и load:** +> - **Выгрузка** (`/DumpConfigToFiles -listFile`): имена объектов метаданных — `Справочник.Номенклатура` +> - **Загрузка** (`/LoadConfigFromFiles -listFile`): относительные пути файлов — `Catalogs/Валюты.xml` + +## Обновление конфигурации БД + +``` +1cv8.exe DESIGNER /F <база> /DisableStartupDialogs /UpdateDBCfg /Out log.txt +``` + +Полная сигнатура: +``` +/UpdateDBCfg [-Dynamic<режим>] [-Server] + [-WarningsAsErrors] + [-BackgroundStart] [-BackgroundFinish] + [-BackgroundCancel] [-BackgroundSuspend] [-BackgroundResume] + [-Extension <имя>] [-AllExtensions] +``` + +| Параметр | Описание | +|----------|----------| +| `-Dynamic+` | Использовать динамическое обновление | +| `-Dynamic-` | Не использовать динамическое обновление | +| `-Server` | Обновление на стороне сервера | +| `-WarningsAsErrors` | Предупреждения считать ошибками | +| `-Extension <имя>` | Обновить расширение | +| `-AllExtensions` | Обновить все расширения | + +### Фоновое обновление + +| Параметр | Описание | +|----------|----------| +| `-BackgroundStart` | Начать фоновое обновление | +| `-BackgroundFinish` | Дождаться окончания и завершить | +| `-BackgroundCancel` | Отменить фоновое обновление | +| `-BackgroundSuspend` | Приостановить | +| `-BackgroundResume` | Возобновить | + +> После `/LoadCfg` или `/LoadConfigFromFiles` необходимо выполнить `/UpdateDBCfg` чтобы изменения применились к базе данных. + +## Сборка и разборка внешних обработок (EPF/ERF) ### Сборка (XML → EPF) @@ -16,13 +277,8 @@ | Параметр | Описание | |----------|----------| -| `/F <путь>` | Путь к файловой информационной базе | -| `/S <строка>` | Строка подключения к серверной базе (альтернатива `/F`) | -| `/N <имя> /P <пароль>` | Аутентификация (если требуется) | -| `/DisableStartupDialogs` | Подавляет GUI-диалоги (обязательно для пакетного режима) | | `<корневой_xml>` | Путь к корневому XML-файлу обработки (например, `src\МояОбработка.xml`) | | `<путь_к_epf>` | Путь к выходному файлу `.epf` или `.erf` | -| `/Out <лог>` | Файл для записи лога операции | > **Важно**: первый аргумент — путь к **корневому XML-файлу** (не к каталогу). Если указать каталог, конфигуратор вернёт ошибку. @@ -39,36 +295,68 @@ | `-Format Hierarchical` | Иерархическая структура каталогов (по умолчанию) | | `-Format Plain` | Плоская структура | -### Коды возврата +### Примечания + +- Пустая ИБ достаточна для сборки, если обработка не ссылается на объекты конфигурации. +- Если обработка использует ссылочные типы конфигурации (`CatalogRef.*`, `DocumentRef.*` и т.п.) — в реквизитах, табличных частях или реквизитах форм — **сборка в пустой базе упадёт** с ошибкой XDTO. Необходима база с целевой конфигурацией. + +## Запуск в режиме предприятия + +``` +1cv8.exe ENTERPRISE /F <база> [/N<имя> /P<пароль>] /DisableStartupDialogs [параметры] +``` + +| Параметр | Описание | +|----------|----------| +| `/Execute <файл.epf>` | Запуск внешней обработки сразу после старта. При указании `/Execute` параметр `/URL` игнорируется | +| `/URL <ссылка>` | Навигационная ссылка (формат `e1cib/...`) | +| `/C <строка>` | Передача параметра в прикладное решение | + +Примеры: +``` +1cv8.exe ENTERPRISE /F "C:\Bases\MyBase" /NАдмин /PSecret /DisableStartupDialogs /Execute "C:\scripts\process.epf" +``` + +``` +1cv8.exe ENTERPRISE /IBName "Бухгалтерия" /NАдмин /DisableStartupDialogs /URL "e1cib/data/Справочник.Номенклатура" +``` + +## Коды возврата | Код | Значение | |-----|----------| | `0` | Успешно | | `1` | Ошибка | -| `101` | Ошибка данных | +| `101` | Ошибки при проверке конфигурации | -### Создание пустой ИБ +Числовой код можно записать в файл через `/DumpResult <файл>`. -``` -1cv8.exe CREATEINFOBASE File="<путь_к_каталогу_базы>" -``` +При работе с расширениями (`-Extension`, `-AllExtensions`): 0 — успех, 1 — ошибка. -Создаёт файловую ИБ в указанном каталоге. Необходима для пакетного режима конфигуратора. +## ConfigDumpInfo.xml -## Примечания +`ConfigDumpInfo.xml` — служебный файл, создаваемый при выгрузке конфигурации в файлы (`/DumpConfigToFiles`). Содержит информацию о составе и версиях объектов конфигурации на момент выгрузки. -- Пустая ИБ достаточна для сборки, если обработка не ссылается на объекты конфигурации. -- Если обработка использует ссылочные типы конфигурации (`CatalogRef.*`, `DocumentRef.*` и т.п.) — в реквизитах объекта, табличных частях или реквизитах форм — **сборка в пустой базе упадёт** с ошибкой XDTO. Платформа не может резолвить типы, отсутствующие в конфигурации. Необходима база с целевой конфигурацией. -- Путь к `1cv8.exe` зависит от установленной версии платформы (например, `C:\Program Files\1cv8\8.3.27.1859\bin\1cv8.exe`). -- `/DisableStartupDialogs` — подавляет интерактивные диалоги (например, «ИБ не обнаружена»), без него конфигуратор может зависнуть в ожидании пользовательского ввода. -- Первый аргумент `/LoadExternalDataProcessorOrReportFromFiles` — путь к корневому XML-файлу, а **не** к каталогу. +**Назначение:** +- Определение изменений при инкрементальной выгрузке (`-update`, `-configDumpInfoForChanges`) +- Синхронизация состояния выгрузки с конфигурацией ИБ + +**Использование:** +- `-configDumpInfoForChanges <файл>` — передать предыдущий ConfigDumpInfo.xml для определения изменений +- `-configDumpInfoOnly` — обновить только этот файл без выгрузки объектов +- `-updateConfigDumpInfo` — обновить файл после частичной загрузки (`/LoadConfigFromFiles`) + +**Расположение:** корень каталога выгрузки (рядом с `Configuration.xml`). + +## Переменные окружения + +| Переменная | Описание | +|-----------|----------| +| `V8_PATH` | Каталог `bin` платформы 1С (например, `C:\Program Files\1cv8\8.3.27.1859\bin`) | +| `V8_BASE` | Путь к пустой ИБ для EPF-сборки (создаётся автоматически при первом запуске) | ## Claude Code Skills Сборка и разборка доступны как навыки Claude Code: -- `/epf-build` — документация по сборке EPF из XML -- `/epf-dump` — документация по разборке EPF в XML - -Переменные окружения: -- `V8_PATH` — каталог `bin` платформы 1С (например, `C:\Program Files\1cv8\8.3.27.1859\bin`) -- `V8_BASE` — путь к пустой ИБ (создаётся автоматически при первом запуске) +- `/epf-build` — сборка EPF из XML +- `/epf-dump` — разборка EPF в XML From d6ad1eacdb1707d159af1f0b47c184d5ba4208b1 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 15 Feb 2026 19:55:56 +0300 Subject: [PATCH 2/7] feat(db): add 9 database management skills - db-list: manage .v8-project.json registry (CRUD, resolve by id/alias/branch) - db-create: CREATEINFOBASE for file and server databases - db-dump-cf / db-load-cf: dump/load configuration as CF binary - db-dump-xml: dump configuration to XML (full/incremental/partial/updateInfo) - db-load-xml: load configuration from XML (full/partial) - db-update: UpdateDBCfg with dynamic/background options - db-run: launch 1C:Enterprise in user mode - db-load-git: detect Git changes and partial-load into database - Add db-guide.md, update README.md and build-spec.md Co-Authored-By: Claude Opus 4.6 --- .claude/skills/db-create/SKILL.md | 81 ++++ .claude/skills/db-dump-cf/SKILL.md | 73 ++++ .claude/skills/db-dump-xml/SKILL.md | 95 +++++ .../db-dump-xml/scripts/db-dump-xml.ps1 | 224 +++++++++++ .claude/skills/db-list/SKILL.md | 154 ++++++++ .claude/skills/db-load-cf/SKILL.md | 78 ++++ .claude/skills/db-load-git/SKILL.md | 110 ++++++ .../db-load-git/scripts/db-load-git.ps1 | 352 ++++++++++++++++++ .claude/skills/db-load-xml/SKILL.md | 108 ++++++ .../db-load-xml/scripts/db-load-xml.ps1 | 230 ++++++++++++ .claude/skills/db-run/SKILL.md | 85 +++++ .claude/skills/db-update/SKILL.md | 93 +++++ README.md | 15 +- docs/build-spec.md | 5 - docs/db-guide.md | 142 +++++++ 15 files changed, 1838 insertions(+), 7 deletions(-) create mode 100644 .claude/skills/db-create/SKILL.md create mode 100644 .claude/skills/db-dump-cf/SKILL.md create mode 100644 .claude/skills/db-dump-xml/SKILL.md create mode 100644 .claude/skills/db-dump-xml/scripts/db-dump-xml.ps1 create mode 100644 .claude/skills/db-list/SKILL.md create mode 100644 .claude/skills/db-load-cf/SKILL.md create mode 100644 .claude/skills/db-load-git/SKILL.md create mode 100644 .claude/skills/db-load-git/scripts/db-load-git.ps1 create mode 100644 .claude/skills/db-load-xml/SKILL.md create mode 100644 .claude/skills/db-load-xml/scripts/db-load-xml.ps1 create mode 100644 .claude/skills/db-run/SKILL.md create mode 100644 .claude/skills/db-update/SKILL.md create mode 100644 docs/db-guide.md diff --git a/.claude/skills/db-create/SKILL.md b/.claude/skills/db-create/SKILL.md new file mode 100644 index 00000000..e6aad2af --- /dev/null +++ b/.claude/skills/db-create/SKILL.md @@ -0,0 +1,81 @@ +--- +name: db-create +description: Создание информационной базы 1С. Используй когда пользователь просит создать базу, новую ИБ, пустую базу +argument-hint: +allowed-tools: + - Bash + - Read + - Write + - Glob + - AskUserQuestion +--- + +# /db-create — Создание информационной базы + +Создаёт новую информационную базу 1С (файловую или серверную) и предлагает зарегистрировать в `.v8-project.json`. + +## Usage + +``` +/db-create — файловая база по указанному пути +/db-create / — серверная база +/db-create — интерактивно +``` + +## Разрешение параметров + +1. Прочитай `.v8-project.json` для получения `v8path` (если есть) +2. Если `v8path` не задан — автоопределение платформы: + ```powershell + $v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 + ``` + +## Команды + +### Файловая база + +```cmd +"\1cv8.exe" CREATEINFOBASE File="<путь>" /DisableStartupDialogs /Out "<лог>" +``` + +### Серверная база + +```cmd +"\1cv8.exe" CREATEINFOBASE Srvr="<сервер>";Ref="<имя>" /DisableStartupDialogs /Out "<лог>" +``` + +### Параметры + +| Параметр | Описание | +|----------|----------| +| `File="<путь>"` | Строка соединения для файловой базы | +| `Srvr="<сервер>";Ref="<имя>"` | Строка соединения для серверной базы | +| `/AddToList [<имя>]` | Добавить в список баз 1С (необязательно) | +| `/UseTemplate <файл>` | Создать из шаблона (.cf или .dt) | +| `/DisableStartupDialogs` | Подавить диалоги | +| `/Out <файл>` | Лог-файл | + +## Коды возврата + +| Код | Описание | +|-----|----------| +| 0 | Успешно | +| 1 | Ошибка (см. лог) | + +## После создания + +1. Прочитай лог-файл и покажи результат +2. Предложи зарегистрировать базу в `.v8-project.json` (через `/db-list add`) +3. Если указан шаблон `/UseTemplate` — предупреди что конфигурация будет загружена из шаблона + +## Пример + +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 + +# Создать файловую базу +& $v8.FullName CREATEINFOBASE File="C:\Bases\NewDB" /DisableStartupDialogs /Out "create.log" + +# Создать из шаблона CF +& $v8.FullName CREATEINFOBASE File="C:\Bases\NewDB" /UseTemplate "C:\Templates\config.cf" /DisableStartupDialogs /Out "create.log" +``` diff --git a/.claude/skills/db-dump-cf/SKILL.md b/.claude/skills/db-dump-cf/SKILL.md new file mode 100644 index 00000000..de7ce9b1 --- /dev/null +++ b/.claude/skills/db-dump-cf/SKILL.md @@ -0,0 +1,73 @@ +--- +name: db-dump-cf +description: Выгрузка конфигурации 1С в CF-файл. Используй когда пользователь просит выгрузить конфигурацию в CF, сохранить конфигурацию, сделать бэкап CF +argument-hint: [database] [output.cf] +allowed-tools: + - Bash + - Read + - Glob + - AskUserQuestion +--- + +# /db-dump-cf — Выгрузка конфигурации в CF-файл + +Выгружает конфигурацию информационной базы в бинарный CF-файл. + +## Usage + +``` +/db-dump-cf [database] [output.cf] +/db-dump-cf dev config.cf +/db-dump-cf — база по умолчанию, файл config.cf +``` + +## Разрешение базы данных + +1. Прочитай `.v8-project.json` (в корне проекта или ближайшем родительском каталоге) +2. Если пользователь указал базу — найди по id/alias/branch/имени +3. Если не указал — используй `default` +4. Если не найдено или неоднозначно — спроси пользователя +5. Если файл не найден — спроси пользователя параметры подключения и предложи создать `.v8-project.json` + +Автоопределение платформы (если `v8path` не задан): +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 +``` + +## Команда + +```cmd +"\1cv8.exe" DESIGNER /F "<база>" /N"" /P"" /DumpCfg "<файл.cf>" /DisableStartupDialogs /Out "<лог>" +``` + +Для серверной базы вместо `/F` используй `/S`: +```cmd +"\1cv8.exe" DESIGNER /S "/" /N"" /P"" /DumpCfg "<файл.cf>" /DisableStartupDialogs /Out "<лог>" +``` + +### Параметры + +| Параметр | Описание | +|----------|----------| +| `/DumpCfg <файл>` | Путь к выходному CF-файлу | +| `-Extension <имя>` | Выгрузить расширение (вместо основной конфигурации) | +| `-AllExtensions` | Выгрузить все расширения (архив расширений) | + +## Коды возврата + +| Код | Описание | +|-----|----------| +| 0 | Успешно | +| 1 | Ошибка (см. лог) | + +## После выполнения + +Прочитай лог-файл и покажи результат. Если есть ошибки — покажи содержимое лога. + +## Пример + +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 + +& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /P"" /DumpCfg "C:\backup\config.cf" /DisableStartupDialogs /Out "dump.log" +``` diff --git a/.claude/skills/db-dump-xml/SKILL.md b/.claude/skills/db-dump-xml/SKILL.md new file mode 100644 index 00000000..b21aa85c --- /dev/null +++ b/.claude/skills/db-dump-xml/SKILL.md @@ -0,0 +1,95 @@ +--- +name: db-dump-xml +description: Выгрузка конфигурации 1С в XML-файлы. Используй когда пользователь просит выгрузить конфигурацию в файлы, XML, исходники, DumpConfigToFiles +argument-hint: [database] [outputDir] +allowed-tools: + - Bash + - Read + - Glob + - AskUserQuestion +--- + +# /db-dump-xml — Выгрузка конфигурации в XML + +Выгружает конфигурацию информационной базы в XML-файлы (исходники). Поддерживает полную, инкрементальную, частичную выгрузку и обновление ConfigDumpInfo. + +## Usage + +``` +/db-dump-xml [database] [outputDir] +/db-dump-xml dev src/config +/db-dump-xml dev src/config -Mode Full +/db-dump-xml dev src/config -Mode Partial -Objects "Справочник.Номенклатура,Документ.Заказ" +``` + +## Разрешение базы данных + +1. Прочитай `.v8-project.json` (в корне проекта или ближайшем родительском каталоге) +2. Если пользователь указал базу — найди по id/alias/branch/имени +3. Если не указал — используй `default` +4. Если не найдено или неоднозначно — спроси пользователя +5. Если файл не найден — спроси пользователя параметры подключения и предложи создать `.v8-project.json` + +Если в записи базы указан `configSrc` — используй его как каталог выгрузки по умолчанию. + +Автоопределение платформы (если `v8path` не задан): +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 +``` + +## Команда + +```powershell +powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 <параметры> +``` + +### Параметры скрипта + +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Файловая база | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UserName <имя>` | нет | Имя пользователя | +| `-Password <пароль>` | нет | Пароль | +| `-ConfigDir <путь>` | да | Каталог для выгрузки | +| `-Mode <режим>` | нет | `Full` / `Changes` (по умолч.) / `Partial` / `UpdateInfo` | +| `-Objects <список>` | для Partial | Имена объектов через запятую | +| `-Extension <имя>` | нет | Выгрузить расширение | +| `-AllExtensions` | нет | Выгрузить все расширения | +| `-Format <формат>` | нет | `Hierarchical` (по умолч.) / `Plain` | + +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` + +### Режимы выгрузки + +| Режим | Описание | +|-------|----------| +| `Full` | Полная выгрузка — все объекты конфигурации | +| `Changes` | Инкрементальная — только изменённые с последней выгрузки (использует ConfigDumpInfo.xml) | +| `Partial` | Частичная — выбранные объекты из параметра `-Objects` | +| `UpdateInfo` | Обновить только ConfigDumpInfo.xml без выгрузки файлов | + +## Коды возврата + +| Код | Описание | +|-----|----------| +| 0 | Успешно | +| 1 | Ошибка (см. лог) | + +## Примеры + +```powershell +# Полная выгрузка +powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -Password "" -ConfigDir "C:\WS\cfsrc" -Mode Full + +# Инкрементальная выгрузка +powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Changes + +# Частичная выгрузка +powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Partial -Objects "Справочник.Номенклатура,Документ.Заказ" + +# Выгрузка расширения +powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\ext_src" -Mode Full -Extension "МоёРасширение" +``` diff --git a/.claude/skills/db-dump-xml/scripts/db-dump-xml.ps1 b/.claude/skills/db-dump-xml/scripts/db-dump-xml.ps1 new file mode 100644 index 00000000..8bc46360 --- /dev/null +++ b/.claude/skills/db-dump-xml/scripts/db-dump-xml.ps1 @@ -0,0 +1,224 @@ +# db-dump-xml v1.0 — Dump 1C configuration to XML files +# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills +<# +.SYNOPSIS + Выгрузка конфигурации 1С в XML-файлы + +.DESCRIPTION + Выполняет выгрузку конфигурации 1С в файлы в четырёх режимах: + - Full: полная выгрузка всей конфигурации + - Changes: инкрементальная выгрузка изменённых объектов + - Partial: выгрузка конкретных объектов из списка + - UpdateInfo: обновление только ConfigDumpInfo.xml + +.PARAMETER V8Path + Путь к каталогу bin платформы или к 1cv8.exe + +.PARAMETER InfoBasePath + Путь к файловой информационной базе + +.PARAMETER InfoBaseServer + Сервер 1С (для серверной базы) + +.PARAMETER InfoBaseRef + Имя базы на сервере + +.PARAMETER UserName + Имя пользователя 1С + +.PARAMETER Password + Пароль пользователя + +.PARAMETER ConfigDir + Каталог для выгрузки конфигурации + +.PARAMETER Mode + Режим выгрузки: Full, Changes, Partial, UpdateInfo (по умолчанию Changes) + +.PARAMETER Objects + Имена объектов метаданных через запятую (для режима Partial) + +.PARAMETER Extension + Имя расширения для выгрузки + +.PARAMETER AllExtensions + Выгрузить все расширения + +.PARAMETER Format + Формат выгрузки: Hierarchical или Plain (по умолчанию Hierarchical) + +.EXAMPLE + .\db-dump-xml.ps1 -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\src" -Mode Full + +.EXAMPLE + .\db-dump-xml.ps1 -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\src" -Mode Partial -Objects "Справочник.Номенклатура,Документ.Заказ" +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory=$false)] + [string]$V8Path, + + [Parameter(Mandatory=$false)] + [string]$InfoBasePath, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseServer, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseRef, + + [Parameter(Mandatory=$false)] + [string]$UserName, + + [Parameter(Mandatory=$false)] + [string]$Password, + + [Parameter(Mandatory=$true)] + [string]$ConfigDir, + + [Parameter(Mandatory=$false)] + [ValidateSet("Full", "Changes", "Partial", "UpdateInfo")] + [string]$Mode = "Changes", + + [Parameter(Mandatory=$false)] + [string]$Objects, + + [Parameter(Mandatory=$false)] + [string]$Extension, + + [Parameter(Mandatory=$false)] + [switch]$AllExtensions, + + [Parameter(Mandatory=$false)] + [ValidateSet("Hierarchical", "Plain")] + [string]$Format = "Hierarchical" +) + +$OutputEncoding = [System.Text.Encoding]::UTF8 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 + +# --- Resolve V8Path --- +if (-not $V8Path) { + $found = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" -ErrorAction SilentlyContinue | Sort-Object FullName -Descending | Select-Object -First 1 + if ($found) { + $V8Path = $found.FullName + } else { + Write-Host "Error: 1cv8.exe not found. Specify -V8Path" -ForegroundColor Red + exit 1 + } +} elseif (Test-Path $V8Path -PathType Container) { + $V8Path = Join-Path $V8Path "1cv8.exe" +} + +if (-not (Test-Path $V8Path)) { + Write-Host "Error: 1cv8.exe not found at $V8Path" -ForegroundColor Red + exit 1 +} + +# --- Validate connection --- +if (-not $InfoBasePath -and (-not $InfoBaseServer -or -not $InfoBaseRef)) { + Write-Host "Error: specify -InfoBasePath or -InfoBaseServer + -InfoBaseRef" -ForegroundColor Red + exit 1 +} + +# --- Validate Partial mode --- +if ($Mode -eq "Partial" -and -not $Objects) { + Write-Host "Error: -Objects required for Partial mode" -ForegroundColor Red + exit 1 +} + +# --- Create output dir if needed --- +if (-not (Test-Path $ConfigDir)) { + New-Item -ItemType Directory -Path $ConfigDir -Force | Out-Null + Write-Host "Created output directory: $ConfigDir" +} + +# --- Temp dir --- +$tempDir = Join-Path $env:TEMP "db_dump_xml_$(Get-Random)" +New-Item -ItemType Directory -Path $tempDir -Force | Out-Null + +try { + # --- Build arguments --- + $arguments = @("DESIGNER") + + if ($InfoBaseServer -and $InfoBaseRef) { + $arguments += "/S", "`"$InfoBaseServer/$InfoBaseRef`"" + } else { + $arguments += "/F", "`"$InfoBasePath`"" + } + + if ($UserName) { $arguments += "/N`"$UserName`"" } + if ($Password) { $arguments += "/P`"$Password`"" } + + $arguments += "/DumpConfigToFiles", "`"$ConfigDir`"" + $arguments += "-Format", $Format + + switch ($Mode) { + "Full" { + Write-Host "Executing full configuration dump..." + } + "Changes" { + Write-Host "Executing incremental configuration dump..." + $arguments += "-update" + $arguments += "-force" + } + "Partial" { + Write-Host "Executing partial configuration dump..." + $objectList = $Objects -split ',' | ForEach-Object { $_.Trim() } | Where-Object { $_ } + + $listFile = Join-Path $tempDir "dump_list.txt" + $utf8Bom = New-Object System.Text.UTF8Encoding($true) + [System.IO.File]::WriteAllLines($listFile, $objectList, $utf8Bom) + + $arguments += "-listFile", "`"$listFile`"" + Write-Host "Objects to dump: $($objectList.Count)" + foreach ($obj in $objectList) { Write-Host " $obj" } + } + "UpdateInfo" { + Write-Host "Updating ConfigDumpInfo.xml..." + $arguments += "-configDumpInfoOnly" + } + } + + # --- Extensions --- + if ($Extension) { + $arguments += "-Extension", "`"$Extension`"" + } elseif ($AllExtensions) { + $arguments += "-AllExtensions" + } + + # --- Output --- + $outFile = Join-Path $tempDir "dump_log.txt" + $arguments += "/Out", "`"$outFile`"" + $arguments += "/DisableStartupDialogs" + + # --- Execute --- + Write-Host "Running: 1cv8.exe $($arguments -join ' ')" + $process = Start-Process -FilePath $V8Path -ArgumentList $arguments -NoNewWindow -Wait -PassThru + $exitCode = $process.ExitCode + + # --- Result --- + if ($exitCode -eq 0) { + Write-Host "Dump completed successfully" -ForegroundColor Green + Write-Host "Configuration dumped to: $ConfigDir" + } else { + Write-Host "Error dumping configuration (code: $exitCode)" -ForegroundColor Red + } + + if (Test-Path $outFile) { + $logContent = Get-Content $outFile -Raw -ErrorAction SilentlyContinue + if ($logContent) { + Write-Host "--- Log ---" + Write-Host $logContent + Write-Host "--- End ---" + } + } + + exit $exitCode + +} finally { + if (Test-Path $tempDir) { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + } +} diff --git a/.claude/skills/db-list/SKILL.md b/.claude/skills/db-list/SKILL.md new file mode 100644 index 00000000..3e6bb65a --- /dev/null +++ b/.claude/skills/db-list/SKILL.md @@ -0,0 +1,154 @@ +--- +name: db-list +description: Управление реестром баз данных 1С (.v8-project.json). Используй когда пользователь говорит про базы данных, список баз, "добавь базу", "какие базы есть" +argument-hint: [add|remove|show] +allowed-tools: + - Read + - Write + - Glob + - AskUserQuestion +--- + +# /db-list — Управление реестром баз данных + +Управляет файлом `.v8-project.json` — реестром информационных баз проекта. Файл хранит параметры подключения, алиасы, привязку к веткам Git. + +## Usage + +``` +/db-list — показать список баз +/db-list add — добавить базу (интерактивно) +/db-list remove — удалить базу из реестра +/db-list show — подробности по базе +``` + +## Формат `.v8-project.json` + +Файл размещается в корне проекта (рядом с `.git/`). + +```json +{ + "v8path": "C:\\Program Files\\1cv8\\8.3.25.1257\\bin", + "databases": [ + { + "id": "dev", + "name": "Разработка", + "type": "file", + "path": "C:\\Bases\\MyApp_Dev", + "user": "Admin", + "password": "", + "aliases": ["dev", "разработка"], + "branches": ["dev", "develop"], + "configSrc": "C:\\WS\\myapp\\cfsrc" + }, + { + "id": "test", + "name": "Тестовая", + "type": "server", + "server": "srv01", + "ref": "MyApp_Test", + "user": "Admin", + "password": "123", + "aliases": ["test", "тест"] + } + ], + "default": "dev" +} +``` + +### Поля корневого объекта + +| Поле | Тип | Описание | +|------|-----|----------| +| `v8path` | string | Каталог bin платформы 1С. Необязательный — если не задан, автоопределение | +| `databases` | array | Массив баз данных | +| `default` | string | id базы по умолчанию | + +### Поля объекта базы данных + +| Поле | Тип | Обязательное | Описание | +|------|-----|:------------:|----------| +| `id` | string | да | Уникальный идентификатор (латиница, без пробелов) | +| `name` | string | да | Человекочитаемое имя | +| `type` | `"file"` / `"server"` | да | Тип подключения | +| `path` | string | для file | Путь к каталогу файловой базы | +| `server` | string | для server | Адрес сервера 1С | +| `ref` | string | для server | Имя базы на сервере | +| `user` | string | нет | Имя пользователя 1С | +| `password` | string | нет | Пароль | +| `aliases` | string[] | нет | Альтернативные имена для быстрого доступа | +| `branches` | string[] | нет | Git-ветки, привязанные к этой базе | +| `configSrc` | string | нет | Каталог XML-выгрузки конфигурации | + +## Алгоритм разрешения базы данных + +Этот алгоритм используется ВСЕМИ навыками `db-*` для определения целевой базы. + +1. Прочитай `.v8-project.json` (в корне проекта или ближайшем родительском каталоге) +2. Если пользователь указал базу — ищи совпадение в таком порядке: + 1. По `id` (точное совпадение) + 2. По `aliases` (точное совпадение в массиве) + 3. По `branches` (совпадение с текущей Git-веткой) + 4. По `name` (нечёткое совпадение) +3. Если пользователь не указал базу — используй `default` +4. Если не найдено или неоднозначно — спроси пользователя +5. Если файл `.v8-project.json` не найден — спроси параметры подключения и предложи создать файл + +### Автоопределение платформы + +Если `v8path` не задан в конфиге: + +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 +``` + +## Операции + +### Показать список баз + +Прочитай `.v8-project.json`, выведи таблицу: + +``` +ID Имя Тип Путь/Сервер По умолч. +dev Разработка file C:\Bases\MyApp_Dev ✓ +test Тестовая server srv01/MyApp_Test +``` + +### Добавить базу + +Спроси у пользователя через AskUserQuestion: +- id, name, type (file/server) +- path (для file) или server + ref (для server) +- user, password (необязательно) +- aliases, branches (необязательно) + +Добавь в массив `databases`. Если это первая база — установи как `default`. + +### Удалить базу + +Удали из массива `databases` по id. Если удаляемая была `default` — спросить новый default. + +### Подробности по базе + +Выведи все поля конкретной базы. + +## Формирование строки подключения + +Для использования в шаблонах команд других навыков: + +**Файловая база:** +``` +/F "" +``` + +**Серверная база:** +``` +/S "/" +``` + +**Аутентификация** (добавляется если user задан): +``` +/N"" /P"" +``` + +> **Важно**: между `/N` и именем пробела нет. Между `/P` и паролем пробела нет. Если пароль пустой — `/P""` или опустить `/P`. diff --git a/.claude/skills/db-load-cf/SKILL.md b/.claude/skills/db-load-cf/SKILL.md new file mode 100644 index 00000000..dd6878fb --- /dev/null +++ b/.claude/skills/db-load-cf/SKILL.md @@ -0,0 +1,78 @@ +--- +name: db-load-cf +description: Загрузка конфигурации 1С из CF-файла. Используй когда пользователь просит загрузить конфигурацию из CF, восстановить из бэкапа CF +argument-hint: [database] +allowed-tools: + - Bash + - Read + - Glob + - AskUserQuestion +--- + +# /db-load-cf — Загрузка конфигурации из CF-файла + +Загружает конфигурацию из бинарного CF-файла в информационную базу. + +## Usage + +``` +/db-load-cf [database] +/db-load-cf config.cf dev +``` + +> **Внимание**: загрузка CF **полностью заменяет** конфигурацию в базе. Перед выполнением запроси подтверждение у пользователя. + +## Разрешение базы данных + +1. Прочитай `.v8-project.json` (в корне проекта или ближайшем родительском каталоге) +2. Если пользователь указал базу — найди по id/alias/branch/имени +3. Если не указал — используй `default` +4. Если не найдено или неоднозначно — спроси пользователя +5. Если файл не найден — спроси пользователя параметры подключения и предложи создать `.v8-project.json` + +Автоопределение платформы (если `v8path` не задан): +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 +``` + +## Команда + +```cmd +"\1cv8.exe" DESIGNER /F "<база>" /N"" /P"" /LoadCfg "<файл.cf>" /DisableStartupDialogs /Out "<лог>" +``` + +Для серверной базы вместо `/F` используй `/S`: +```cmd +"\1cv8.exe" DESIGNER /S "/" /N"" /P"" /LoadCfg "<файл.cf>" /DisableStartupDialogs /Out "<лог>" +``` + +### Параметры + +| Параметр | Описание | +|----------|----------| +| `/LoadCfg <файл>` | Путь к CF-файлу | +| `-Extension <имя>` | Загрузить как расширение | +| `-AllExtensions` | Загрузить все расширения из архива | + +## Коды возврата + +| Код | Описание | +|-----|----------| +| 0 | Успешно | +| 1 | Ошибка (см. лог) | + +## После выполнения + +1. Прочитай лог-файл и покажи результат +2. **Предложи выполнить `/db-update`** — загрузка CF обновляет только «основную» конфигурацию конфигуратора, для применения к БД нужен `/UpdateDBCfg` + +## Пример + +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 + +& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /P"" /LoadCfg "C:\backup\config.cf" /DisableStartupDialogs /Out "load.log" + +# Не забудь обновить БД после загрузки! +& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /P"" /UpdateDBCfg /DisableStartupDialogs /Out "update.log" +``` diff --git a/.claude/skills/db-load-git/SKILL.md b/.claude/skills/db-load-git/SKILL.md new file mode 100644 index 00000000..942c6ca0 --- /dev/null +++ b/.claude/skills/db-load-git/SKILL.md @@ -0,0 +1,110 @@ +--- +name: db-load-git +description: Загрузка изменений из Git в базу 1С. Используй когда пользователь просит загрузить изменения из гита, обновить базу из репозитория, partial load из коммита +argument-hint: [database] [source] +allowed-tools: + - Bash + - Read + - Glob + - AskUserQuestion +--- + +# /db-load-git — Загрузка изменений из Git + +Определяет изменённые файлы конфигурации по данным Git и выполняет частичную загрузку в информационную базу. + +## Usage + +``` +/db-load-git [database] +/db-load-git dev — все незафиксированные изменения +/db-load-git dev -Source Staged — только staged +/db-load-git dev -Source Commit -CommitRange "HEAD~3..HEAD" +/db-load-git dev -DryRun — только показать что будет загружено +``` + +## Разрешение базы данных + +1. Прочитай `.v8-project.json` (в корне проекта или ближайшем родительском каталоге) +2. Если пользователь указал базу — найди по id/alias/branch/имени +3. Если не указал — используй `default` +4. Если не найдено или неоднозначно — спроси пользователя +5. Если файл не найден — спроси пользователя параметры подключения и предложи создать `.v8-project.json` + +Если в записи базы указан `configSrc` — используй его как каталог конфигурации. + +Автоопределение платформы (если `v8path` не задан): +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 +``` + +## Команда + +```powershell +powershell.exe -NoProfile -File .claude\skills\db-load-git\scripts\db-load-git.ps1 <параметры> +``` + +### Параметры скрипта + +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Файловая база | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UserName <имя>` | нет | Имя пользователя | +| `-Password <пароль>` | нет | Пароль | +| `-ConfigDir <путь>` | да | Каталог XML-выгрузки (git-репозиторий) | +| `-Source <источник>` | нет | `All` (по умолч.) / `Staged` / `Unstaged` / `Commit` | +| `-CommitRange ` | для Commit | Диапазон коммитов (напр. `HEAD~3..HEAD`) | +| `-Extension <имя>` | нет | Загрузить в расширение | +| `-AllExtensions` | нет | Загрузить все расширения | +| `-Format <формат>` | нет | `Hierarchical` (по умолч.) / `Plain` | +| `-DryRun` | нет | Только показать что будет загружено (без загрузки) | + +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` + +### Источники изменений + +| Source | Описание | +|--------|----------| +| `All` | Все незафиксированные: staged + unstaged + untracked | +| `Staged` | Только проиндексированные (git add) | +| `Unstaged` | Только изменённые но не проиндексированные | +| `Commit` | Файлы из диапазона коммитов (требует `-CommitRange`) | + +### Логика маппинга BSL → XML + +Для `.bsl` файлов скрипт автоматически добавляет: +1. XML объекта верхнего уровня (напр. `Catalogs/Номенклатура.xml`) +2. Все файлы из каталога `Ext/` этого объекта (связанные модули) + +Пропускаются: `ConfigDumpInfo.xml`, файлы вне `ConfigDir`. + +## Коды возврата + +| Код | Описание | +|-----|----------| +| 0 | Успешно (или нет изменений) | +| 1 | Ошибка (см. лог) | + +## После выполнения + +1. Показать список загруженных файлов +2. **Предложить `/db-update`** — для применения изменений к БД + +## Примеры + +```powershell +# Загрузить все незафиксированные изменения +powershell.exe -NoProfile -File .claude\skills\db-load-git\scripts\db-load-git.ps1 -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Source All + +# Только staged +powershell.exe -NoProfile -File .claude\skills\db-load-git\scripts\db-load-git.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Source Staged + +# Из диапазона коммитов +powershell.exe -NoProfile -File .claude\skills\db-load-git\scripts\db-load-git.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Source Commit -CommitRange "HEAD~3..HEAD" + +# Только посмотреть (DryRun) +powershell.exe -NoProfile -File .claude\skills\db-load-git\scripts\db-load-git.ps1 -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\WS\cfsrc" -DryRun +``` diff --git a/.claude/skills/db-load-git/scripts/db-load-git.ps1 b/.claude/skills/db-load-git/scripts/db-load-git.ps1 new file mode 100644 index 00000000..803f6b91 --- /dev/null +++ b/.claude/skills/db-load-git/scripts/db-load-git.ps1 @@ -0,0 +1,352 @@ +# db-load-git v1.0 — Load Git changes into 1C database +# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills +<# +.SYNOPSIS + Загрузка изменений из Git в базу 1С + +.DESCRIPTION + Определяет изменённые файлы конфигурации по данным Git и выполняет + частичную загрузку в информационную базу. + +.PARAMETER V8Path + Путь к каталогу bin платформы или к 1cv8.exe + +.PARAMETER InfoBasePath + Путь к файловой информационной базе + +.PARAMETER InfoBaseServer + Сервер 1С (для серверной базы) + +.PARAMETER InfoBaseRef + Имя базы на сервере + +.PARAMETER UserName + Имя пользователя 1С + +.PARAMETER Password + Пароль пользователя + +.PARAMETER ConfigDir + Каталог XML-выгрузки конфигурации (git-репозиторий) + +.PARAMETER Source + Источник изменений: All, Staged, Unstaged, Commit (по умолчанию All) + +.PARAMETER CommitRange + Диапазон коммитов (для Source=Commit), напр. HEAD~3..HEAD + +.PARAMETER Extension + Имя расширения для загрузки + +.PARAMETER AllExtensions + Загрузить все расширения + +.PARAMETER Format + Формат файлов: Hierarchical или Plain (по умолчанию Hierarchical) + +.PARAMETER DryRun + Только показать что будет загружено (без загрузки) + +.EXAMPLE + .\db-load-git.ps1 -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\src" -Source All + +.EXAMPLE + .\db-load-git.ps1 -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\src" -Source Commit -CommitRange "HEAD~3..HEAD" + +.EXAMPLE + .\db-load-git.ps1 -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\src" -DryRun +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory=$false)] + [string]$V8Path, + + [Parameter(Mandatory=$false)] + [string]$InfoBasePath, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseServer, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseRef, + + [Parameter(Mandatory=$false)] + [string]$UserName, + + [Parameter(Mandatory=$false)] + [string]$Password, + + [Parameter(Mandatory=$true)] + [string]$ConfigDir, + + [Parameter(Mandatory=$false)] + [ValidateSet("All", "Staged", "Unstaged", "Commit")] + [string]$Source = "All", + + [Parameter(Mandatory=$false)] + [string]$CommitRange, + + [Parameter(Mandatory=$false)] + [string]$Extension, + + [Parameter(Mandatory=$false)] + [switch]$AllExtensions, + + [Parameter(Mandatory=$false)] + [ValidateSet("Hierarchical", "Plain")] + [string]$Format = "Hierarchical", + + [Parameter(Mandatory=$false)] + [switch]$DryRun +) + +$OutputEncoding = [System.Text.Encoding]::UTF8 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 + +# --- Helper: map BSL path to object XML --- +function Get-ObjectXmlFromBsl { + param([string]$RelativePath) + + $parts = $RelativePath -split '[\\/]' + if ($parts.Count -ge 2) { + return "$($parts[0])/$($parts[1]).xml" + } + return $null +} + +# --- Resolve V8Path (skip if DryRun) --- +if (-not $DryRun) { + if (-not $V8Path) { + $found = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" -ErrorAction SilentlyContinue | Sort-Object FullName -Descending | Select-Object -First 1 + if ($found) { + $V8Path = $found.FullName + } else { + Write-Host "Error: 1cv8.exe not found. Specify -V8Path" -ForegroundColor Red + exit 1 + } + } elseif (Test-Path $V8Path -PathType Container) { + $V8Path = Join-Path $V8Path "1cv8.exe" + } + + if (-not (Test-Path $V8Path)) { + Write-Host "Error: 1cv8.exe not found at $V8Path" -ForegroundColor Red + exit 1 + } +} + +# --- Validate connection (skip if DryRun) --- +if (-not $DryRun) { + if (-not $InfoBasePath -and (-not $InfoBaseServer -or -not $InfoBaseRef)) { + Write-Host "Error: specify -InfoBasePath or -InfoBaseServer + -InfoBaseRef" -ForegroundColor Red + exit 1 + } +} + +# --- Validate config dir --- +if (-not (Test-Path $ConfigDir)) { + Write-Host "Error: config directory not found: $ConfigDir" -ForegroundColor Red + exit 1 +} + +# --- Validate Commit mode --- +if ($Source -eq "Commit" -and -not $CommitRange) { + Write-Host "Error: -CommitRange required for Source=Commit" -ForegroundColor Red + exit 1 +} + +# --- Check git --- +try { + $null = git --version 2>&1 +} catch { + Write-Host "Error: git not found in PATH" -ForegroundColor Red + exit 1 +} + +# --- Get changed files from Git --- +$changedFiles = @() +$configDirNormalized = $ConfigDir.TrimEnd('\', '/').Replace('\', '/') + +Push-Location $ConfigDir +try { + switch ($Source) { + "Staged" { + Write-Host "Getting staged changes..." + $raw = git diff --cached --name-only 2>&1 + if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } + } + "Unstaged" { + Write-Host "Getting unstaged changes..." + $raw = git diff --name-only 2>&1 + if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } + $raw = git ls-files --others --exclude-standard 2>&1 + if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } + } + "Commit" { + Write-Host "Getting changes from $CommitRange..." + $raw = git diff --name-only $CommitRange 2>&1 + if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } + } + "All" { + Write-Host "Getting all uncommitted changes..." + $raw = git diff --cached --name-only 2>&1 + if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } + $raw = git diff --name-only 2>&1 + if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } + $raw = git ls-files --others --exclude-standard 2>&1 + if ($LASTEXITCODE -eq 0) { $changedFiles += $raw } + } + } +} finally { + Pop-Location +} + +$changedFiles = $changedFiles | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | Select-Object -Unique + +if ($changedFiles.Count -eq 0) { + Write-Host "No changes found" + exit 0 +} + +Write-Host "Git changes detected: $($changedFiles.Count) files" + +# --- Filter and map to config files --- +$configFiles = @() + +foreach ($file in $changedFiles) { + $file = $file.Trim().Replace('\', '/') + if ([string]::IsNullOrWhiteSpace($file)) { continue } + + # Skip service files + if ($file -eq "ConfigDumpInfo.xml") { continue } + + # Only process .xml and .bsl files + if ($file -match '\.(xml|bsl)$') { + # Check file exists in config dir + $fullPath = Join-Path $ConfigDir $file + if ($file -match '\.xml$') { + if (Test-Path $fullPath) { + if ($configFiles -notcontains $file) { + $configFiles += $file + } + } + } + elseif ($file -match '\.bsl$') { + # For BSL: add the BSL itself + parent object XML + all Ext/ files + $objectXml = Get-ObjectXmlFromBsl -RelativePath $file + if ($objectXml) { + $fullXmlPath = Join-Path $ConfigDir $objectXml + if (Test-Path $fullXmlPath) { + if ($configFiles -notcontains $objectXml) { + $configFiles += $objectXml + } + if ($configFiles -notcontains $file) { + $configFiles += $file + } + + # Add all files from Ext/ directory of the object + $parts = $file -split '[\\/]' + if ($parts.Count -ge 2) { + $extDir = Join-Path (Join-Path $ConfigDir $parts[0]) "$($parts[1])\Ext" + if (Test-Path $extDir) { + Get-ChildItem -Path $extDir -Recurse -File | ForEach-Object { + $extRelPath = $_.FullName.Replace("$ConfigDir\", '').Replace('\', '/') + if ($configFiles -notcontains $extRelPath) { + $configFiles += $extRelPath + } + } + } + } + } + } + } + } +} + +if ($configFiles.Count -eq 0) { + Write-Host "No configuration files found in changes" + exit 0 +} + +Write-Host "Files for loading: $($configFiles.Count)" +foreach ($f in $configFiles) { Write-Host " $f" } + +# --- DryRun: stop here --- +if ($DryRun) { + Write-Host "" + Write-Host "DryRun mode - no changes applied" + exit 0 +} + +# --- Temp dir --- +$tempDir = Join-Path $env:TEMP "db_load_git_$(Get-Random)" +New-Item -ItemType Directory -Path $tempDir -Force | Out-Null + +try { + # --- Write list file (UTF-8 with BOM) --- + $listFile = Join-Path $tempDir "load_list.txt" + $utf8Bom = New-Object System.Text.UTF8Encoding($true) + [System.IO.File]::WriteAllLines($listFile, $configFiles, $utf8Bom) + + # --- Build arguments --- + $arguments = @("DESIGNER") + + if ($InfoBaseServer -and $InfoBaseRef) { + $arguments += "/S", "`"$InfoBaseServer/$InfoBaseRef`"" + } else { + $arguments += "/F", "`"$InfoBasePath`"" + } + + if ($UserName) { $arguments += "/N`"$UserName`"" } + if ($Password) { $arguments += "/P`"$Password`"" } + + $arguments += "/LoadConfigFromFiles", "`"$ConfigDir`"" + $arguments += "-listFile", "`"$listFile`"" + $arguments += "-Format", $Format + $arguments += "-partial" + $arguments += "-updateConfigDumpInfo" + + # --- Extensions --- + if ($Extension) { + $arguments += "-Extension", "`"$Extension`"" + } elseif ($AllExtensions) { + $arguments += "-AllExtensions" + } + + # --- Output --- + $outFile = Join-Path $tempDir "load_log.txt" + $arguments += "/Out", "`"$outFile`"" + $arguments += "/DisableStartupDialogs" + + # --- Execute --- + Write-Host "" + Write-Host "Executing partial configuration load..." + Write-Host "Running: 1cv8.exe $($arguments -join ' ')" + + $process = Start-Process -FilePath $V8Path -ArgumentList $arguments -NoNewWindow -Wait -PassThru + $exitCode = $process.ExitCode + + # --- Result --- + Write-Host "" + if ($exitCode -eq 0) { + Write-Host "Load completed successfully" -ForegroundColor Green + } else { + Write-Host "Error loading configuration (code: $exitCode)" -ForegroundColor Red + } + + if (Test-Path $outFile) { + $logContent = Get-Content $outFile -Raw -ErrorAction SilentlyContinue + if ($logContent) { + Write-Host "--- Log ---" + Write-Host $logContent + Write-Host "--- End ---" + } + } + + exit $exitCode + +} finally { + if (Test-Path $tempDir) { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + } +} diff --git a/.claude/skills/db-load-xml/SKILL.md b/.claude/skills/db-load-xml/SKILL.md new file mode 100644 index 00000000..f591bcb8 --- /dev/null +++ b/.claude/skills/db-load-xml/SKILL.md @@ -0,0 +1,108 @@ +--- +name: db-load-xml +description: Загрузка конфигурации 1С из XML-файлов. Используй когда пользователь просит загрузить конфигурацию из файлов, XML, исходников, LoadConfigFromFiles +argument-hint: [database] +allowed-tools: + - Bash + - Read + - Glob + - AskUserQuestion +--- + +# /db-load-xml — Загрузка конфигурации из XML + +Загружает конфигурацию в информационную базу из XML-файлов (исходников). Поддерживает полную и частичную загрузку. + +## Usage + +``` +/db-load-xml [database] +/db-load-xml src/config dev +/db-load-xml src/config dev -Mode Partial -Files "Catalogs/Номенклатура.xml,Catalogs/Номенклатура/Ext/ObjectModule.bsl" +``` + +> **Внимание**: полная загрузка **заменяет всю конфигурацию** в базе. Перед выполнением запроси подтверждение у пользователя. + +## Разрешение базы данных + +1. Прочитай `.v8-project.json` (в корне проекта или ближайшем родительском каталоге) +2. Если пользователь указал базу — найди по id/alias/branch/имени +3. Если не указал — используй `default` +4. Если не найдено или неоднозначно — спроси пользователя +5. Если файл не найден — спроси пользователя параметры подключения и предложи создать `.v8-project.json` + +Если в записи базы указан `configSrc` — используй его как каталог загрузки по умолчанию. + +Автоопределение платформы (если `v8path` не задан): +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 +``` + +## Команда + +```powershell +powershell.exe -NoProfile -File .claude\skills\db-load-xml\scripts\db-load-xml.ps1 <параметры> +``` + +### Параметры скрипта + +| Параметр | Обязательный | Описание | +|----------|:------------:|----------| +| `-V8Path <путь>` | нет | Каталог bin платформы (или полный путь к 1cv8.exe) | +| `-InfoBasePath <путь>` | * | Файловая база | +| `-InfoBaseServer <сервер>` | * | Сервер 1С (для серверной базы) | +| `-InfoBaseRef <имя>` | * | Имя базы на сервере | +| `-UserName <имя>` | нет | Имя пользователя | +| `-Password <пароль>` | нет | Пароль | +| `-ConfigDir <путь>` | да | Каталог XML-исходников | +| `-Mode <режим>` | нет | `Full` (по умолч.) / `Partial` | +| `-Files <список>` | для Partial | Относительные пути файлов через запятую | +| `-ListFile <путь>` | для Partial | Путь к файлу со списком (альтернатива `-Files`) | +| `-Extension <имя>` | нет | Загрузить в расширение | +| `-AllExtensions` | нет | Загрузить все расширения | +| `-Format <формат>` | нет | `Hierarchical` (по умолч.) / `Plain` | + +> `*` — нужен либо `-InfoBasePath`, либо пара `-InfoBaseServer` + `-InfoBaseRef` + +### Режимы загрузки + +| Режим | Описание | +|-------|----------| +| `Full` | Полная загрузка — замена всей конфигурации из каталога XML | +| `Partial` | Частичная — загрузка выбранных файлов (с `-partial -updateConfigDumpInfo`) | + +### Формат файла списка (listFile) + +Файл содержит **относительные пути к файлам** в каталоге выгрузки (один на строку), кодировка **UTF-8 с BOM**: + +``` +Catalogs/Номенклатура.xml +Catalogs/Номенклатура/Ext/ObjectModule.bsl +Documents/Заказ.xml +Documents/Заказ/Forms/ФормаДокумента.xml +``` + +## Коды возврата + +| Код | Описание | +|-----|----------| +| 0 | Успешно | +| 1 | Ошибка (см. лог) | + +## После выполнения + +1. Прочитай лог и покажи результат +2. **Предложи выполнить `/db-update`** — для применения изменений к БД + +## Примеры + +```powershell +# Полная загрузка +powershell.exe -NoProfile -File .claude\skills\db-load-xml\scripts\db-load-xml.ps1 -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Full + +# Частичная загрузка конкретных файлов +powershell.exe -NoProfile -File .claude\skills\db-load-xml\scripts\db-load-xml.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Partial -Files "Catalogs/Номенклатура.xml,Catalogs/Номенклатура/Ext/ObjectModule.bsl" + +# Загрузка расширения +powershell.exe -NoProfile -File .claude\skills\db-load-xml\scripts\db-load-xml.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\ext_src" -Mode Full -Extension "МоёРасширение" +``` diff --git a/.claude/skills/db-load-xml/scripts/db-load-xml.ps1 b/.claude/skills/db-load-xml/scripts/db-load-xml.ps1 new file mode 100644 index 00000000..5d2cbb6c --- /dev/null +++ b/.claude/skills/db-load-xml/scripts/db-load-xml.ps1 @@ -0,0 +1,230 @@ +# db-load-xml v1.0 — Load 1C configuration from XML files +# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills +<# +.SYNOPSIS + Загрузка конфигурации 1С из XML-файлов + +.DESCRIPTION + Загружает конфигурацию в информационную базу из XML-файлов. + Поддерживает полную и частичную загрузку. + +.PARAMETER V8Path + Путь к каталогу bin платформы или к 1cv8.exe + +.PARAMETER InfoBasePath + Путь к файловой информационной базе + +.PARAMETER InfoBaseServer + Сервер 1С (для серверной базы) + +.PARAMETER InfoBaseRef + Имя базы на сервере + +.PARAMETER UserName + Имя пользователя 1С + +.PARAMETER Password + Пароль пользователя + +.PARAMETER ConfigDir + Каталог XML-исходников конфигурации + +.PARAMETER Mode + Режим загрузки: Full или Partial (по умолчанию Full) + +.PARAMETER Files + Относительные пути файлов через запятую (для режима Partial) + +.PARAMETER ListFile + Путь к файлу со списком файлов (альтернатива -Files, для режима Partial) + +.PARAMETER Extension + Имя расширения для загрузки + +.PARAMETER AllExtensions + Загрузить все расширения + +.PARAMETER Format + Формат файлов: Hierarchical или Plain (по умолчанию Hierarchical) + +.EXAMPLE + .\db-load-xml.ps1 -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\src" -Mode Full + +.EXAMPLE + .\db-load-xml.ps1 -InfoBasePath "C:\Bases\MyDB" -ConfigDir "C:\src" -Mode Partial -Files "Catalogs/Номенклатура.xml,Catalogs/Номенклатура/Ext/ObjectModule.bsl" +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory=$false)] + [string]$V8Path, + + [Parameter(Mandatory=$false)] + [string]$InfoBasePath, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseServer, + + [Parameter(Mandatory=$false)] + [string]$InfoBaseRef, + + [Parameter(Mandatory=$false)] + [string]$UserName, + + [Parameter(Mandatory=$false)] + [string]$Password, + + [Parameter(Mandatory=$true)] + [string]$ConfigDir, + + [Parameter(Mandatory=$false)] + [ValidateSet("Full", "Partial")] + [string]$Mode = "Full", + + [Parameter(Mandatory=$false)] + [string]$Files, + + [Parameter(Mandatory=$false)] + [string]$ListFile, + + [Parameter(Mandatory=$false)] + [string]$Extension, + + [Parameter(Mandatory=$false)] + [switch]$AllExtensions, + + [Parameter(Mandatory=$false)] + [ValidateSet("Hierarchical", "Plain")] + [string]$Format = "Hierarchical" +) + +$OutputEncoding = [System.Text.Encoding]::UTF8 +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 + +# --- Resolve V8Path --- +if (-not $V8Path) { + $found = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" -ErrorAction SilentlyContinue | Sort-Object FullName -Descending | Select-Object -First 1 + if ($found) { + $V8Path = $found.FullName + } else { + Write-Host "Error: 1cv8.exe not found. Specify -V8Path" -ForegroundColor Red + exit 1 + } +} elseif (Test-Path $V8Path -PathType Container) { + $V8Path = Join-Path $V8Path "1cv8.exe" +} + +if (-not (Test-Path $V8Path)) { + Write-Host "Error: 1cv8.exe not found at $V8Path" -ForegroundColor Red + exit 1 +} + +# --- Validate connection --- +if (-not $InfoBasePath -and (-not $InfoBaseServer -or -not $InfoBaseRef)) { + Write-Host "Error: specify -InfoBasePath or -InfoBaseServer + -InfoBaseRef" -ForegroundColor Red + exit 1 +} + +# --- Validate config dir --- +if (-not (Test-Path $ConfigDir)) { + Write-Host "Error: config directory not found: $ConfigDir" -ForegroundColor Red + exit 1 +} + +# --- Validate Partial mode --- +if ($Mode -eq "Partial" -and -not $Files -and -not $ListFile) { + Write-Host "Error: -Files or -ListFile required for Partial mode" -ForegroundColor Red + exit 1 +} + +# --- Temp dir --- +$tempDir = Join-Path $env:TEMP "db_load_xml_$(Get-Random)" +New-Item -ItemType Directory -Path $tempDir -Force | Out-Null + +try { + # --- Build arguments --- + $arguments = @("DESIGNER") + + if ($InfoBaseServer -and $InfoBaseRef) { + $arguments += "/S", "`"$InfoBaseServer/$InfoBaseRef`"" + } else { + $arguments += "/F", "`"$InfoBasePath`"" + } + + if ($UserName) { $arguments += "/N`"$UserName`"" } + if ($Password) { $arguments += "/P`"$Password`"" } + + $arguments += "/LoadConfigFromFiles", "`"$ConfigDir`"" + + if ($Mode -eq "Full") { + Write-Host "Executing full configuration load..." + } else { + Write-Host "Executing partial configuration load..." + + # Build list file + $generatedListFile = $null + if ($ListFile) { + # Use provided list file + if (-not (Test-Path $ListFile)) { + Write-Host "Error: list file not found: $ListFile" -ForegroundColor Red + exit 1 + } + $generatedListFile = $ListFile + } else { + # Generate from -Files parameter + $fileList = $Files -split ',' | ForEach-Object { $_.Trim() } | Where-Object { $_ } + $generatedListFile = Join-Path $tempDir "load_list.txt" + $utf8Bom = New-Object System.Text.UTF8Encoding($true) + [System.IO.File]::WriteAllLines($generatedListFile, $fileList, $utf8Bom) + + Write-Host "Files to load: $($fileList.Count)" + foreach ($f in $fileList) { Write-Host " $f" } + } + + $arguments += "-listFile", "`"$generatedListFile`"" + $arguments += "-partial" + $arguments += "-updateConfigDumpInfo" + } + + $arguments += "-Format", $Format + + # --- Extensions --- + if ($Extension) { + $arguments += "-Extension", "`"$Extension`"" + } elseif ($AllExtensions) { + $arguments += "-AllExtensions" + } + + # --- Output --- + $outFile = Join-Path $tempDir "load_log.txt" + $arguments += "/Out", "`"$outFile`"" + $arguments += "/DisableStartupDialogs" + + # --- Execute --- + Write-Host "Running: 1cv8.exe $($arguments -join ' ')" + $process = Start-Process -FilePath $V8Path -ArgumentList $arguments -NoNewWindow -Wait -PassThru + $exitCode = $process.ExitCode + + # --- Result --- + if ($exitCode -eq 0) { + Write-Host "Load completed successfully" -ForegroundColor Green + } else { + Write-Host "Error loading configuration (code: $exitCode)" -ForegroundColor Red + } + + if (Test-Path $outFile) { + $logContent = Get-Content $outFile -Raw -ErrorAction SilentlyContinue + if ($logContent) { + Write-Host "--- Log ---" + Write-Host $logContent + Write-Host "--- End ---" + } + } + + exit $exitCode + +} finally { + if (Test-Path $tempDir) { + Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue + } +} diff --git a/.claude/skills/db-run/SKILL.md b/.claude/skills/db-run/SKILL.md new file mode 100644 index 00000000..fc23d209 --- /dev/null +++ b/.claude/skills/db-run/SKILL.md @@ -0,0 +1,85 @@ +--- +name: db-run +description: Запуск 1С:Предприятие. Используй когда пользователь просит запустить 1С, открыть базу, запустить предприятие +argument-hint: [database] +allowed-tools: + - Bash + - Read + - Glob + - AskUserQuestion +--- + +# /db-run — Запуск 1С:Предприятие + +Запускает информационную базу в режиме 1С:Предприятие (пользовательский режим). + +## Usage + +``` +/db-run [database] +/db-run dev +/db-run dev /Execute process.epf +/db-run dev /C "параметр запуска" +``` + +## Разрешение базы данных + +1. Прочитай `.v8-project.json` (в корне проекта или ближайшем родительском каталоге) +2. Если пользователь указал базу — найди по id/alias/branch/имени +3. Если не указал — используй `default` +4. Если не найдено или неоднозначно — спроси пользователя +5. Если файл не найден — спроси пользователя параметры подключения и предложи создать `.v8-project.json` + +Автоопределение платформы (если `v8path` не задан): +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 +``` + +## Команда + +```cmd +"\1cv8.exe" ENTERPRISE /F "<база>" /N"" /P"" /DisableStartupDialogs +``` + +Для серверной базы вместо `/F` используй `/S`: +```cmd +"\1cv8.exe" ENTERPRISE /S "/" /N"" /P"" /DisableStartupDialogs +``` + +### Параметры + +| Параметр | Описание | +|----------|----------| +| `/Execute <файл.epf>` | Запуск внешней обработки сразу после старта | +| `/C <строка>` | Передача параметра в прикладное решение | +| `/URL <ссылка>` | Навигационная ссылка (формат `e1cib/...`) | + +> При указании `/Execute` параметр `/URL` игнорируется. + +## Важно + +**Запуск в фоне** — не жди завершения процесса 1С. Используй `Start-Process` без `-Wait`: + +```powershell +Start-Process -FilePath "\1cv8.exe" -ArgumentList 'ENTERPRISE /F "<база>" /N"" /P"" /DisableStartupDialogs' +``` + +Или через Bash: +```bash +"/1cv8.exe" ENTERPRISE /F "<база>" /N"" /P"" /DisableStartupDialogs & +``` + +## Примеры + +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 + +# Простой запуск +Start-Process -FilePath $v8.FullName -ArgumentList 'ENTERPRISE /F "C:\Bases\MyDB" /N"Admin" /P"" /DisableStartupDialogs' + +# Запуск с обработкой +Start-Process -FilePath $v8.FullName -ArgumentList 'ENTERPRISE /F "C:\Bases\MyDB" /N"Admin" /P"" /Execute "C:\epf\МояОбработка.epf" /DisableStartupDialogs' + +# Открыть по навигационной ссылке +Start-Process -FilePath $v8.FullName -ArgumentList 'ENTERPRISE /F "C:\Bases\MyDB" /N"Admin" /P"" /URL "e1cib/data/Справочник.Номенклатура" /DisableStartupDialogs' +``` diff --git a/.claude/skills/db-update/SKILL.md b/.claude/skills/db-update/SKILL.md new file mode 100644 index 00000000..c7e6f6d7 --- /dev/null +++ b/.claude/skills/db-update/SKILL.md @@ -0,0 +1,93 @@ +--- +name: db-update +description: Обновление конфигурации базы данных 1С. Используй когда пользователь просит обновить БД, применить конфигурацию, UpdateDBCfg +argument-hint: [database] +allowed-tools: + - Bash + - Read + - Glob + - AskUserQuestion +--- + +# /db-update — Обновление конфигурации БД + +Применяет изменения основной конфигурации к конфигурации базы данных (`/UpdateDBCfg`). Обязательный шаг после `/db-load-cf`, `/db-load-xml`, `/db-load-git`. + +## Usage + +``` +/db-update [database] +/db-update dev +/db-update dev -Dynamic+ +``` + +## Разрешение базы данных + +1. Прочитай `.v8-project.json` (в корне проекта или ближайшем родительском каталоге) +2. Если пользователь указал базу — найди по id/alias/branch/имени +3. Если не указал — используй `default` +4. Если не найдено или неоднозначно — спроси пользователя +5. Если файл не найден — спроси пользователя параметры подключения и предложи создать `.v8-project.json` + +Автоопределение платформы (если `v8path` не задан): +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 +``` + +## Команда + +```cmd +"\1cv8.exe" DESIGNER /F "<база>" /N"" /P"" /UpdateDBCfg /DisableStartupDialogs /Out "<лог>" +``` + +Для серверной базы вместо `/F` используй `/S`: +```cmd +"\1cv8.exe" DESIGNER /S "/" /N"" /P"" /UpdateDBCfg /DisableStartupDialogs /Out "<лог>" +``` + +### Параметры + +| Параметр | Описание | +|----------|----------| +| `/UpdateDBCfg` | Обновить конфигурацию БД | +| `-Dynamic+` | Динамическое обновление (без монопольного доступа) | +| `-Dynamic-` | Отключить динамическое обновление | +| `-Server` | Обновление на стороне сервера | +| `-WarningsAsErrors` | Предупреждения считать ошибками | +| `-Extension <имя>` | Обновить расширение | +| `-AllExtensions` | Обновить все расширения | + +### Фоновое обновление (серверная база) + +| Параметр | Описание | +|----------|----------| +| `-BackgroundStart` | Начать фоновое обновление | +| `-BackgroundFinish` | Дождаться окончания | +| `-BackgroundCancel` | Отменить | +| `-BackgroundSuspend` | Приостановить | +| `-BackgroundResume` | Возобновить | + +## Коды возврата + +| Код | Описание | +|-----|----------| +| 0 | Успешно | +| 1 | Ошибка (см. лог) | + +## Предупреждения + +- Если обновление **не динамическое** — потребуется **монопольный доступ** к базе (все пользователи должны выйти) +- Для серверных баз рекомендуется `-Dynamic+` для обновления без остановки +- Если структура данных существенно изменилась (удаление реквизитов, изменение типов) — динамическое обновление может быть невозможно + +## Пример + +```powershell +$v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 + +# Обычное обновление +& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /P"" /UpdateDBCfg /DisableStartupDialogs /Out "update.log" + +# Динамическое обновление +& $v8.FullName DESIGNER /S "srv01/MyDB" /N"Admin" /P"secret" /UpdateDBCfg -Dynamic+ /DisableStartupDialogs /Out "update.log" +``` diff --git a/README.md b/README.md index 41eb300f..58585ad4 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ | Расширения (CFE) | 5 навыков `/cfe-*` | Создание, заимствование, перехват методов, валидация, анализ расширений | [Подробнее](docs/cfe-guide.md) | | Подсистемы (Subsystem) | 4 навыка `/subsystem-*` | Анализ, создание, редактирование, валидация подсистем конфигурации | — | | Командный интерфейс (CI) | 2 навыка `/interface-*` | Редактирование и валидация CommandInterface.xml подсистем | — | +| Базы данных (DB) | 9 навыков `/db-*` | Создание баз, загрузка/выгрузка конфигураций, обновление БД, загрузка из Git | [Подробнее](docs/db-guide.md) | | Утилиты | `/img-grid` | Наложение сетки на изображение для определения пропорций колонок | — | ## Требования @@ -46,7 +47,7 @@ - [XML-формат внешних отчётов](docs/1c-erf-spec.md) — отличия ERF от EPF, Properties, MainDataCompositionSchema - [Управляемая форма](docs/1c-form-spec.md) — Form.xml, элементы, команды, реквизиты - [Встроенная справка](docs/1c-help-spec.md) — Help.xml, HTML-страницы, кнопка справки на форме -- [Сборка и разборка EPF/ERF](docs/build-spec.md) — команды `1cv8.exe`, параметры, коды возврата +- [Пакетный режим конфигуратора 1С](docs/build-spec.md) — команды `1cv8.exe`, DESIGNER, ENTERPRISE, CREATEINFOBASE - [Табличный документ (MXL)](docs/1c-spreadsheet-spec.md) — XML-формат SpreadsheetDocument, совместимость версий - [MXL DSL](docs/mxl-dsl-spec.md) — JSON-формат описания макета для `/mxl-compile` и `/mxl-decompile` - [Form DSL](docs/form-dsl-spec.md) — JSON-формат описания формы для `/form-compile` @@ -112,6 +113,15 @@ ├── subsystem-validate/ # Валидация подсистемы ├── interface-edit/ # Редактирование CommandInterface.xml ├── interface-validate/ # Валидация CommandInterface.xml +├── db-list/ # Управление реестром баз данных +├── db-create/ # Создание информационной базы +├── db-dump-cf/ # Выгрузка конфигурации в CF +├── db-load-cf/ # Загрузка конфигурации из CF +├── db-dump-xml/ # Выгрузка конфигурации в XML +├── db-load-xml/ # Загрузка конфигурации из XML +├── db-update/ # Обновление конфигурации БД +├── db-run/ # Запуск 1С:Предприятие +├── db-load-git/ # Загрузка изменений из Git └── img-grid/ # Сетка для анализа изображений docs/ ├── epf-guide.md # Гайд: внешние обработки и отчёты @@ -122,12 +132,13 @@ docs/ ├── meta-guide.md # Гайд: объекты метаданных конфигурации ├── cf-guide.md # Гайд: корневые файлы конфигурации ├── cfe-guide.md # Гайд: расширения конфигурации (CFE) +├── db-guide.md # Гайд: базы данных 1С ├── 1c-epf-spec.md # Спецификация XML-формата (EPF) ├── 1c-erf-spec.md # Спецификация XML-формата (ERF) ├── 1c-form-spec.md # Спецификация управляемых форм ├── 1c-help-spec.md # Спецификация встроенной справки ├── 1c-config-objects-spec.md # Спецификация объектов конфигурации -├── build-spec.md # Спецификация сборки/разборки +├── build-spec.md # Пакетный режим конфигуратора 1С ├── 1c-spreadsheet-spec.md # Спецификация табличного документа ├── mxl-dsl-spec.md # Спецификация MXL DSL ├── form-dsl-spec.md # Спецификация Form DSL diff --git a/docs/build-spec.md b/docs/build-spec.md index 01880a65..8f3e8464 100644 --- a/docs/build-spec.md +++ b/docs/build-spec.md @@ -355,8 +355,3 @@ Documents/РеализацияТоваровУслуг/Forms/ФормаДоку | `V8_PATH` | Каталог `bin` платформы 1С (например, `C:\Program Files\1cv8\8.3.27.1859\bin`) | | `V8_BASE` | Путь к пустой ИБ для EPF-сборки (создаётся автоматически при первом запуске) | -## Claude Code Skills - -Сборка и разборка доступны как навыки Claude Code: -- `/epf-build` — сборка EPF из XML -- `/epf-dump` — разборка EPF в XML diff --git a/docs/db-guide.md b/docs/db-guide.md new file mode 100644 index 00000000..13f59b89 --- /dev/null +++ b/docs/db-guide.md @@ -0,0 +1,142 @@ +# Базы данных 1С + +Навыки группы `/db-*` позволяют управлять информационными базами 1С из Claude Code: создавать базы, загружать и выгружать конфигурации, обновлять БД, запускать предприятие, загружать изменения из Git. + +## Навыки + +| Навык | Скрипт | Описание | +|-------|:------:|----------| +| `/db-list` | — | Управление реестром баз (.v8-project.json) | +| `/db-create` | — | Создание информационной базы | +| `/db-dump-cf` | — | Выгрузка конфигурации в CF-файл | +| `/db-load-cf` | — | Загрузка конфигурации из CF-файла | +| `/db-dump-xml` | `.ps1` | Выгрузка конфигурации в XML-файлы (полная/инкрементальная/частичная) | +| `/db-load-xml` | `.ps1` | Загрузка конфигурации из XML-файлов (полная/частичная) | +| `/db-update` | — | Обновление конфигурации БД | +| `/db-run` | — | Запуск 1С:Предприятие | +| `/db-load-git` | `.ps1` | Загрузка изменений из Git в базу | + +## Рабочий цикл + +``` +.v8-project.json → /db-create → /db-load-cf или /db-load-xml → /db-update → /db-run + ↑ + /db-dump-xml ←→ правки в исходниках → /db-load-git → /db-update +``` + +### Типичный цикл разработки + +1. **Настройка** — `/db-list add` зарегистрировать базу в `.v8-project.json` +2. **Создание** — `/db-create` создать базу (если нет) +3. **Загрузка** — `/db-load-xml` или `/db-load-cf` загрузить конфигурацию +4. **Обновление** — `/db-update` применить к БД +5. **Работа** — редактирование XML-исходников +6. **Синхронизация** — `/db-load-git` загрузить изменения из Git +7. **Обновление** — `/db-update` применить +8. **Запуск** — `/db-run` открыть предприятие + +## Формат `.v8-project.json` + +Файл размещается в корне проекта (рядом с `.git/`). + +```json +{ + "v8path": "C:\\Program Files\\1cv8\\8.3.25.1257\\bin", + "databases": [ + { + "id": "dev", + "name": "Разработка", + "type": "file", + "path": "C:\\Bases\\MyApp_Dev", + "user": "Admin", + "password": "", + "aliases": ["dev", "разработка"], + "branches": ["dev", "develop"], + "configSrc": "C:\\WS\\myapp\\cfsrc" + }, + { + "id": "test", + "name": "Тестовая", + "type": "server", + "server": "srv01", + "ref": "MyApp_Test", + "user": "Admin", + "password": "123", + "aliases": ["test", "тест"] + } + ], + "default": "dev" +} +``` + +### Поля базы данных + +| Поле | Тип | Обязательное | Описание | +|------|-----|:------------:|----------| +| `id` | string | да | Уникальный идентификатор | +| `name` | string | да | Имя | +| `type` | `"file"` / `"server"` | да | Тип подключения | +| `path` | string | для file | Каталог файловой базы | +| `server` | string | для server | Адрес сервера | +| `ref` | string | для server | Имя базы на сервере | +| `user` | string | нет | Пользователь 1С | +| `password` | string | нет | Пароль | +| `aliases` | string[] | нет | Альтернативные имена | +| `branches` | string[] | нет | Git-ветки | +| `configSrc` | string | нет | Каталог XML-выгрузки | + +### Разрешение базы + +Все навыки `db-*` используют единый алгоритм: id → alias → branch → name → default → спросить пользователя. + +## Сценарии использования + +### Создать базу и загрузить конфигурацию + +``` +> Создай файловую базу C:\Bases\Test и загрузи в неё конфигурацию из C:\WS\cfsrc +``` + +Claude вызовет `/db-create` → `/db-load-xml -Mode Full` → предложит `/db-update`. + +### Загрузить изменения из Git + +``` +> Загрузи мои последние правки в базу разработки +``` + +Claude вызовет `/db-load-git dev -Source All` → предложит `/db-update`. + +### Выгрузить конфигурацию + +``` +> Выгрузи конфигурацию из тестовой базы в C:\WS\cfsrc +``` + +Claude вызовет `/db-dump-xml test C:\WS\cfsrc -Mode Full`. + +### Работа с расширениями + +``` +> Выгрузи расширение МоёРасширение из базы dev в C:\WS\ext_src +``` + +Claude вызовет `/db-dump-xml dev C:\WS\ext_src -Extension МоёРасширение`. + +``` +> Загрузи расширение обратно в базу +``` + +Claude вызовет `/db-load-xml C:\WS\ext_src dev -Extension МоёРасширение` → предложит `/db-update -Extension МоёРасширение`. + +### Запустить предприятие + +``` +> Запусти базу разработки +``` + +Claude вызовет `/db-run dev`. + +## Спецификации + +- [build-spec.md](build-spec.md) — пакетный режим конфигуратора 1С (CREATEINFOBASE, DESIGNER, ENTERPRISE, параметры, коды возврата) From 9331aa78258a5e5e086fe88140dcf3b041f83673 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 15 Feb 2026 19:56:30 +0300 Subject: [PATCH 3/7] Add .v8-project.json to .gitignore Co-Authored-By: Claude Opus 4.6 --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index a6ba5eef..2d82609f 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ test-tmp/ # Локальные настройки Claude Code .claude/settings.local.json + +# Локальный реестр баз данных 1С +.v8-project.json From fcc85c9c6ef682e91c95335a5d2675622a25cd98 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 15 Feb 2026 20:05:37 +0300 Subject: [PATCH 4/7] fix(db): improve skill docs after comprehensive testing - Add Russian morphology-aware matching for aliases and names - Standardize empty password handling: omit /P entirely - Add server base examples to db-create, db-load-cf, db-dump-xml, db-load-git - Fix Unstaged description to include untracked files - Add Partial mode hint to db-dump-xml Co-Authored-By: Claude Opus 4.6 --- .claude/skills/db-create/SKILL.md | 5 ++++- .claude/skills/db-dump-xml/SKILL.md | 11 ++++++++--- .claude/skills/db-list/SKILL.md | 6 +++--- .claude/skills/db-load-cf/SKILL.md | 10 +++++++--- .claude/skills/db-load-git/SKILL.md | 7 +++++-- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/.claude/skills/db-create/SKILL.md b/.claude/skills/db-create/SKILL.md index e6aad2af..28c8b426 100644 --- a/.claude/skills/db-create/SKILL.md +++ b/.claude/skills/db-create/SKILL.md @@ -68,7 +68,7 @@ allowed-tools: 2. Предложи зарегистрировать базу в `.v8-project.json` (через `/db-list add`) 3. Если указан шаблон `/UseTemplate` — предупреди что конфигурация будет загружена из шаблона -## Пример +## Примеры ```powershell $v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 @@ -76,6 +76,9 @@ $v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descen # Создать файловую базу & $v8.FullName CREATEINFOBASE File="C:\Bases\NewDB" /DisableStartupDialogs /Out "create.log" +# Создать серверную базу +& $v8.FullName CREATEINFOBASE Srvr="srv01";Ref="MyApp_Test" /DisableStartupDialogs /Out "create.log" + # Создать из шаблона CF & $v8.FullName CREATEINFOBASE File="C:\Bases\NewDB" /UseTemplate "C:\Templates\config.cf" /DisableStartupDialogs /Out "create.log" ``` diff --git a/.claude/skills/db-dump-xml/SKILL.md b/.claude/skills/db-dump-xml/SKILL.md index b21aa85c..a2972be2 100644 --- a/.claude/skills/db-dump-xml/SKILL.md +++ b/.claude/skills/db-dump-xml/SKILL.md @@ -78,18 +78,23 @@ powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.p | 0 | Успешно | | 1 | Ошибка (см. лог) | +> Если пользователь просит выгрузить конкретные объекты — используй `-Mode Partial` с `-Objects`. + ## Примеры ```powershell -# Полная выгрузка -powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -Password "" -ConfigDir "C:\WS\cfsrc" -Mode Full +# Полная выгрузка (файловая база) +powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Full # Инкрементальная выгрузка -powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Changes +powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Changes # Частичная выгрузка powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Mode Partial -Objects "Справочник.Номенклатура,Документ.Заказ" +# Серверная база +powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Dev" -UserName "Admin" -Password "secret" -ConfigDir "C:\WS\cfsrc" -Mode Full + # Выгрузка расширения powershell.exe -NoProfile -File .claude\skills\db-dump-xml\scripts\db-dump-xml.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\ext_src" -Mode Full -Extension "МоёРасширение" ``` diff --git a/.claude/skills/db-list/SKILL.md b/.claude/skills/db-list/SKILL.md index 3e6bb65a..be466520 100644 --- a/.claude/skills/db-list/SKILL.md +++ b/.claude/skills/db-list/SKILL.md @@ -87,9 +87,9 @@ allowed-tools: 1. Прочитай `.v8-project.json` (в корне проекта или ближайшем родительском каталоге) 2. Если пользователь указал базу — ищи совпадение в таком порядке: 1. По `id` (точное совпадение) - 2. По `aliases` (точное совпадение в массиве) + 2. По `aliases` (совпадение в массиве с учётом морфологии: «тестовую» = «тестовая» = «тестовой») 3. По `branches` (совпадение с текущей Git-веткой) - 4. По `name` (нечёткое совпадение) + 4. По `name` (нечёткое совпадение с учётом морфологии и регистра) 3. Если пользователь не указал базу — используй `default` 4. Если не найдено или неоднозначно — спроси пользователя 5. Если файл `.v8-project.json` не найден — спроси параметры подключения и предложи создать файл @@ -151,4 +151,4 @@ test Тестовая server srv01/MyApp_Test /N"" /P"" ``` -> **Важно**: между `/N` и именем пробела нет. Между `/P` и паролем пробела нет. Если пароль пустой — `/P""` или опустить `/P`. +> **Важно**: между `/N` и именем пробела нет. Между `/P` и паролем пробела нет. Если пароль пустой — опусти `/P` целиком. diff --git a/.claude/skills/db-load-cf/SKILL.md b/.claude/skills/db-load-cf/SKILL.md index dd6878fb..2b5556a9 100644 --- a/.claude/skills/db-load-cf/SKILL.md +++ b/.claude/skills/db-load-cf/SKILL.md @@ -66,13 +66,17 @@ $v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descen 1. Прочитай лог-файл и покажи результат 2. **Предложи выполнить `/db-update`** — загрузка CF обновляет только «основную» конфигурацию конфигуратора, для применения к БД нужен `/UpdateDBCfg` -## Пример +## Примеры ```powershell $v8 = Get-ChildItem "C:\Program Files\1cv8\*\bin\1cv8.exe" | Sort-Object -Descending | Select-Object -First 1 -& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /P"" /LoadCfg "C:\backup\config.cf" /DisableStartupDialogs /Out "load.log" +# Файловая база +& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /LoadCfg "C:\backup\config.cf" /DisableStartupDialogs /Out "load.log" + +# Серверная база +& $v8.FullName DESIGNER /S "srv01/MyApp_Test" /N"Admin" /P"secret" /LoadCfg "config.cf" /DisableStartupDialogs /Out "load.log" # Не забудь обновить БД после загрузки! -& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /P"" /UpdateDBCfg /DisableStartupDialogs /Out "update.log" +& $v8.FullName DESIGNER /F "C:\Bases\MyDB" /N"Admin" /UpdateDBCfg /DisableStartupDialogs /Out "update.log" ``` diff --git a/.claude/skills/db-load-git/SKILL.md b/.claude/skills/db-load-git/SKILL.md index 942c6ca0..908d4f5b 100644 --- a/.claude/skills/db-load-git/SKILL.md +++ b/.claude/skills/db-load-git/SKILL.md @@ -70,7 +70,7 @@ powershell.exe -NoProfile -File .claude\skills\db-load-git\scripts\db-load-git.p |--------|----------| | `All` | Все незафиксированные: staged + unstaged + untracked | | `Staged` | Только проиндексированные (git add) | -| `Unstaged` | Только изменённые но не проиндексированные | +| `Unstaged` | Изменённые но не проиндексированные + новые (untracked) файлы | | `Commit` | Файлы из диапазона коммитов (требует `-CommitRange`) | ### Логика маппинга BSL → XML @@ -96,12 +96,15 @@ powershell.exe -NoProfile -File .claude\skills\db-load-git\scripts\db-load-git.p ## Примеры ```powershell -# Загрузить все незафиксированные изменения +# Загрузить все незафиксированные изменения (файловая база) powershell.exe -NoProfile -File .claude\skills\db-load-git\scripts\db-load-git.ps1 -V8Path "C:\Program Files\1cv8\8.3.25.1257\bin" -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Source All # Только staged powershell.exe -NoProfile -File .claude\skills\db-load-git\scripts\db-load-git.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Source Staged +# Серверная база +powershell.exe -NoProfile -File .claude\skills\db-load-git\scripts\db-load-git.ps1 -InfoBaseServer "srv01" -InfoBaseRef "MyApp_Dev" -UserName "Admin" -Password "secret" -ConfigDir "C:\WS\cfsrc" -Source All + # Из диапазона коммитов powershell.exe -NoProfile -File .claude\skills\db-load-git\scripts\db-load-git.ps1 -InfoBasePath "C:\Bases\MyDB" -UserName "Admin" -ConfigDir "C:\WS\cfsrc" -Source Commit -CommitRange "HEAD~3..HEAD" From 38c0ce11a96cd01a989a9ce03373e0a4bcefd1bb Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 15 Feb 2026 20:14:20 +0300 Subject: [PATCH 5/7] fix: quote argument-hint values starting with [ in YAML frontmatter YAML parses [value] as array, not string. Added quotes to 7 SKILL.md files. Co-Authored-By: Claude Opus 4.6 --- .claude/skills/db-dump-cf/SKILL.md | 2 +- .claude/skills/db-dump-xml/SKILL.md | 2 +- .claude/skills/db-list/SKILL.md | 2 +- .claude/skills/db-load-git/SKILL.md | 2 +- .claude/skills/db-run/SKILL.md | 2 +- .claude/skills/db-update/SKILL.md | 2 +- .claude/skills/subsystem-compile/SKILL.md | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.claude/skills/db-dump-cf/SKILL.md b/.claude/skills/db-dump-cf/SKILL.md index de7ce9b1..2929d896 100644 --- a/.claude/skills/db-dump-cf/SKILL.md +++ b/.claude/skills/db-dump-cf/SKILL.md @@ -1,7 +1,7 @@ --- name: db-dump-cf description: Выгрузка конфигурации 1С в CF-файл. Используй когда пользователь просит выгрузить конфигурацию в CF, сохранить конфигурацию, сделать бэкап CF -argument-hint: [database] [output.cf] +argument-hint: "[database] [output.cf]" allowed-tools: - Bash - Read diff --git a/.claude/skills/db-dump-xml/SKILL.md b/.claude/skills/db-dump-xml/SKILL.md index a2972be2..d5a71060 100644 --- a/.claude/skills/db-dump-xml/SKILL.md +++ b/.claude/skills/db-dump-xml/SKILL.md @@ -1,7 +1,7 @@ --- name: db-dump-xml description: Выгрузка конфигурации 1С в XML-файлы. Используй когда пользователь просит выгрузить конфигурацию в файлы, XML, исходники, DumpConfigToFiles -argument-hint: [database] [outputDir] +argument-hint: "[database] [outputDir]" allowed-tools: - Bash - Read diff --git a/.claude/skills/db-list/SKILL.md b/.claude/skills/db-list/SKILL.md index be466520..db5c5786 100644 --- a/.claude/skills/db-list/SKILL.md +++ b/.claude/skills/db-list/SKILL.md @@ -1,7 +1,7 @@ --- name: db-list description: Управление реестром баз данных 1С (.v8-project.json). Используй когда пользователь говорит про базы данных, список баз, "добавь базу", "какие базы есть" -argument-hint: [add|remove|show] +argument-hint: "[add|remove|show]" allowed-tools: - Read - Write diff --git a/.claude/skills/db-load-git/SKILL.md b/.claude/skills/db-load-git/SKILL.md index 908d4f5b..98e678a8 100644 --- a/.claude/skills/db-load-git/SKILL.md +++ b/.claude/skills/db-load-git/SKILL.md @@ -1,7 +1,7 @@ --- name: db-load-git description: Загрузка изменений из Git в базу 1С. Используй когда пользователь просит загрузить изменения из гита, обновить базу из репозитория, partial load из коммита -argument-hint: [database] [source] +argument-hint: "[database] [source]" allowed-tools: - Bash - Read diff --git a/.claude/skills/db-run/SKILL.md b/.claude/skills/db-run/SKILL.md index fc23d209..9a6a40a5 100644 --- a/.claude/skills/db-run/SKILL.md +++ b/.claude/skills/db-run/SKILL.md @@ -1,7 +1,7 @@ --- name: db-run description: Запуск 1С:Предприятие. Используй когда пользователь просит запустить 1С, открыть базу, запустить предприятие -argument-hint: [database] +argument-hint: "[database]" allowed-tools: - Bash - Read diff --git a/.claude/skills/db-update/SKILL.md b/.claude/skills/db-update/SKILL.md index c7e6f6d7..ad8a39c8 100644 --- a/.claude/skills/db-update/SKILL.md +++ b/.claude/skills/db-update/SKILL.md @@ -1,7 +1,7 @@ --- name: db-update description: Обновление конфигурации базы данных 1С. Используй когда пользователь просит обновить БД, применить конфигурацию, UpdateDBCfg -argument-hint: [database] +argument-hint: "[database]" allowed-tools: - Bash - Read diff --git a/.claude/skills/subsystem-compile/SKILL.md b/.claude/skills/subsystem-compile/SKILL.md index 5f20f426..0e4ed2c7 100644 --- a/.claude/skills/subsystem-compile/SKILL.md +++ b/.claude/skills/subsystem-compile/SKILL.md @@ -1,7 +1,7 @@ --- name: subsystem-compile description: Создать подсистему 1С — XML-исходники из JSON-определения. Используй когда пользователь просит добавить подсистему (раздел) в конфигурацию -argument-hint: [-DefinitionFile | -Value ] -OutputDir [-Parent ] +argument-hint: "[-DefinitionFile | -Value ] -OutputDir [-Parent ]" allowed-tools: - Bash - Read From e29c184f8e7eae977e7f41f1cde5e87c6832dba3 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 15 Feb 2026 20:42:04 +0300 Subject: [PATCH 6/7] fix(meta-compile): fix invalid XML properties and improve JSON input flexibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A) XML bugs: skip FillFromFillingValue/FillValue for tabular attributes, emit Use=ForItem only for Catalog tabular sections (not Document). B) JSON input: accept "objectType" as alias for "type", normalize array-format tabularSections, add "Каталог" synonym for "Catalog". C) Update specs to match corrected behavior. Co-Authored-By: Claude Opus 4.6 --- .../meta-compile/scripts/meta-compile.ps1 | 45 ++++++++++++++----- docs/1c-config-objects-spec.md | 3 +- docs/meta-dsl-spec.md | 2 +- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index daabf518..ca8f5ac0 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -21,9 +21,15 @@ if (-not (Test-Path $JsonPath)) { $json = Get-Content -Raw -Encoding UTF8 $JsonPath $def = $json | ConvertFrom-Json +# Normalize field synonyms: accept "objectType" as alias for "type" +if (-not $def.type -and $def.objectType) { + $def | Add-Member -NotePropertyName "type" -NotePropertyValue $def.objectType +} + # Object type synonyms (Russian → English) $script:objectTypeSynonyms = @{ "Справочник" = "Catalog" + "Каталог" = "Catalog" "Документ" = "Document" "Перечисление" = "Enum" "Константа" = "Constant" @@ -601,11 +607,15 @@ function Emit-Attribute { X "$indent`t`t" X "$indent`t`t" - # FillFromFillingValue - X "$indent`t`tfalse" + # FillFromFillingValue — not for tabular section attributes + if ($context -ne "tabular") { + X "$indent`t`tfalse" + } - # FillValue - Emit-FillValue "$indent`t`t" $typeStr + # FillValue — not for tabular section attributes + if ($context -ne "tabular") { + Emit-FillValue "$indent`t`t" $typeStr + } # FillChecking $fillChecking = "DontCheck" @@ -672,8 +682,8 @@ function Emit-TabularSection { X "$indent`t`t" X "$indent`t`tDontCheck" Emit-TabularStandardAttributes "$indent`t`t" - # Use=ForItem only for Catalog/Document - if ($objectType -in @("Catalog","Document")) { + # Use=ForItem only for Catalog tabular sections (Document does not have Use) + if ($objectType -eq "Catalog") { X "$indent`t`tForItem" } X "$indent`t" @@ -2400,10 +2410,19 @@ if ($objType -in $typesWithAttrTS) { $attrs += Parse-AttributeShorthand $a } } - $tsSections = @{} + $tsSections = [ordered]@{} if ($def.tabularSections) { - $def.tabularSections.PSObject.Properties | ForEach-Object { - $tsSections[$_.Name] = @($_.Value) + # Normalize array format: [{name:"X", attributes:[...]}, ...] → {"X": [...]} + if ($def.tabularSections -is [array] -or $def.tabularSections.GetType().Name -eq "Object[]") { + foreach ($ts in $def.tabularSections) { + $tsName = $ts.name + $tsCols = if ($ts.attributes) { @($ts.attributes) } else { @() } + $tsSections[$tsName] = $tsCols + } + } else { + $def.tabularSections.PSObject.Properties | ForEach-Object { + $tsSections[$_.Name] = @($_.Value) + } } } @@ -2764,7 +2783,13 @@ $valCount = 0 $colCount = 0 if ($def.attributes) { $attrCount = @($def.attributes).Count } -if ($def.tabularSections) { $tsCount = @($def.tabularSections.PSObject.Properties).Count } +if ($def.tabularSections) { + if ($def.tabularSections -is [array] -or $def.tabularSections.GetType().Name -eq "Object[]") { + $tsCount = @($def.tabularSections).Count + } else { + $tsCount = @($def.tabularSections.PSObject.Properties).Count + } +} if ($def.dimensions) { $dimCount = @($def.dimensions).Count } if ($def.resources) { $resCount = @($def.resources).Count } if ($def.values) { $valCount = @($def.values).Count } diff --git a/docs/1c-config-objects-spec.md b/docs/1c-config-objects-spec.md index ece3c3a1..cb33d19c 100644 --- a/docs/1c-config-objects-spec.md +++ b/docs/1c-config-objects-spec.md @@ -748,7 +748,8 @@ Ext/ # Расширение конфигураци - + diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md index 9cac2986..a5792a15 100644 --- a/docs/meta-dsl-spec.md +++ b/docs/meta-dsl-spec.md @@ -167,7 +167,7 @@ JSON DSL для описания объектов метаданных конф Ключ — имя табличной части, значение — массив реквизитов (в строковой или объектной форме). -Для Catalog и Document добавляется `ForItem` в Properties табличной части. +Для Catalog добавляется `ForItem` в Properties табличной части. Для Document Use не применяется. --- From 7003a46ad04a223e26d29108cb6201e976aff6be Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sun, 15 Feb 2026 22:57:35 +0300 Subject: [PATCH 7/7] fix(meta): emit attribute properties based on stored/non-stored object context DataProcessor/Report attributes incorrectly included Indexing, FullTextSearch, DataHistory, FillFromFillingValue, FillValue, and Use properties. Added "processor" and "processor-tabular" contexts to both meta-compile and meta-edit. Also fixed Use emitted for Document (should be Catalog-only). Co-Authored-By: Claude Opus 4.6 --- .../meta-compile/scripts/meta-compile.ps1 | 36 ++++++++++-------- .../skills/meta-edit/scripts/meta-edit.ps1 | 37 +++++++++++-------- docs/1c-config-objects-spec.md | 9 ++++- docs/1c-epf-spec.md | 2 +- 4 files changed, 49 insertions(+), 35 deletions(-) diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1 index ca8f5ac0..943716e1 100644 --- a/.claude/skills/meta-compile/scripts/meta-compile.ps1 +++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1 @@ -577,7 +577,7 @@ function Emit-TabularStandardAttributes { function Emit-Attribute { param([string]$indent, $parsed, [string]$context) - # $context: "catalog", "document", "tabular", "register" + # $context: "catalog", "document", "object", "processor", "tabular", "processor-tabular", "register" $uuid = New-Guid-String X "$indent" X "$indent`t" @@ -607,13 +607,13 @@ function Emit-Attribute { X "$indent`t`t" X "$indent`t`t" - # FillFromFillingValue — not for tabular section attributes - if ($context -ne "tabular") { + # FillFromFillingValue — not for tabular/processor (non-stored objects don't have these) + if ($context -notin @("tabular", "processor")) { X "$indent`t`tfalse" } - # FillValue — not for tabular section attributes - if ($context -ne "tabular") { + # FillValue — not for tabular/processor + if ($context -notin @("tabular", "processor")) { Emit-FillValue "$indent`t`t" $typeStr } @@ -632,20 +632,22 @@ function Emit-Attribute { X "$indent`t`t" X "$indent`t`tAuto" - # Use — only for catalog/document top-level attributes - if ($context -eq "catalog" -or $context -eq "document") { + # Use — only for catalog top-level attributes + if ($context -eq "catalog") { X "$indent`t`tForItem" } - # Indexing - $indexing = "DontIndex" - if ($parsed.flags -contains "index") { $indexing = "Index" } - if ($parsed.flags -contains "indexadditional") { $indexing = "IndexWithAdditionalOrder" } - if ($parsed.indexing) { $indexing = $parsed.indexing } - X "$indent`t`t$indexing" + # Indexing/FullTextSearch/DataHistory — not for non-stored objects (processor, processor-tabular) + if ($context -notin @("processor", "processor-tabular")) { + $indexing = "DontIndex" + if ($parsed.flags -contains "index") { $indexing = "Index" } + if ($parsed.flags -contains "indexadditional") { $indexing = "IndexWithAdditionalOrder" } + if ($parsed.indexing) { $indexing = $parsed.indexing } + X "$indent`t`t$indexing" - X "$indent`t`tUse" - X "$indent`t`tUse" + X "$indent`t`tUse" + X "$indent`t`tUse" + } X "$indent`t" X "$indent" @@ -688,10 +690,11 @@ function Emit-TabularSection { } X "$indent`t" + $tsContext = if ($objectType -in @("DataProcessor","Report")) { "processor-tabular" } else { "tabular" } X "$indent`t" foreach ($col in $columns) { $parsed = Parse-AttributeShorthand $col - Emit-Attribute "$indent`t`t" $parsed "tabular" + Emit-Attribute "$indent`t`t" $parsed $tsContext } X "$indent`t" @@ -2447,6 +2450,7 @@ if ($objType -in $typesWithAttrTS) { $context = switch ($objType) { "Catalog" { "catalog" } "Document" { "document" } + { $_ -in @("DataProcessor","Report") } { "processor" } default { "object" } } foreach ($a in $attrs) { diff --git a/.claude/skills/meta-edit/scripts/meta-edit.ps1 b/.claude/skills/meta-edit/scripts/meta-edit.ps1 index 39e6525c..a41de7c2 100644 --- a/.claude/skills/meta-edit/scripts/meta-edit.ps1 +++ b/.claude/skills/meta-edit/scripts/meta-edit.ps1 @@ -660,6 +660,7 @@ function Get-AttributeContext { "Catalog" { return "catalog" } "Document" { return "document" } { $_ -in @("InformationRegister","AccumulationRegister","AccountingRegister","CalculationRegister") } { return "register" } + { $_ -in @("DataProcessor","Report","ExternalDataProcessor","ExternalReport") } { return "processor" } default { return "object" } } } @@ -698,8 +699,8 @@ function Build-AttributeFragment { $sb.AppendLine("$indent`t`t") | Out-Null $sb.AppendLine("$indent`t`t") | Out-Null - # FillFromFillingValue — for catalog/document/object contexts - if ($context -ne "register") { + # FillFromFillingValue/FillValue — not for register, tabular (config TS), or processor (non-stored top-level) + if ($context -notin @("register", "tabular", "processor")) { $sb.AppendLine("$indent`t`tfalse") | Out-Null $sb.AppendLine($(Build-FillValueXml "$indent`t`t" $typeStr)) | Out-Null } @@ -719,20 +720,22 @@ function Build-AttributeFragment { $sb.AppendLine("$indent`t`t") | Out-Null $sb.AppendLine("$indent`t`tAuto") | Out-Null - # Use — catalog/document only - if ($context -eq "catalog" -or $context -eq "document") { + # Use — catalog only + if ($context -eq "catalog") { $sb.AppendLine("$indent`t`tForItem") | Out-Null } - # Indexing - $indexing = "DontIndex" - if ($parsed.flags -contains "index") { $indexing = "Index" } - if ($parsed.flags -contains "indexadditional") { $indexing = "IndexWithAdditionalOrder" } - if ($parsed.indexing) { $indexing = $parsed.indexing } - $sb.AppendLine("$indent`t`t$indexing") | Out-Null + # Indexing/FullTextSearch/DataHistory — not for non-stored objects (processor, processor-tabular) + if ($context -notin @("processor", "processor-tabular")) { + $indexing = "DontIndex" + if ($parsed.flags -contains "index") { $indexing = "Index" } + if ($parsed.flags -contains "indexadditional") { $indexing = "IndexWithAdditionalOrder" } + if ($parsed.indexing) { $indexing = $parsed.indexing } + $sb.AppendLine("$indent`t`t$indexing") | Out-Null - $sb.AppendLine("$indent`t`tUse") | Out-Null - $sb.AppendLine("$indent`t`tUse") | Out-Null + $sb.AppendLine("$indent`t`tUse") | Out-Null + $sb.AppendLine("$indent`t`tUse") | Out-Null + } $sb.AppendLine("$indent`t") | Out-Null $sb.Append("$indent") | Out-Null @@ -804,8 +807,8 @@ function Build-TabularSectionFragment { $sb.AppendLine("$indent`t`t`t") | Out-Null $sb.AppendLine("$indent`t`t") | Out-Null - # Use — catalog/document only - if ($objType -in @("Catalog","Document")) { + # Use — catalog only + if ($objType -eq "Catalog") { $sb.AppendLine("$indent`t`tForItem") | Out-Null } @@ -817,11 +820,12 @@ function Build-TabularSectionFragment { elseif ($tsDef.attributes) { $columns = @($tsDef.attributes) } elseif ($tsDef.реквизиты) { $columns = @($tsDef.реквизиты) } + $tsAttrContext = if ($script:objType -in @("DataProcessor","Report","ExternalDataProcessor","ExternalReport")) { "processor-tabular" } else { "tabular" } if ($columns.Count -gt 0) { $sb.AppendLine("$indent`t") | Out-Null foreach ($col in $columns) { $colParsed = Parse-AttributeShorthand $col - $sb.AppendLine($(Build-AttributeFragment $colParsed "tabular" "$indent`t`t")) | Out-Null + $sb.AppendLine($(Build-AttributeFragment $colParsed $tsAttrContext "$indent`t`t")) | Out-Null } $sb.AppendLine("$indent`t") | Out-Null } else { @@ -1816,7 +1820,8 @@ function Modify-ChildElements($modifyDef, [string]$childType) { continue } $tsAttrIndent = Get-ChildIndent $tsChildObjEl - $fragmentXml = Build-AttributeFragment $parsed "tabular" $tsAttrIndent + $tsAttrContext = if ($script:objType -in @("DataProcessor","Report","ExternalDataProcessor","ExternalReport")) { "processor-tabular" } else { "tabular" } + $fragmentXml = Build-AttributeFragment $parsed $tsAttrContext $tsAttrIndent $nodes = Import-Fragment $fragmentXml $savedCO = $script:childObjectsEl $script:childObjectsEl = $tsChildObjEl diff --git a/docs/1c-config-objects-spec.md b/docs/1c-config-objects-spec.md index cb33d19c..e23a44f5 100644 --- a/docs/1c-config-objects-spec.md +++ b/docs/1c-config-objects-spec.md @@ -716,9 +716,11 @@ Ext/ # Расширение конфигураци |---|---|---| | `Indexing` | enum | `DontIndex` \| `Index` \| `IndexWithAdditionalOrder` | | `ChoiceFoldersAndItems` | enum | `Items` \| `Folders` \| `FoldersAndItems` | -| `Use` | enum | `ForItem` \| `ForFolder` \| `ForFolderAndItem` (только для иерарх. справочников) | +| `Use` | enum | `ForItem` \| `ForFolder` \| `ForFolderAndItem` (только для справочников) | | `FillFromFillingValue` | boolean | Заполнять из значения по умолчанию | +> **Различие хранимых и нехранимых объектов**: Свойства `Indexing`, `FullTextSearch`, `DataHistory`, `FillFromFillingValue`, `FillValue` присутствуют только у **хранимых** объектов (Catalog, Document, ExchangePlan, ChartOf*, BusinessProcess, Task). У объектов DataProcessor и Report (как в конфигурации, так и внешних EPF/ERF) эти свойства **отсутствуют**. Свойство `Use` есть только у справочников (Catalog). + ### 6.2. Табличная часть (TabularSection) ```xml @@ -749,7 +751,10 @@ Ext/ # Расширение конфигураци + но без FillFromFillingValue, FillValue, Use. + У нехранимых объектов (DataProcessor, Report) реквизиты ТЧ + содержат FillFromFillingValue и FillValue, но не содержат + Indexing, FullTextSearch, DataHistory --> diff --git a/docs/1c-epf-spec.md b/docs/1c-epf-spec.md index a36734f7..2bba27bd 100644 --- a/docs/1c-epf-spec.md +++ b/docs/1c-epf-spec.md @@ -314,7 +314,7 @@ xmlns="http://v8.1c.ru/8.3/xcf/logform" ``` -> **Важно**: Реквизиты табличных частей имеют 2 дополнительных свойства по сравнению с реквизитами объекта: `FillFromFillingValue` и `FillValue`. Они вставляются между `MaxValue` и `FillChecking`. +> **Важно**: Реквизиты табличных частей имеют 2 дополнительных свойства по сравнению с реквизитами объекта: `FillFromFillingValue` и `FillValue`. Они вставляются между `MaxValue` и `FillChecking`. При этом свойства `Indexing`, `FullTextSearch`, `DataHistory` и `Use` **отсутствуют** как у реквизитов объекта, так и у реквизитов ТЧ обработок/отчётов (в отличие от хранимых объектов конфигурации). ## 4. Метаданные формы (`Forms/<Имя>.xml`)