/query-validate - проверка запроса по выгрузке
Берет текст запроса и индекс конфигурации, отвечает на один вопрос: все ли имена в запросе существуют. Опечатка в имени таблицы или поля ловится до того, как запрос попадет в базу.
Работает без EDT, без платформы и без базы.
Параметры
| Параметр | Обяз. | Умолч. | Описание |
|---|---|---|---|
| QueryPath | * | - | Файл с текстом запроса |
| Query | * | - | Текст запроса прямо в аргументе |
| IndexPath | да | - | Индекс от 1c-config-index |
| Detailed | нет | - | Показать счетчики проверенного даже когда есть замечания |
| MaxErrors | нет | 30 | Не выводить больше N замечаний |
* Нужен ровно один из QueryPath и Query.
Команда
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.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- проверка схемы компоновки, включая запросы ее наборов данных