RDT1C/Reports/ирСтатистикаПоЗапросамСУБД/Ext/ObjectModule.bsl
Администратор 0d603c6706 Контекстная подсказка
*Исправлена ошибка при выполнении команды вставки ссылки при выделенном имени не ссылочного параметра
    Общее
        *Исправлена ошибка вывода строк таблицы в табличный документ без оформления в портативном варианте
        *Исправлено игнорирование общих параметров записи в файловой базе
    Редактор объекта БД
        *Исправлено не сохранение изменений значений реквизитов после загрузки табилцы реквизитов из табличного документа
    Удаление объектов с контролем ссылок
        *Исправлена ошибка выполнения контроля в таблице Субконто в английском варианте встроенного языка
    Статистика запросов MSSQL
        *Исправлена ошибка выполнения с заданными границами интервала времени в случае нестандартного формата даты datetime в БД
    Управление профайлами 1С
        *Исправлена некорректное извлечение ключа базы из командной строки в некоторых случаях
2019-03-31 18:37:49 +03:00

143 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";
КонецЕсли;
СоединениеADO = Неопределено;
ирОбщий.ВыполнитьЗапросКЭтойБазеЧерезADOЛкс("SET DATEFORMAT ymd;",,,,,, СоединениеADO);
// http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=542796
ТекущаяДата = ТекущаяДата();
СмещениеВремени = ТекущаяДата - ирОбщий.ВыполнитьЗапросКЭтойБазеЧерезADOЛкс("select CURRENT_TIMESTAMP",,, 0, Ложь,, СоединениеADO)[0][0] - 1;
КоличествоПервых = КонечнаяНастройка.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("КоличествоПервых")).Значение;
ПараметрПопавшиеВПоследниеМинут = КонечнаяНастройка.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПопавшиеВПоследниеМинут"));
ПопавшиеВПоследниеМинут = 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, Ложь,, СоединениеADO);
Если Запросы = Неопределено Тогда
Возврат;
КонецЕсли;
Запросы.Колонки.Добавить("ТаблицыМетаданных");
Запросы.Колонки.Добавить("ТекстЗапросаМета");
ВыбранноеПолеТаблицыМетаданных = ирОбщий.НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(ВсеВыбранныеПоля, "Поле", Новый ПолеКомпоновкиДанных("ТаблицыМетаданных"));
ВыбранноеПолеТекстЗапросаМета = ирОбщий.НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(ВсеВыбранныеПоля, "Поле", Новый ПолеКомпоновкиДанных("ТекстЗапросаМета"));
Для Каждого СтрокаЗапроса Из Запросы Цикл
Если Ложь
Или ВыбранноеПолеТекстЗапросаМета <> Неопределено
Или ВыбранноеПолеТаблицыМетаданных <> Неопределено
Тогда
//Если ирОбщий.СтрокиРавныЛкс(СтрокаЗапроса.database_name, ФормаПодключения.ИмяБД) Тогда
НайденныеТаблицы = Новый ТаблицаЗначений;
СтрокаЗапроса.ТекстЗапросаМета = АнализТехножурнала.ПеревестиТекстБДВТерминыМетаданных(СтрокаЗапроса.query_text,,, "MSSQL", НайденныеТаблицы,,,, Истина);
Если НайденныеТаблицы.Количество() > 0 Тогда
МассивИмен = НайденныеТаблицы.ВыгрузитьКолонку("ИмяМета");
СтрокаЗапроса.ТаблицыМетаданных = ирОбщий.ПолучитьСтрокуСРазделителемИзМассиваЛкс(МассивИмен);
КонецЕсли;
//КонецЕсли;
КонецЕсли;
КонецЦикла;
#Если _ Тогда
Таблица = Новый ТаблицаЗначений;
#КонецЕсли
Запросы.Колонки.Добавить("ШаблонЗапроса", Новый ОписаниеТипов("Строка"));
Для Каждого СтрокаТаблицы Из Запросы Цикл
СтрокаТаблицы.ШаблонЗапроса = АнализТехножурнала.ПолучитьШаблонТекстаБД(СтрокаТаблицы.query_text);
КонецЦикла;
ВнешниеНаборыДанных = Новый Структура("Запросы", Запросы);
Если РежимОтладки = 2 Тогда
ирОбщий.ОтладитьЛкс(СхемаКомпоновкиДанных, , КонечнаяНастройка, ВнешниеНаборыДанных);
Возврат;
КонецЕсли;
ирОбщий.СкомпоноватьВТабличныйДокументЛкс(СхемаКомпоновкиДанных, КонечнаяНастройка, ДокументРезультат, ВнешниеНаборыДанных, ДанныеРасшифровки);
КонецПроцедуры
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
РежимОтладки = 0;