При сопровождении и доработке типовых конфигураций 1С разработчики регулярно сталкиваются с объемными пакетными запросами на десятки подзапросов и тысячи строк текста. Читать такой код линейно крайне трудоемко: сложно отследить цепочки передачи данных между временными таблицами, порядок наложения левых и внутренних соединений, а также структуру условий. Разберем практические способы решения этой задачи — от штатных средств платформы до программного построения графов зависимостей.
Штатный конструктор запросов платформы 1С предоставляет встроенные визуальные средства для отображения связей между источниками данных в рамках одного подзапроса.
Разберем по шагам, как получить наглядную схему связей:
Ограничение метода: штатный конструктор показывает связи только внутри текущего активного запроса выборки. Если пакет содержит последовательное создание десятков временных таблиц, общую сквозную схему потоков данных конструктор не формирует.
Для детального разбора сложных пакетов запросов активно применяется режим структурного редактирования в специализированных консолях (например, в подсистеме «Инструменты разработчика»).
Рассмотрим, как работает этот подход:
УНИЧТОЖИТЬ и итоговые выборки выстраиваются в единую иерархическую структуру.Если требуется построить полноценную сквозную карту движения данных (Data Lineage) между всеми временными таблицами пакета, оптимально использовать встроенный объект платформы СхемаЗапроса. Он выполняет синтаксический разбор текста запроса на объектную модель без необходимости применения сложных регулярных выражений.
Проанализируем пример кода на языке 1С, который обходит пакет запросов и собирает граф зависимостей (какой подзапрос создает таблицу и какие подзапросы используют ее в качестве источника):
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса(ТекстЗапросаДляАнализа);
// Обходим все подзапросы пакета
Для НомерПодзапроса = 0 По Схема.ПакетЗапросов.Количество() - 1 Цикл
ЭлементПакета = Схема.ПакетЗапросов[НомерПодзапроса];
Если ТипЗнч(ЭлементПакета) = Тип("ЗапросВыбораСхемыЗапроса") Тогда
// Проверяем, помещается ли результат во временную таблицу
ИмяВременнойТаблицы = ЭлементПакета.ТаблицаДляПомещения;
Если ЗначениеЗаполнено(ИмяВременнойТаблицы) Тогда
Сообщить("Подзапрос №" + НомерПодзапроса + " создает временную таблицу: " + ИмяВременнойТаблицы);
КонецЕсли;
// Анализируем используемые источники данных
Для Каждого ОператорВыбора Из ЭлементПакета.Операторы Цикл
Для Каждого Источник Из ОператорВыбора.Источники Цикл
Сообщить(" Использует источник: " + Источник.Источник.Имя);
КонецЦикла;
КонецЦикла;
ИначеЕсли ТипЗнч(ЭлементПакета) = Тип("ЗапросУничтоженияТаблицыСхемыЗапроса") Тогда
Сообщить("Подзапрос №" + НомерПодзапроса + " уничтожает таблицу: " + ЭлементПакета.ИмяТаблицы);
КонецЕсли;
КонецЦикла;
Объектная модель СхемаЗапроса предоставляет доступ к следующим ключевым коллекциям:
ПакетЗапросов — упорядоченный список всех подзапросов пакета.Операторы — секции выборки, включая объединения (ОБЪЕДИНИТЬ ВСЕ).Источники и Соединения — физические и виртуальные таблицы, типы соединений и предикаты условий связей.Колонки, Группировка, УсловияОтбора — детальный состав полей и агрегатных выражений.Полученные в результате обхода СхемаЗапроса данные об узлах (таблицы) и связях (соединения, потоки данных) можно визуализировать непосредственно в интерфейсе управляемой формы 1С. Для этого используется элемент формы Поле HTML документа в связке с JavaScript-библиотеками визуализации графов или разметкой диаграмм.
Рассмотрим порядок реализации:
ПолеHTMLДокумента на форме обработки, предоставляя интерактивную масштабируемую диаграмму связей.При разработке в среде 1C:EDT доступен специализированный инструментарий для ориентации в больших текстах запросов:
Выбор конкретного инструмента зависит от решаемой задачи:
СхемаЗапроса с экспортом графа в визуальные форматы.