RDT1C/Reports/ирСтатистикаПоЗапросамСУБД/Ext/ObjectModule.bsl
Администратор 7c4a4725ab 4.53
Добавлен инструмент "Конструктор регулярного выражения"
    Статистика по запросам MSSQL
        *Исправлена ошибка открытия формы в портативном варианте
    Консоль запросов
        *В режиме редактирования узла дерева запроса реализована возможность перехода к другим узлам дерева, но одновременно редактироваться по-прежнему может только один узел
    Тестирование метаданных
        +Добавлена кнопка "Новое окно"
        *Добавлена передача параметра "Автотест" при получении управляемых форм
    Консоль компоновки
        +Обработчику события ПередВыполнением добавлен параметр ВнешниеНаборыДанных
    Редактор изменений на узлах
        *Исправлена ошибка добавления регистрации изменений регистров через кнопку Подбор
    Динамический список
        +Теперь доступна сортировка по всем возможным колонкам
        +Добавлено поле количества строк в выбранной таблице без учета отбора
    Управление службами серверов 1С
        +Добавлена поддержка служб "Сервер отладки", "Сервер хранилища конфигураций", "Сервер администрирования"
        +Добавлена таблица доступных сборок платформы
4.54
    Конструктор регулярного выражения
        +Реализовано автообновление проверочного текста в процессе редактирования
        +Добавлены флажки "Многострочный" и "Игнорировать регистр"
        *Исправлена проблема пропажи служебных символов XML при обновлении проверочного текста
        *Исправлено удаление оформления из выражений параметров при генерации кода 1С
        +По кнопке "Сгенерировать код" теперь в параметр ТекстГдеИскать передается проверочный текст
        *Исправлена ошибка в портативном варианте при открытии формы настроек
    Консоль запросов
        *Исправлена свежая ошибка открытия конструктора запроса ИР
        *Исправлена свежая некритичная ошибка при добавлении запроса
    Управление службами серверов 1С
        +При выборе новой сборки платформы теперь явно указывается ее разрядность
        *Исправлено чтение сборок платформы для новых типов служб
2018-05-20 20:48:55 +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;