Структура запроса (Infostart Toolkit)

02.03.21

Разработка - Инструментарий разработчика

Описание механизма разбора запроса на части (дерево), используемого в IS Toolkit и Управляемой консоли отчетов

Для облегчения понимания и отладки больших запросов удобно разбить их на части - запросы пакетов, вложенные, объединения. Используется это в консолях запросов для  построения дерева и выполнения отдельных запросов. Идея не новая, уже были аналогичные реализации в конце разместил ссылки на них.

Реализация в Infostart Toolkit учитывает:

  • Запросы пакета
  • Вложенные запросы
  • Запросы объединений

Аналогичный механизм используется в проекте для сообщества Управляемой консоли отчетов (в Toolkit более отлажен)

Результат отображается в дереве запросов в виде подчиненных веток (обычно свернут). Картинка отражает тип используемого источника.

 

 

Для элементов структуры доступно:

  • Выполнение, выполнение с ВТ
  • Текст запроса (отображается без ВТ)
  • Используемые параметры (редактирование только в главном запросе)

Недоступно редактирование текста, в т.ч. конструктором

 

 

Производительность

Работает все быстро и хорошо на больших запросах. Например: Тестовый запрос - 750~ строк, 21 запрос в пакете, 18 вложенных запросов и содержащий 90 объединений, анализируется и отображается менее чем за 0.5 сек (на весьма слабеньком компьютере).

При необходимости в настройках можно отключить разбор структуры

 

 

О реализации

Для разбора запроса можно было использовать два варианта:

  1. Объект СхемаЗапроса (появился в платформе 8.3.5)
  2. Собственный парсер

Выбрал СхемуЗапроса со всеми ее недостатками, т.к. по пути 2 уже ходил и набил много шишек.

из проблем: не анализируются запросы в выражениях. Например: "В (<запрос>)"

ВЫБРАТЬ
	_ДемоНоменклатура.Ссылка КАК Ссылка
ИЗ
	Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
ГДЕ
	_ДемоНоменклатура.ВидНоменклатуры В
			(ВЫБРАТЬ
				_ДемоВидыНоменклатуры.Ссылка КАК Ссылка
			ИЗ
				Справочник._ДемоВидыНоменклатуры КАК _ДемоВидыНоменклатуры
			ГДЕ
				НЕ _ДемоВидыНоменклатуры.ПометкаУдаления)

Еще отдельная сложность - собрать все временные таблицы, используемые в части пакета.

 

См. также:

Визуальная структура запроса (Андрей Акулов)

Консоль запросов с графом - анализатор сложных запросов (Тарас Пачуашвили)

Дерево запросов Подсистема "Инструменты разработчика" v5.72 (Сергей Старых)

Разбор структура запроса дерево схема консоль инструмент программист анализ сложный

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159339    872    399    

861

SALE! 15%

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 7140 руб.

20.08.2024    7755    55    22    

66

Инструментарий разработчика Программист Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    23417    68    45    

117

SALE! 15%

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8500 руб.

10.11.2023    10406    36    20    

61

SALE! 15%

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 19980 руб.

06.10.2023    15385    35    7    

70

SALE! 35%

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3120 руб.

14.01.2013    187964    1138    0    

912

SALE! 15%

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 12750 руб.

07.10.2021    17298    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7692    8    35    

23
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 02.03.21 10:56
Сообщение было скрыто модератором.
...
2. kalyaka 1105 02.03.21 11:51 Сейчас в теме
сложность - собрать все временные таблицы, используемые в части пакета
С использованием "Схемы запроса" это не должно быть проблемой:
Найти временные таблицы можно перебрав все источники пакета:
Для Каждого ОператорВыбрать Из ЗапросПакета.Операторы Цикл
  Для Каждого Источник Из ОператорВыбрать.Источники Цикл
    ИмяТаблицы = Источник.Источник.ИмяТаблицы;
    Если ЗапросПакета.ДоступныеТаблицы.Найти("Временные таблицы").Состав.Найти(ИмяТаблицы) Тогда
      //  Это временная таблица
