RDT1C/Reports/ирСтатистикаПоЗапросамСУБД/Ext/ObjectModule.bsl
Администратор 57352d2776 4.67
Конструктор запроса
        +Реализована возможность удаление поля объединения
        *В расширенной проверке реализован обход ошибки платформы 8.3.12+, из-за которой не активизировалась страница с проблемным списком выражений
    Консоль кода
        *Устранено добавление имен недоступных на клиенте общих модулей в параметры при автозаполнении
        *В режиме редактора алгоритма при применении изменений теперь выполняется синтаксический контроль
        *Устранено изменение имени файла после выполнения команды "Объединить с файлом"
    Консоль компоновки
        +Добавлено сохранение таблиц внешних наборов данных вместе с отчетом
        +На странице "Наборы данных внешние" добавлена кнопка "Сбросить"
        *Исправлено не сохранение результатов редактирования элементов схемы компоновки непосредственно в форме инструмента (вычисляемые поля, параметры и т.д.)
        *Устранено изменение имени файла после выполнения команды "Объединить с файлом"
    Общее для варианта Расширение
        *Теперь при входе администратора ему добавляется роль ирРазработчик, если у всех пользователей отсутствует эта роль или включена настройка ДобавлятьРольИРВсемАдминистраторам
        *Настройка ДобавлятьРольИРВсемАдминистраторам теперь умолчанию равна Ложь
        *Исправлено сохранение настройки ДобавлятьРольИРВсемАдминистраторам для всех пользователей
    Подбор и обработка объектов
        *Обработка "изменить/добавить строку" переименована в "изменить реквизиты / добавить строку"
    Общее
        *Исправлена некорректная кодировка при выполнении команд системы на некоторых конфигурациях ОС
        +В портативном варианте реализована поддержка перенаправления на сервер операции удаления ссылочного объекта
        *Фраза "Административная регистрация COM компонент" глобально заменена на "Регистрация COM-компонент"
        *Исправлено некорректное вычисление цвета текста колонки "Функциональные опции"
        *Исправлено сохранение флажка "Привилегированный режим"
        *В команде "Открыть объект для отладки" исправлен ввод диагностического сообщения при вводе некорректной строки
    Контекстная подсказка
        *Устранены некоторые ограничения/ошибки при работе с включенным флажком "Объекты на сервере"
    Настройка журнала регистрации
        *При возникновении ошибки платформы в портативном варианте на 8.2  в клиент-серверной базе теперь выдается более понятная ошибка
    Редактор объекта БД
        +При выполнении команды "Изменить ячейки текущей колонки" теперь сразу устанавливается флажок "Только выделенные" если выделено больше одной строки
    Консоль запросов
        *Устранено изменение имени файла после выполнения команды "Объединить с файлом"
        *Исправлено растягивание нижних табличных полей на мониторах 1440p+
    Управление службами серверов 1С
        *Исправлена лишняя проверка уникальности некоторых колонок
    Структура хранения БД
        +Добавлена кнопка открытия конвертора текста БД
        +При нажатии кнопки "Очистка таблиц СУБД..." теперь помеченными по умолчанию будут выделенные в основной форме метаданные
4.68

    Адаптация расширения
        +Добавлен флажок "Сгенерировать роль ирВсеПрава"
        *Исправлено закрытие формы после вывода некоторых ошибок
    Отладка внешних обработок БСП
        +Реализована поддержка БСП 2.4 в варианте Расширение с использованием адаптации
    Форма выбора объекта метаданных
        +Объекты, на которые у текущего пользователя нет права Просмотр или выключенные функциональными опциями, теперь окрашиваются красным цветом текста
    Грамматика языка запросов
        +Добавлена поддержка функции АвтоНомерЗаписи()
        *Исправлена ошибка разбора "ПОМЕСТИТЬ Таблица"
    Контекстная подсказка
        *Исправлена свежая ошибка вычисления табличной части обработки или отчета
    Консоль компоновки
        *Исправлена свежая проблема не передачи таблиц-параметров при открытии инструмента
    Конструктор запроса
        *Исправлена некорректная сборка запроса WQL с автополями
        *Исправлено дублирование полей у частей объединений при наличии автополей
    Общее
        +При открытии параметров вывода строк теперь сразу устанавливается флажок "Только выделенные" если выделено больше одной строки
        *В окне "О подсистеме" сокращена длительность замирания при отсутствии доступа в интернет в некоторых случаях
        *В подключении к СУБД к собственной базе в режиме "На сервере" устранено подключение с клиента
        *Отменено свежее некорректное исправление кодировки командных файлов
    Статистистика по запросам MSSQL
        *Улучшено преобразование границ интервала времени 1С в SQL
        +По умолчанию элемент отбора "Ненулевой вввод/вывод" в варианте "Последние" теперь отключен
2018-10-15 07:10:05 +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] - 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, Ложь);
Если Запросы = Неопределено Тогда
Возврат;
КонецЕсли;
Запросы.Колонки.Добавить("ТаблицыМетаданных");
Запросы.Колонки.Добавить("ТекстЗапросаМета");
ВыбранноеПолеТаблицыМетаданных = ирОбщий.НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(ВсеВыбранныеПоля, "Поле", Новый ПолеКомпоновкиДанных("ТаблицыМетаданных"));
ВыбранноеПолеТекстЗапросаМета = ирОбщий.НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(ВсеВыбранныеПоля, "Поле", Новый ПолеКомпоновкиДанных("ТекстЗапросаМета"));
Для Каждого СтрокаЗапроса Из Запросы Цикл
Если Ложь
Или ВыбранноеПолеТекстЗапросаМета <> Неопределено
Или ВыбранноеПолеТаблицыМетаданных <> Неопределено
Тогда
//Если ирОбщий.СтрокиРавныЛкс(СтрокаЗапроса.database_name, ФормаПодключения.ИмяБД) Тогда
НайденныеТаблицы = Новый ТаблицаЗначений;
СтрокаЗапроса.ТекстЗапросаМета = АнализТехножурнала.ПеревестиТекстБДВТерминыМетаданных(СтрокаЗапроса.query_text,,, "MSSQL", НайденныеТаблицы,,,, Истина);
Если НайденныеТаблицы.Количество() > 0 Тогда
МассивИмен = НайденныеТаблицы.ВыгрузитьКолонку("ИмяМета");
СтрокаЗапроса.ТаблицыМетаданных = ирОбщий.ПолучитьСтрокуСРазделителемИзМассиваЛкс(МассивИмен);
КонецЕсли;
//КонецЕсли;
КонецЕсли;
КонецЦикла;
#Если _ Тогда
Таблица = Новый ТаблицаЗначений;
#КонецЕсли
Запросы.Колонки.Добавить("ШаблонЗапроса", Новый ОписаниеТипов("Строка"));
Для Каждого СтрокаТаблицы Из Запросы Цикл
СтрокаТаблицы.ШаблонЗапроса = АнализТехножурнала.ПолучитьШаблонТекстаБД(СтрокаТаблицы.query_text);
КонецЦикла;
ВнешниеНаборыДанных = Новый Структура("Запросы", Запросы);
Если РежимОтладки = 2 Тогда
ирОбщий.ОтладитьЛкс(СхемаКомпоновкиДанных, , КонечнаяНастройка, ВнешниеНаборыДанных);
Возврат;
КонецЕсли;
ирОбщий.СкомпоноватьВТабличныйДокументЛкс(СхемаКомпоновкиДанных, КонечнаяНастройка, ДокументРезультат, ВнешниеНаборыДанных, ДанныеРасшифровки);
КонецПроцедуры
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
РежимОтладки = 0;