Индекс XML-выгрузки конфигурации 1С в один JSON - какие объекты есть, их реквизиты, табличные части, измерения и ресурсы регистров, экспортные методы общих модулей. Нужен другим навыкам для проверок, где объект сверяется с остальной конфигурацией
Installs into .claude/skills of the current project.
Are you the author of 1c Config Index?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/desko77-1c-config-index)
---
name: 1c-config-index
description: Индекс XML-выгрузки конфигурации 1С в один JSON - какие объекты есть, их реквизиты, табличные части, измерения и ресурсы регистров, экспортные методы общих модулей. Нужен другим навыкам для проверок, где объект сверяется с остальной конфигурацией
argument-hint: <ConfigPath> [-OutFile index.json] [-Detailed] | -IndexPath <файл> (-Object <FQN> | -Find <подстрока>)
allowed-tools:
- Bash
- Read
- Glob
---
# /config-index - индекс конфигурации 1С
Один проход по выгрузке, на выходе один JSON. Индекс отвечает на вопрос "что вообще есть в этой
конфигурации и из чего оно состоит" - и тем самым дает остальным навыкам то, чего им не хватало:
возможность проверить объект не сам по себе, а против остальной конфигурации.
Работает без EDT, без платформы и без запущенной базы - читает только файлы выгрузки. Построенный
индекс отвечает на точечные вопросы без повторного обхода - см. "Точечный запрос".
## Параметры
| Параметр | Обяз. | Умолч. | Описание |
|------------|:-----:|--------|-----------------------------------------------------------------|
| ConfigPath | для сборки | - | Каталог выгрузки (где лежит `Configuration.xml`) либо путь к нему |
| OutFile | нет | - | Куда записать индекс. Без него JSON печатается в stdout |
| Detailed | нет | - | Дописать в отчет имена ненайденных объектов и время сборки |
| IndexPath | для запроса | - | Готовый индекс, по которому выполняется точечный запрос |
| Object | нет | - | FQN объекта: напечатать его запись из индекса |
| Find | нет | - | Подстрока имени: напечатать FQN подходящих объектов |
## Команда
```powershell
powershell.exe -NoProfile -File "skills/1c-config-index/scripts/config-index.ps1" -ConfigPath "src" -OutFile "index.json"
```
```bash
python skills/1c-config-index/scripts/config-index.py -ConfigPath src -OutFile index.json
```
## Точечный запрос
Готовый индекс отвечает еще на два вопроса: какая запись у одного объекта и какие объекты носят
такое имя. Отвечает без обхода выгрузки - читает только файл индекса.
```powershell
powershell.exe -NoProfile -File "skills/1c-config-index/scripts/config-index.ps1" -IndexPath "index.json" -Object "Catalog.Контрагенты"
```
```bash
python skills/1c-config-index/scripts/config-index.py -IndexPath index.json -Find "Номенкл"
```
| Запрос | Вывод | Код возврата |
|---------------------------------|--------------------------------------------------------------------|--------------|
| `-Object <FQN>` | Запись объекта в формате и порядке ключей индекса | 0; объекта нет - в stderr `Object not found: <FQN>`, код 1 |
| `-Find <подстрока>` | FQN подходящих объектов по одному в строке, по возрастанию | 0; совпадений нет - пустой вывод, код 0 |
| Запрос вместе с доводом сборки, запрос без `-IndexPath`, `-IndexPath` без запроса | Ничего | Причина в stderr, код 2 |
| Индекс пустой, из пробелов или не разбирается | Ничего | В stderr `Index file could not be read: <файл>`, код 1 |
| Индекс разобран, но объектов в нем нет (`null`, массив, пустой объект) | Ничего | В stderr `Index file has no objects: <файл>`, код 1 |
И `-Object`, и `-Find` сверяют имя без учета регистра: имена метаданных 1С регистр не различают.
Порядок задан посимвольным сравнением, а не языковым: локали у портов разные, и на кириллице они
разошлись бы.
Брать запрос вместо чтения индекса стоит всегда, когда нужен один объект или список имен. Индекс
большой конфигурации весит мегабайты, и, прочитанный целиком, он занимает контекст агента; запись
одного объекта - сотни байт. Сборка при запросе не запускается: читается уже готовый файл.
## Что попадает в индекс
| Ключ | Что там |
|-----------------|---------------------------------------------------------------------------------|
| `format` | Версия схемы индекса. Читающий навык обязан ее проверять |
| `kind` | `configuration` либо `extension` - по `ConfigurationExtensionPurpose` |
| `name`, `version`, `namePrefix` | Имя конфигурации, версия, префикс имен расширения |
| `declared` | Состав `Configuration.xml`: тип -> список имен, в порядке записи |
| `objects` | Ключ `Тип.Имя` -> разбор объекта (см. ниже) |
| `types` | Все `GeneratedType` конфигурации: `CatalogRef.Контрагенты`, `DocumentObject.Накладная` и прочие |
| `commonModules` | Общий модуль -> список ЭКСПОРТНЫХ методов его `Ext/Module.bsl` |
| `missing` | Объявлено в `Configuration.xml`, но файла на диске нет |
| `unknownKinds` | Типы из `ChildObjects`, которых нет в карте типов |
Запись объекта несет только непустое: `attributes`, `standardAttributes`, `tabularSections`,
`standardTabularSections`, `dimensions`, `resources`, `addressingAttributes`, `accountingFlags`,
`extDimensionAccountingFlags`, `enumValues`, `forms`, `templates`, `commands`, `subsystems`,
`recalculations`, `columns`, `operations`, `urlTemplates`, `valueType`, `props` и `refs`. Пустые
корзины не пишутся: на конфигурации в тысячи объектов они дали бы мегабайты фигурных скобок.
Табличная часть записана как `{"attributes": {имя: [типы]}, "standardAttributes": [имена]}` -
собственные колонки и стандартные лежат рядом, но раздельно.
Стандартные реквизиты берутся из блока `StandardAttributes` самой выгрузки, а не из своей таблицы:
таблица разошлась бы с платформой молча. Имена там внутренние, английские (`Description`, `Code`,
`Period`) - и в путях данных формы они пишутся точно так же.
У реквизита хранится список типов с отброшенным префиксом пространства имен: `CatalogRef.Контрагенты`,
`string`, `decimal`. Ссылочный тип узнается по точке в имени.
`props` держит те свойства, которые нужны последующим проверкам: `Hierarchical`, `CodeLength`,
`DescriptionLength`, `RegisterType`, `Periodicity`, `WriteMode`, `ObjectBelonging` и флаги общего
модуля. `refs` - списки ссылок на другие объекты: состав подсистемы (`Content`), движения документа
(`RegisterRecords`), владельцы, основания, регистры последовательности.
Вложенная подсистема получает ключ с полным путем: `Subsystem.Основная.Subsystem.Справочники` -
именно так подсистема адресуется во всей конфигурации.
## Чего индекс НЕ делает
Он ничего не проверяет и ни на что не ругается, кроме одного: сообщает, что объект объявлен в
`Configuration.xml`, а файла нет. Проверки строятся ПОВЕРХ индекса в других навыках.
Он не разбирает формы, макеты и схемы компоновки - только перечисляет их имена. Не читает права
ролей. Не выводит типы выражений BSL и не понимает запросы: без платформы этого получить нельзя.
## Сколько это стоит
Замер на синтетической конфигурации: 3007 объектов, 3515 файлов, 43 МБ выгрузки, индекс на выходе
2.7 МБ.
| Порт | Время |
|------------|--------|
| python | ~2.5 с |
| powershell | ~16 с |
Разрыв объясняется стоимостью обхода XML в PowerShell, а не разной работой: оба порта дают
байт-в-байт одинаковый JSON, это закреплено кейсами. На больших конфигурациях брать python-порт.
## Как этим пользуются другие навыки
Индекс строится ОДИН раз на прогон и передается проверкам файлом. Обход каталога на каждую ссылку
превратил бы валидацию большой конфигурации в неприемлемо долгую.
```bash
python skills/1c-config-index/scripts/config-index.py -ConfigPath src -OutFile .cache/config-index.json
# дальше этот файл отдается навыкам-проверкам параметром -IndexPath
```
Расширение и частичная выгрузка - нормальное состояние: объект может ссылаться на то, чего в ЭТОЙ
выгрузке нет, потому что оно в основной конфигурации. Индекс это различает полем `kind`, а
проверяющий навык обязан на него смотреть - иначе на любом расширении утонет в ложных ошибках.
## Связанные навыки
- `1c-cf-info` - краткая сводка по конфигурации для человека; индекс же машинный и полный
- `1c-meta-info` - разбор одного объекта метаданных
- `1c-meta-validate`, `1c-cf-validate`, `1c-form-validate` - проверки, которые читают индекс