Как разбираться в больших запросах. Консоль запросов с временными таблицами. Как посмотреть, чем заполнены временные таблицы в запросе (1С: v8: Язык Запросов: просмотр Временных Таблиц)

Вопрос Как разбираться в больших запросах. Консоль запросов. Как посмотреть, чем заполнены временные таблицы в запросе?
Ответ
Довольно часто в типовых конфигурациях 1С встречаются очень большие сложные для восприятия запросы. Например, запрос автозаполнения документа «Начисление зарплаты» содержит в себе порядка 3000 строк. Не смотря на то, что благодаря использованию большого количества временных таблиц он достаточно структурирован и прозрачен логически, разбираться в нем довольно сложно из-за очень большого количества строк.
Есть 2 принципиально разных метода разбора таких запросов.

Первый метод – использование консоли запросов.
Стандартную консоль запросов можно взять на диске ИТС (просто выполните поиск по диску ИТС слов «Консоль запросов» и у вас появится сразу несколько ссылок на нее). Более удобные версии встречаются на различных сторонних сайтах. Уже не помню точно, откуда предлагаемый тут вариант консоли, но нам он показался самым удобным.

Здесь ее можно бесплатно скачать: [download id=»2″]

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

Чтобы разобраться в большом запросе с помощью консоли запросов,  разбейте запрос на части. Тогда можно будет сразу отслеживать результат выполнения каждой части. При этом в запросе будет удобнее разбираться, если соблюдать древовидную структуру, соответствующую структуре самого запроса и давать имена этим подзапросам по наименованиям вложенных таблиц (или по наименованиям временных таблиц), разбираемых в этой части запроса. Достаточно большой минус консоли запросов: требуется передача параметров запроса, при этом иногда параметром запроса может оказаться список значений или еще хуже – таблица значений.

Второй метод – для чтения промежуточных результатов запроса используется функция вида

Функция ДанныеЗапроса(Запрос, ИмяТаблицы) Экспорт
     ДанныеТаблицы = Новый Запрос;
     ДанныеТаблицы.МенеджерВременныхТаблиц = Запрос.МенеджерВременныхТаблиц;
     ДанныеТаблицы.Текст =
     "Выбрать *
     |    Из "+ИмяТаблицы+"
     |";
     Возврат ДанныеТаблицы.Выполнить().Выгрузить();
КонецФункции 

Эту функцию рекомендуем разместить во внешнем модуле. Тогда к ней можно будет обращаться из любого отлаживаемого запроса,  встроив в нужное место модуля строку вида:

втИмя = ДанныеЗапроса(Запрос, "втИмя");

где

Запрос – это исследуемый нами запрос,

втИмя – имя внутренней таблицы исследуемого запроса, в которой находятся данные, которые мы хотим посмотреть.

Теперь, если в табло сообщений ввести это втИмя и нажать F2, то откроется окно со значениями этой временной таблицы.

Либо бывает удобнее не встраивать в модуль строку вызова функции, а прямо в табло отладки написать обращение вида:

ДанныеЗапроса(Запрос, «втИмя»)

Точно так же можно нажать F2, спозиционировавшись в табло на этом обращении, откроется содержимое таблицы.

One thought on “Как разбираться в больших запросах. Консоль запросов с временными таблицами. Как посмотреть, чем заполнены временные таблицы в запросе (1С: v8: Язык Запросов: просмотр Временных Таблиц)

  1. Вопрос: Почему бы в функцию не передавать не весь запрос, а только текст запроса? При этом саму функцию написать так:

    Функция ДанныеЗапроса(ЗапросТекст, Имя)
    	Запрос = Новый Запрос;
    	Запрос.Текст = ЗапросТекст + «; ВЫБРАТЬ * ИЗ « + Имя;
    	Возврат Запрос.Выполнить().Выгрузить();
    КонецФункции
    

    При этом передавать в качестве параметра не сам запрос, а только его текст.

    Ответ: Дело в том, что в запросе могут быть параметры. Если передавать только текст запроса, то придется в этой функции определять еще и параметры запроса, т.к. мы тут же его и «выполняем». Поэтому такой способ подходит только для простейших запросов без параметров.

    Прежний код функции (но он хуже, т.к. может выдавать ошибку, что такая ВТ уже существует):

    Функция ДанныеЗапроса(Знач Запрос, Имя)
    	ИсходныйТекстЗапроса = Запрос.Текст; // запоминаем исходный текст запроса, чтобы не вернуть в модуль модифицированный, т.к. он может дальше еще использоваться
    	Запрос.Текст = Запрос.Текст + "; ВЫБРАТЬ * ИЗ " + Имя;
    	Результат = Запрос.Выполнить().Выгрузить();
    	Запрос.Текст = ИсходныйТекстЗапроса; // восстанавливаем исходный текст запроса
    	Возврат Результат;
    КонецФункции
    

    Примечание. В тексте функции запоминается и затем восстанавливается текст запроса. Дело в том, что если этого не сделать, то текст запроса переопределится, т.к. конструкция «Знач Запрос» защищает от переопределения объект «Запрос», но не защищает «Текст запроса».

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.