1c-query-validate

Проверка текста запроса 1С по выгрузке конфигурации - существуют ли таблицы, табличные части, виртуальные таблицы регистров и поля. Работает без платформы, по индексу от 1c-config-index

SKILL.md

GitHub

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