gifts2017

Анализ сложных запросов с временными таблицами-2. Не такой мудреный.

Опубликовал ediks (ediks) в раздел Программирование - Практика программирования

Навеяно публикацией "Анализ сложных запросов с временными таблицами".

Долго пользовался предложенным методом http://infostart.ru/public/90130/ . Как-то не догадывался опубликовать Smile. Потом увидел запросник, идея понравилась, но не совсем понравился способ просмотра временных таблиц. Да и используется там консоль запросов, а я пользуюсь консолью отчетов. Я понимаю, что способов просмотра временных таблиц реализовано великое множество, но все же осмелюсь предложить велосипед свою доработку стандартной консоли отчетов для просмотра временных таблиц.

Код для вывода временных таблиц приведен ниже:

 

// формирует список временных таблиц из текста запроса
//
// Параметры
//
// Возвращаемое значение:
//   <Массив>   - массив наименований временных таблиц
//
Функция ПолучитьМассивНаименованийВременныхТаблиц() Экспорт

    МассивНаименований = Новый Массив;
    ТекстЗапроса = ПостроительОтчетов.Текст;// преобразуем к стандартному тексту запроса с форматированием
    Конструктор = Новый КонструкторЗапроса(ТекстЗапроса);
    ТекстЗапроса = Конструктор.Текст;

    Шаблон = "Поместить\s+[A-z0-9_А-я]+"; //Поместить + любое количество пробелов (TAB, CR,LF FF)+ следующее слово
    RegExp = Новый COMОбъект("VBScript.RegExp"); // создаем объект для работы  с регулярными выражениями
    RegExp.MultiLine = Истина;    // истина — текст многострочный, ложь — одна строка
    RegExp.Global = Истина;     // истина — поиск по всей строке, ложь — до первого совпадения
    RegExp.IgnoreCase = Истина; // истина — игнорировать регистр строки при поиске
    RegExp.Pattern = Шаблон;
    Если НЕ RegExp.Test(ТекстЗапроса) Тогда Возврат МассивНаименований КонецЕсли;
    МассивСтрок = RegExp.Execute(ТекстЗапроса);
    Для каждого Элемент  Из МассивСтрок Цикл
        МассивНаименований.Добавить(СокрЛП(СтрЗаменить(Элемент.Value, "ПОМЕСТИТЬ", "")));
    КонецЦикла;

    Возврат МассивНаименований;

КонецФункции // ПолучитьСписокВременныхТаблиц()

// формирование структуры временных таблицы
//
// Параметры
//
// Возвращаемое значение:
//   <Структура>   - структура, содержащая временные таблицы
//
Функция ПолучитьВременныеТаблицы() Экспорт

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

КонецФункции // ПолучитьВременныеТаблицы()

// формирование элементов формы для вывода таблицы
//
// Параметры
//
Процедура СоздатьСтраницуДляВыводаВременнойТаблицы(ЭлементСтруктуры)

    Наименование = ЭлементСтруктуры.Ключ;
    ТаблицаЗапроса = ЭлементСтруктуры.Значение;
    Страница = ЭлементыФормы.ПанельВременныхТаблиц.Страницы.Добавить();
    Страница.Имя = Наименование;
    Страница.Заголовок = Наименование;
    ЭлементыФормы.ПанельВременныхТаблиц.ТекущаяСтраница = Страница;
    ТабличноеПоле = ЭлементыФормы.Добавить(Тип("ТабличноеПоле"), Наименование, ,ЭлементыФормы.ПанельВременныхТаблиц);
    ТабличноеПоле.Верх = 0;
    ТабличноеПоле.Лево = 0;
    ТабличноеПоле.Ширина = ЭлементыФормы.ПанельВременныхТаблиц.Ширина - 2;
    ТабличноеПоле.Высота = ЭлементыФормы.ПанельВременныхТаблиц.Высота - 20;
    ТабличноеПоле.ТолькоПросмотр = Истина;

    ТабличноеПоле.УстановитьПривязку(ГраницаЭлементаУправления.Низ,
            ЭлементыФормы.ПанельВременныхТаблиц, ГраницаЭлементаУправления.Низ);
    ТабличноеПоле.УстановитьПривязку(ГраницаЭлементаУправления.Право,
            ЭлементыФормы.ПанельВременныхТаблиц, ГраницаЭлементаУправления.Право);

    ТабличноеПоле.Значение = ТаблицаЗапроса;
    ТабличноеПоле.СоздатьКолонки();

