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

02.03.21

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

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

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

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

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

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

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

 

 

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

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

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

 

 

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

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

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

 

 

О реализации

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

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

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

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

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

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

 

См. также:

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

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

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

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

См. также

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

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

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

13000 руб.

02.09.2020    119918    656    389    

701

Infostart PrintWizard

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

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

18000 руб.

06.10.2023    7008    20    6    

37

Infostart УДиФ: Управление данными и формами

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

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

10000 руб.

10.11.2023    3246    10    1    

31

SALE! 30%

PowerTools

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

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

3600 2520 руб.

14.01.2013    177341    1070    0    

846

Многопоточность. Универсальный «Менеджер потоков» 2.1

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

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

5000 руб.

07.02.2018    99204    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    17914    6    8    

38

1С HTML Шаблоны / HTML Templates

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

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    27945    3    10    

14

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23490    15    15    

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

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