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

02.03.21

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

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

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

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

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

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

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

 

 

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

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

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

 

 

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

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

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

 

 

О реализации

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

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

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

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

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

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

 

См. также:

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

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

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

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

См. также

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

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    169292    937    403    

905

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

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

8400 руб.

20.08.2024    12610    99    42    

101

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

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

9360 руб.

17.05.2024    26537    90    48    

134

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

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

22200 руб.

06.10.2023    16829    41    15    

75

SALE! %

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

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

4800 3840 руб.

14.01.2013    190552    1150    0    

918

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

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

15000 руб.

10.11.2023    11396    40    27    

66

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

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    778    2    0    

4

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

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    103927    244    100    

306
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 02.03.21 10:56
Сообщение было скрыто модератором.
...
2. kalyaka 1114 02.03.21 11:51 Сейчас в теме
сложность - собрать все временные таблицы, используемые в части пакета
С использованием "Схемы запроса" это не должно быть проблемой:
Найти временные таблицы можно перебрав все источники пакета:
Для Каждого ОператорВыбрать Из ЗапросПакета.Операторы Цикл
  Для Каждого Источник Из ОператорВыбрать.Источники Цикл
    ИмяТаблицы = Источник.Источник.ИмяТаблицы;
    Если ЗапросПакета.ДоступныеТаблицы.Найти("Временные таблицы").Состав.Найти(ИмяТаблицы) Тогда
      //  Это временная таблица
DrAku1a; ivanov660; Evg-Lylyk; +3 Ответить
3. Evg-Lylyk 4894 02.03.21 11:58 Сейчас в теме
(2) Спс, посмотрю. Может то что вы предлагаете лучше.
Проблема может быть использовании ВТ в выражении В которое Схемой не разбирается.
4. kalyaka 1114 02.03.21 12:11 Сейчас в теме
(3)Это да, тут платформа может дать только текст выражения. Однако из него можно вычленить образцы "ИЗ Таблица КАК Псевдоним" и уже от туда вытянуть имена используемых таблиц. Даже достаточно просто поискать по ключевому слову ИЗ и извлечь имена используемых таблиц, следуемых после.
5. Evg-Lylyk 4894 02.03.21 12:16 Сейчас в теме
(4) Решаемо, мне нужно было найти использование ВТ, искал в тексте ИЗ <Имя таблицы без .>
6. dhurricane 02.03.21 14:57 Сейчас в теме
А почему отказался от поддержки редактирования части запроса и его параметров? Слишком трудоемко?
7. Evg-Lylyk 4894 02.03.21 15:39 Сейчас в теме
(6) Не занимался и сложность конечно, есть такие мысли
Редактирование параметров не представляю сценарий когда это полезно
Редактирование части как то не очевидно будет происходить.
Сейчас можно выделить часть запроса и вызвать Конструктор (выделенного)
Могут быть ручные изменения, это уже отдельно нужно разбирать без схемызапроса.
Вот есть выделенный какой то вложенный запрос где его начало и конец в главном запросе.
8. Yashazz 4801 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 7245 27.12.21 22:31 Сейчас в теме
13. tormozit 7245 28.12.21 10:01 Сейчас в теме
10. VVi3ard 52 27.12.21 18:52 Сейчас в теме
Это один из примеров использования информации о полях и их типах, так же можно например для поля построить дерево полей которые влияют на данное поле (с указанием источника этого поля).

Все существующие парсеры почему то останавливаются на уровне таблиц не затрагивая поля.
12. Evg-Lylyk 4894 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 7245 28.12.21 13:20 Сейчас в теме
(14) Ошибки по ИР регистрировать надо.
Оставьте свое сообщение