КонецПроцедуры // СоздатьСтраницуДляВыводаВременнойТаблицы()

// обработчик нажатия кнопки "Временные таблицы"
//
Процедура КоманднаяПанельФормыВременныеТаблицы(Кнопка)

    ЭлементыФормы.ПанельВременныхТаблиц.Страницы.Очистить();
    СтруктураВременныхТаблиц = ПолучитьВременныеТаблицы();
    Для каждого Значение Из СтруктураВременныхТаблиц Цикл
        СоздатьСтраницуДляВыводаВременнойТаблицы(Значение);
    КонецЦикла;
    ЭлементыФормы.ПанельРезультатов.ТекущаяСтраница = ЭлементыФормы.ПанельРезультатов.Страницы.ВременныеТаблицы;
    ЭлементыФормы.ПанельВременныхТаблиц.Страницы.Удалить(0);// первая страница не нужна.

КонецПроцедуры

 

И не забыть добавить на форму страницу ПанельВременныхТаблиц, кнопку и повесить на нее обработчик.

Изменение от 25.09.2011
Добавлен файл с измененной обработкой "Консоль отчетов" для 8.1 с диска ИТС. В консоль добавлен функционал вывода временных таблиц для СКД.
Существующие ограничения: показ временных таблиц возможен только для первого набора данных типа "Запрос".

Скачать файлы

Наименование Файл Версия Размер
Консоль отчетов 8.1 23
.erf 53,05Kb
25.09.11
23
.erf 53,05Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
0. ediks (ediks) 21.09.11 15:54
Навеяно публикацией "Анализ сложных запросов с временными таблицами".

Перейти к публикации

1. Олег Крапивный (powerpc) 21.09.11 15:54
Вставил в стандартную Консоль Отчетов с диска ИТС. При записи в Конфигураторе ругается:


{Форма.Форма.Форма(1395,17)}: Переменная не определена (ПостроительОтчетов)
ТекстЗапроса = <<?>>ПостроительОтчетов.Текст; (Проверка: Толстый клиент (обычное приложение))
{Форма.Форма.Форма(1427,11)}: Переменная не определена (ПостроительОтчетов)
Запрос = <<?>>ПостроительОтчетов.ПолучитьЗапрос(); (Проверка: Толстый клиент (обычное приложение))

Подскажите в чем дело ?
2. ediks (ediks) 22.09.11 08:10
Сейчас посмотрел - действительно на ИТС сейчас другая обработка "Консоль отчетов". У меня скорее всего используется обработка, которая была еще в 8.0. Собственно, это показано на картинке.
3. Олег Крапивный (powerpc) 22.09.11 09:45
А можно как-то адаптировать под 8.2 ? Очень нужно, так как удобная вещь
4. Олег Крапивный (powerpc) 26.09.11 09:45
После обновления под 8.1 скачал. Сконвертировал под 8.2. Так классно работает, слов нет. Молодец. Классно сделал. Жаль нельзя еще плюсиков поставить. Спасибо тебе большое, ediks.
5. Андрей Акулов (DrAku1a) 17.05.12 05:45
Все это уже давно сделал и автор Запросника, и я в своей обработке "Выполнение и отладка запроса" (на вкладке "Результат" есть кнопка "Временные таблицы").
Способ использован именно такой как в Вашей публикации, за исключением того, что я не пользовался RegExp, т.к. не силен в регулярных выражениях (но чувствую необходимость исправить этот недочет).
6. ediks (ediks) 17.05.12 07:40
(5) Больше консолей хороших и разных!!! :).
Ну, а если по существу, то я вообще не собирался выкладывать никакие консоли. Эта публикация была задумывалась как статья к статье. Просто человек хороший попросил переделать родную консоль с ИТС. Собственно, это видно из комментариев.