DrAku1a; ivanov660; Evg-Lylyk; +3 Ответить
3. Evg-Lylyk 4841 02.03.21 11:58 Сейчас в теме
(2) Спс, посмотрю. Может то что вы предлагаете лучше.
Проблема может быть использовании ВТ в выражении В которое Схемой не разбирается.
4. kalyaka 1105 02.03.21 12:11 Сейчас в теме
(3)Это да, тут платформа может дать только текст выражения. Однако из него можно вычленить образцы "ИЗ Таблица КАК Псевдоним" и уже от туда вытянуть имена используемых таблиц. Даже достаточно просто поискать по ключевому слову ИЗ и извлечь имена используемых таблиц, следуемых после.
5. Evg-Lylyk 4841 02.03.21 12:16 Сейчас в теме
(4) Решаемо, мне нужно было найти использование ВТ, искал в тексте ИЗ <Имя таблицы без .>
6. dhurricane 02.03.21 14:57 Сейчас в теме
А почему отказался от поддержки редактирования части запроса и его параметров? Слишком трудоемко?
7. Evg-Lylyk 4841 02.03.21 15:39 Сейчас в теме
(6) Не занимался и сложность конечно, есть такие мысли
Редактирование параметров не представляю сценарий когда это полезно
Редактирование части как то не очевидно будет происходить.
Сейчас можно выделить часть запроса и вызвать Конструктор (выделенного)
Могут быть ручные изменения, это уже отдельно нужно разбирать без схемызапроса.
Вот есть выделенный какой то вложенный запрос где его начало и конец в главном запросе.
8. Yashazz 4790 04.03.21 10:38 Сейчас в теме
Покамест то, что я вижу, не сильно отличается от штатного конструктора запросов платформы. И открытым остаётся вопрос, на кой всё это нужно. Я в своей системе анализа кода начал было такое, но оказалось нафиг не надо никому из коллег, потому бросил.
9. VVi3ard 52 27.12.21 18:48 Сейчас в теме
Подскажите не встречалось ли где функционала который на вход принимает текст запроса а на выходе дает структуру:
Имя поля / Список метаданных которые участвуют в формировании поля.

Например запрос (на базе СППР):

"ВЫБРАТЬ
	 |	ВерсииПроекта.Ссылка КАК Ссылка,
	 |	ВерсииПроекта.ДатаНачалаРазработки КАК ДатаНачалаРазработки,
	 |	ВЫБОР
	 |		КОГДА ВерсииПроекта.Владелец.Код > 10
	 |			ТОГДА 20
	 |		ИНАЧЕ 10
	 |	КОНЕЦ КАК Поле11
	 |ПОМЕСТИТЬ ВТ1
	 |ИЗ
	 |	Справочник.ВерсииПроекта КАК ВерсииПроекта
	 |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Проекты КАК Проекты
	 |		ПО ВерсииПроекта.Владелец = Проекты.Ссылка
	 |;
	 |
	 |////////////////////////////////////////////////////////////­////////////////////
	 |ВЫБРАТЬ
	 |	ВерсииПроекта.Ссылка КАК Ссылка,
	 |	ВерсииПроекта.Владелец КАК Владелец,
	 |	ВложенныйЗапрос.Ссылка.Владелец.ВариантНаправленияОшибокНаПроверку КАК СсылкаВладелецВариантНаправленияОшибокНаПроверку,
	 |	ВложенныйЗапрос.Поле1 КАК Поле1,
	 |	ВТ1.Поле11 КАК Поле11
	 |ИЗ
	 |	ВТ1 КАК ВТ1
	 |		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВерсииПроекта КАК ВерсииПроекта
	 |		ПО ВТ1.Ссылка = ВерсииПроекта.Ссылка
	 |		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	 |			ВерсииПроекта.Ссылка КАК Ссылка,
	 |			ВЫБОР
	 |				КОГДА ВерсииПроекта.Владелец.ЗакрывающийОшибки <> NULL
	 |					ТОГДА 1
	 |				ИНАЧЕ 2
	 |			КОНЕЦ КАК Поле1
	 |		ИЗ
	 |			Справочник.ВерсииПроекта КАК ВерсииПроекта) КАК ВложенныйЗапрос
	 |		ПО ВТ1.Ссылка = ВерсииПроекта.Ссылка

