Проверка текста запроса 1С по выгрузке конфигурации - существуют ли таблицы, табличные части, виртуальные таблицы регистров и поля. Работает без платформы, по индексу от 1c-config-index
Installs into .claude/skills of the current project.
Are you the author of 1c Query Validate?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/desko77-1c-query-validate)
---
name: 1c-query-validate
description: Проверка текста запроса 1С по выгрузке конфигурации - существуют ли таблицы, табличные части, виртуальные таблицы регистров и поля. Работает без платформы, по индексу от 1c-config-index
argument-hint: <-QueryPath файл | -Query текст> -IndexPath index.json [-Detailed]
allowed-tools:
- Bash
- Read
- Glob
---
# /query-validate - проверка запроса по выгрузке
Берет текст запроса и индекс конфигурации, отвечает на один вопрос: все ли имена в запросе
существуют. Опечатка в имени таблицы или поля ловится до того, как запрос попадет в базу.
Работает без EDT, без платформы и без базы.
## Параметры
| Параметр | Обяз. | Умолч. | Описание |
|------------|:-----:|--------|--------------------------------------------------------------|
| QueryPath | * | - | Файл с текстом запроса |
| Query | * | - | Текст запроса прямо в аргументе |
| IndexPath | да | - | Индекс от `1c-config-index` |
| Detailed | нет | - | Показать счетчики проверенного даже когда есть замечания |
| MaxErrors | нет | 30 | Не выводить больше N замечаний |
\* Нужен ровно один из `QueryPath` и `Query`.
## Команда
```bash
python skills/1c-config-index/scripts/config-index.py -ConfigPath src -OutFile .cache/index.json
python skills/1c-query-validate/scripts/query-validate.py -QueryPath запрос.txt -IndexPath .cache/index.json
```
```powershell
powershell.exe -NoProfile -File "skills/1c-query-validate/scripts/query-validate.ps1" -QueryPath "запрос.txt" -IndexPath ".cache/index.json"
```
## Что проверяется
**Имена метаданных где угодно в тексте.** Двухчастное имя вида `Справочник.Контрагенты` проверяется
на существование объекта - в `ИЗ`, в `ВЫРАЗИТЬ ... КАК`, в `ССЫЛКА`, в `ЗНАЧЕНИЕ`, в условиях. Оба
языка запроса: `Catalog.Контрагенты` разбирается так же.
**Третья часть - только в позиции таблицы** (после `ИЗ`, `FROM`, `СОЕДИНЕНИЕ`, `JOIN`):
- у объектов - табличная часть: `Документ.Накладная.Товары`;
- у регистров - виртуальная таблица: `РегистрНакопления.Остатки.ОстаткиИОбороты`. Список закрытый,
незнакомое имя дает замечание.
Вне позиции таблицы третья часть не трогается: там она может быть значением перечисления
(`ЗНАЧЕНИЕ(Перечисление.Статусы.Новый)`), пустой ссылкой или предопределенным элементом.
**Поля по псевдонимам.** Из `ИЗ <таблица> КАК <псевдоним>` строится привязка, дальше каждое
`Псевдоним.Поле` сверяется с составом таблицы: реквизиты, измерения, ресурсы, признаки учета,
табличные части, стандартные поля.
Поля виртуальных таблиц выводятся из ресурсов по суффиксам: у `Остатки` это `<Ресурс>Остаток`, у
`Обороты` - `<Ресурс>Оборот`, `<Ресурс>Приход`, `<Ресурс>Расход`, у `ОстаткиИОбороты` - еще
`НачальныйОстаток` и `КонечныйОстаток`.
## Чего НЕ проверяется
Это не платформенная валидация запроса и заменой ей не служит. Без платформы недоступны типы
выражений, совместимость соединений, корректность агрегатов и план выполнения. Здесь только имена.
Намеренно пропускается:
- **псевдоним, привязанный не к таблице метаданных** - временная таблица (`ПОМЕСТИТЬ ВТ_Имя`),
вложенный запрос, внешний источник данных. Состав их полей задается самим запросом;
- **псевдоним таблицы, которой нет в конфигурации** - иначе одна опечатка в имени таблицы
породила бы замечание на каждое ее поле;
- **вторая и далее часть поля** (`Т.Ссылка.Контрагент`) - навигация по ссылке требует разрешать
типы цепочкой;
- **параметры виртуальных таблиц** в скобках;
- **строковые литералы и комментарии** вырезаются до разбора: внутри них `Справочник.Что-Нибудь` -
просто текст.
Стандартные поля принимаются ОБЩИМ списком, а не по видам объектов: у справочника пройдет и
`Проведен`. Так сделано намеренно - неверная привязка поля к виду дала бы ложное срабатывание, а
лишнее имя в списке дает всего лишь пропуск.
Индекс должен быть построен по ПОЛНОЙ выгрузке. На частичной (выгружена часть объектов) проверка
будет сообщать об объектах, оставшихся снаружи, - отличить такую выгрузку от конфигурации с битой
ссылкой по файлам нельзя. У расширения признак есть (`ConfigurationExtensionPurpose`), и там
формулировка мягче.
Все замечания - предупреждения, код возврата всегда 0. Проверка кросс-объектная и молодая, а
валидатор, однажды выдавший ложную ошибку, выключается целиком.
## Связанные навыки
- `1c-config-index` - строит индекс, без него проверка не работает
- `composing-1c-queries` - как писать запросы: синтаксис, функции, подводные камни
- `1c-query-optimization` - разбор производительности запроса
- `1c-skd-validate` - проверка схемы компоновки, включая запросы ее наборов данных