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