Поля:
Ссылка - формируется обращением к Справочник.ВерсииПроекта
Владелец - формируется обращением к Справочник.ВерсииПроекта + Справочник.Проекты. 
СсылкаВладелецВариантНаправленияОшибокНаПроверку, формируется обращением к Справочник.ВерсииПроекта + Справочник.Проекты + Перечисление.НаправленияОшибокНаПроверку 
Поле1 - Справочник.ВерсииПроекта + Справочник.Проекты + Перечисление.НаправленияОшибокНаПроверку + Справочник.Пользователи
Поле11 - Справочник.ВерсииПроекта + Справочник.Проекты 
Показать

Итого для запроса нужны:
Справочник.ВерсииПроекта
Справочник.Проекты
Перечисление.НаправленияОшибокНаПроверку
Справочник.Пользователи

Такой парсер очень помог бы при анализе сложных запросов, когда нужно понять какие данные вообще влияют на поле.
11. tormozit 7229 27.12.21 22:31 Сейчас в теме
13. tormozit 7229 28.12.21 10:01 Сейчас в теме
10. VVi3ard 52 27.12.21 18:52 Сейчас в теме
Это один из примеров использования информации о полях и их типах, так же можно например для поля построить дерево полей которые влияют на данное поле (с указанием источника этого поля).

Все существующие парсеры почему то останавливаются на уровне таблиц не затрагивая поля.
12. Evg-Lylyk 4841 28.12.21 09:10 Сейчас в теме
(9) И того что знаю
Есть объектная модель схема запроса можно попробовать из нее собрать (правда есть ограничения)
и Консоль с графом автор упоминал что делает разбор по полям, но пока решения нет.
Еще можно глянуть виз. структура в решениях Андрея Акулова
14. VVi3ard 52 28.12.21 12:10 Сейчас в теме
(9),(12) Спасибо, посмотрю, пока обошелся регуляркой, но там повезло что запрос простой и все основное в последнем пакете происходит, не было необходимости разбирать подзапросы.
(9)
Функционал в ИР выглядит перспективно, правда падает если вызывается для поля не ссылочного типа, но в целом там есть с чем работать, большое спасибо за помощь. Ошибка такая:
Значение не является значением объектного типа (ВложенныйПакет)
{ИнструментыРазработчикаTormozit Обработка.ирКлсПолеТекстовогоДокументаСКонтекстнойПодсказкой.Форма.КонструкторЗапроса.Форма(11665)}: Если ВыбраннаяТаблица.ВложенныйПакет <> Неопределено Тогда
{ИнструментыРазработчикаTormozit Обработка.ирКонсольКомпоновокДанных.Форма.Форма.Форма(3317)}: НаборПолей = КонструкторЗапроса.ВлияющиеНаВыбранноеПолеПоляМетаданных("" + ПолеНабора.Поле);
{ИнструментыРазработчикаTormozit Обработка.ирКонсольКомпоновокДанных.Форма.Форма.Форма(3852)}: ОткрытьАнализПравДоступа("" + ДоступноеПоле.Поле);

Вечером посмотрю ещё подробнее.

(12)
по https://infostart.ru/public/1293224/ классический вариант с парсингом таблиц.
https://infostart.ru/public/617990/ так же, но сама разаработка очень интересно сделана есть чему поучиться.

Есть объектная модель схема запроса можно попробовать из нее собрать (правда есть ограничения)


Собственно на ней + регулярка я и решил текущую задачу, но тут просто повезло что нет глубокой вложенности и удалось решить так.
Более сложные запросы тоже можно через схему разбирать, но уже масса сложностей появляется, хотя может если посидеть по думать какие то углы можно будет срезать.
15. tormozit 7229 28.12.21 13:20 Сейчас в теме
(14) Ошибки по ИР регистрировать надо.
Оставьте свое сообщение