RDT1C/Reports/ирСтатистикаПоЗапросамСУБД/Ext/ObjectModule.bsl
Администратор d258d6f6ab // Версия 100
Подбор и обработка объектов
        *Исправлены ошибки при обработке полей через точку в настройках выборки
    Консоль запросов
        *Исправлена ошибка при добавлении запроса в режиме дерева запроса
    Динамический список
        *Исправлен учет отбора по периоду при подсчете количества строк в обычной форме
    Удаление объектов с контролем ссылок
        *Исправлена ошибка при удалении элемента плана обмена
    Анализ журнала регистрации
        +Добавлена возможность мультивыделения строк
    Вывод строк таблицы
        *Исправлен учет наложенного отбора для табличной части
    Поиск дублей и замена ссылок
        *Исправлена недоступность кнопки Запрос после загрузки настроек с установленным запросом из файла
2018-07-22 14:12:27 +03:00

141 lines
16 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
Перем РежимОтладки Экспорт;
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
#Если _ Тогда
СхемаКомпоновки = Новый СхемаКомпоновкиДанных;
КонечнаяНастройка = Новый НастройкиКомпоновкиДанных;
ВнешниеНаборыДанных = Новый Структура;
ДокументРезультат = Новый ТабличныйДокумент;
#КонецЕсли
СтандартнаяОбработка = Ложь;
ДокументРезультат.Очистить();
Если Не ирОбщий.ПроверитьСоединениеADOЭтойБДЛкс() Тогда
Возврат;
КонецЕсли;
ТекстЗапроса = ПолучитьМакет("StatisticsQuery").ПолучитьТекст();
АнализТехножурнала = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирАнализТехножурнала");
#Если Сервер И Не Сервер Тогда
АнализТехножурнала = Обработки.ирАнализТехножурнала.Создать();
#КонецЕсли
КонечнаяНастройка = КомпоновщикНастроек.ПолучитьНастройки();
ПорядокЗапроса = ирОбщий.ВыражениеПорядкаКомпоновкиНаЯзыкеЛкс(КонечнаяНастройка.Порядок,,, "MSSQL");
Если Не ЗначениеЗаполнено(ПорядокЗапроса) Тогда
ПорядокЗапроса = "TotIO desc";
КонецЕсли;
// http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=542796
ТекущаяДата = ТекущаяДата();
СмещениеВремени = ТекущаяДата - ирОбщий.ВыполнитьЗапросКЭтойБазеЧерезADOЛкс("select CURRENT_TIMESTAMP",,, 0, Ложь)[0][0];
КоличествоПервых = КонечнаяНастройка.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КоличествоПервых")).Значение;
ПараметрПопавшиеВПоследниеМинут = КонечнаяНастройка.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПопавшиеВПоследниеМинут"));
ПопавшиеВПоследниеМинут = 1000;
Если ПараметрПопавшиеВПоследниеМинут.Использование Тогда
ПопавшиеВПоследниеМинут = ПараметрПопавшиеВПоследниеМинут.Значение
КонецЕсли;
ПараметрНачалоИнтервала = КонечнаяНастройка.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("НачалоИнтервала"));
НачалоИнтервала = Дата(2000,1,1);
Если ПараметрНачалоИнтервала.Использование Тогда
НачалоИнтервала = Дата(ПараметрНачалоИнтервала.Значение) - СмещениеВремени - 1;
КонецЕсли;
ТекстЗапроса = ирОбщий.СтрЗаменитьОбязательноЛкс(ТекстЗапроса, "1111-11-11 11:11:11", Формат(НачалоИнтервала, "ДФ=""yyyy-MM-dd HH:mm:ss"""));
ПараметрКонецИнтервала = КонечнаяНастройка.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КонецИнтервала"));
КонецИнтервала = Дата(2100,1,1);
Если ПараметрКонецИнтервала.Использование Тогда
КонецИнтервала = Дата(ПараметрКонецИнтервала.Значение) - СмещениеВремени + 1;
КонецЕсли;
ТекстЗапроса = ирОбщий.СтрЗаменитьОбязательноЛкс(ТекстЗапроса, "2222-22-22 22:22:22", Формат(КонецИнтервала, "ДФ=""yyyy-MM-dd HH:mm:ss"""));
ТекстЗапроса = ирОбщий.СтрЗаменитьОбязательноЛкс(ТекстЗапроса, "top 111", "top " + XMLСтрока(КоличествоПервых));
ТекстЗапроса = ирОбщий.СтрЗаменитьОбязательноЛкс(ТекстЗапроса, "333", XMLСтрока(ПопавшиеВПоследниеМинут));
НенулевойВводВывод = ирОбщий.НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(КонечнаяНастройка.Отбор.Элементы, "Представление", "Ненулевой ввод/вывод");
Если НенулевойВводВывод = Неопределено Или Не НенулевойВводВывод.Использование Тогда
// Этот фрагмент сильно ускоряет запрос, но иногда будет отсекать полезные данные
ТекстЗапроса = ирОбщий.СтрЗаменитьОбязательноЛкс(ТекстЗапроса, "(total_logical_reads > 0 or total_logical_writes > 0)", "(1=1)");
КонецЕсли;
ГруппаОтбора = ирОбщий.НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(КонечнаяНастройка.Отбор.Элементы, "Представление", "Не содержит служебных таблиц 1С");
Если ГруппаОтбора <> Неопределено И ГруппаОтбора.Использование Тогда
ОбработкаСтруктураХраненияБД = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирСтруктураХраненияБД");
#Если Сервер И Не Сервер Тогда
ОбработкаСтруктураХраненияБД = обработки.ирСтруктураХраненияБД.Создать();
#КонецЕсли
Для Каждого ИмяСлужебнойТаблицы Из ОбработкаСтруктураХраненияБД.мИменаДополнительныхТаблиц Цикл
ирОбщий.НайтиДобавитьЭлементОтбораКомпоновкиЛкс(ГруппаОтбора, "ТекстЗапроса", "FROM " + ИмяСлужебнойТаблицы.Ключ, ВидСравненияКомпоновкиДанных.НеСодержит,, Ложь);
ирОбщий.НайтиДобавитьЭлементОтбораКомпоновкиЛкс(ГруппаОтбора, "ТекстЗапроса", "FROM dbo." + ИмяСлужебнойТаблицы.Ключ, ВидСравненияКомпоновкиДанных.НеСодержит,, Ложь);
ирОбщий.НайтиДобавитьЭлементОтбораКомпоновкиЛкс(ГруппаОтбора, "ТекстЗапроса", "UPDATE " + ИмяСлужебнойТаблицы.Ключ, ВидСравненияКомпоновкиДанных.НеСодержит,, Ложь);
ирОбщий.НайтиДобавитьЭлементОтбораКомпоновкиЛкс(ГруппаОтбора, "ТекстЗапроса", "UPDATE dbo." + ИмяСлужебнойТаблицы.Ключ, ВидСравненияКомпоновкиДанных.НеСодержит,, Ложь);
ирОбщий.НайтиДобавитьЭлементОтбораКомпоновкиЛкс(ГруппаОтбора, "ТекстЗапроса", "INSERT " + ИмяСлужебнойТаблицы.Ключ, ВидСравненияКомпоновкиДанных.НеСодержит,, Ложь);
ирОбщий.НайтиДобавитьЭлементОтбораКомпоновкиЛкс(ГруппаОтбора, "ТекстЗапроса", "INSERT dbo." + ИмяСлужебнойТаблицы.Ключ, ВидСравненияКомпоновкиДанных.НеСодержит,, Ложь);
КонецЦикла;
КонецЕсли;
//ФормаПодключения = ирКэш.Получить().ПолучитьФорму("ПараметрыСоединенияСУБД");
//ФормаПодключения.ЗаполнитьПараметры();
//ТекстЗапроса = ирОбщий.СтрЗаменитьОбязательноЛкс(ТекстЗапроса, "3333", ФормаПодключения.ИмяБД);
ВсеВыбранныеПоля = ирОбщий.ПолучитьВсеВыбранныеПоляГруппировкиКомпоновкиЛкс(КонечнаяНастройка.Выбор, Истина);
ВыбранноеПолеПланЗапроса = ирОбщий.НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(ВсеВыбранныеПоля, "Поле", Новый ПолеКомпоновкиДанных("query_plan"));
Если ВыбранноеПолеПланЗапроса = Неопределено Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "qp.query_plan", "NULL"); // получание планов запросов в XML занимает много времени
КонецЕсли;
ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ORDER BY " + ПорядокЗапроса;
Запросы = ирОбщий.ВыполнитьЗапросКЭтойБазеЧерезADOЛкс(ТекстЗапроса, РежимОтладки = 1, "Статистика MSSQL", 0, Ложь);
Если Запросы = Неопределено Тогда
Возврат;
КонецЕсли;
Запросы.Колонки.Добавить("ТаблицыМетаданных");
Запросы.Колонки.Добавить("ТекстЗапросаМета");
ВыбранноеПолеТаблицыМетаданных = ирОбщий.НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(ВсеВыбранныеПоля, "Поле", Новый ПолеКомпоновкиДанных("ТаблицыМетаданных"));
ВыбранноеПолеТекстЗапросаМета = ирОбщий.НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(ВсеВыбранныеПоля, "Поле", Новый ПолеКомпоновкиДанных("ТекстЗапросаМета"));
Для Каждого СтрокаЗапроса Из Запросы Цикл
Если Ложь
Или ВыбранноеПолеТекстЗапросаМета <> Неопределено
Или ВыбранноеПолеТаблицыМетаданных <> Неопределено
Тогда
//Если ирОбщий.СтрокиРавныЛкс(СтрокаЗапроса.database_name, ФормаПодключения.ИмяБД) Тогда
НайденныеТаблицы = Новый ТаблицаЗначений;
СтрокаЗапроса.ТекстЗапросаМета = АнализТехножурнала.ПеревестиТекстБДВТерминыМетаданных(СтрокаЗапроса.query_text,,, "MSSQL", НайденныеТаблицы,,,, Истина);
Если НайденныеТаблицы.Количество() > 0 Тогда
МассивИмен = НайденныеТаблицы.ВыгрузитьКолонку("ИмяМета");
СтрокаЗапроса.ТаблицыМетаданных = ирОбщий.ПолучитьСтрокуСРазделителемИзМассиваЛкс(МассивИмен);
КонецЕсли;
//КонецЕсли;
КонецЕсли;
КонецЦикла;
#Если _ Тогда
Таблица = Новый ТаблицаЗначений;
#КонецЕсли
Запросы.Колонки.Добавить("ШаблонЗапроса", Новый ОписаниеТипов("Строка"));
Для Каждого СтрокаТаблицы Из Запросы Цикл
СтрокаТаблицы.ШаблонЗапроса = АнализТехножурнала.ПолучитьШаблонТекстаБД(СтрокаТаблицы.query_text);
КонецЦикла;
ВнешниеНаборыДанных = Новый Структура("Запросы", Запросы);
Если РежимОтладки = 2 Тогда
ирОбщий.ОтладитьЛкс(СхемаКомпоновкиДанных, , КонечнаяНастройка, ВнешниеНаборыДанных);
Возврат;
КонецЕсли;
ирОбщий.СкомпоноватьВТабличныйДокументЛкс(СхемаКомпоновкиДанных, КонечнаяНастройка, ДокументРезультат, ВнешниеНаборыДанных, ДанныеРасшифровки);
КонецПроцедуры
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
РежимОтладки = 0;