1c-query-validate · git:20260819.286b4b8 · 2026-08-19 · sha256 e17068625a509b60

1c-query-validate git:20260819.286b4b8A

Immutable. This exact content is served forever at /api/v1/blob/e17068625a509b60.

---
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` - проверка схемы компоновки, включая запросы ее наборов данных