RDT1C/DataProcessors/ирСтруктураХраненияБД/Ext/ObjectModule.bsl
Администратор 6b2afa2228 Добавлен инструмент Анализ замера производительности
Форма выбора объектов метаданных
        *Исправлено вычисление количества строк кнопкой "Количество" у табличных частей и перерасчетов
    Общее
        *Исправлены ошибки при работе с наборами записей перерасчетов
        *Исправлена ошибка обработки отказа от записи при наличии ссылки на объект БД в дополнительных свойствах объекта
        +В форме настроек подключения к СУБД собственной базы добавлен режим выполнения запросов непосредственно с сервера 1С
    Статистика по запросам MSSQL
        +Добавлено подменю вариантов отчета
        +Добавлена кнопка передачи компоновки отчета в консоль компоновки
        +Добавлена кнопка передачи запроса отчета в консоль запросов
    Консоль кода
        *Исправлена команда "В однострочный" для выделенного фрагмента
    Консоль запросов
        +На закладке "Запрос результата" добавлена кнопка "Статистика MSSQL" для открытия инструмента "Статистика по запросам MSSQL" с передачей интервала последнего выполнения запроса
        *Исправлена потеря регистра букв имен на закладке "Временные таблицы" в некоторых случаях в режиме дерева запроса
    Тестирование метаданных
        *Исправлена ошибка  тестирования элементов управления управляемых форм
    Поиск дублей и замена ссылок
        *Исправлено заполнение колонки "Ценность данных" кнопкой "обновить ценность" на закладке "Группы дублей"
    Конструктор запроса
        *Исправлено попадание элементов отбора с агрегатами в некоторых случаях в секцию ГДЕ вместо ИМЕЮЩИЕ при сборке текста
        *Исправлено в некоторых случаях некорректное преобразование константного правого значения элемента условия в параметр
    Структура хранения БД
        +Добавлена кнопка "Описание шаблонов ИТС"
    Редактор объекта БД
        +На закладке "Связанные колонки" добавлено групповое изменение пометок
        +В списке реквизитов добавлена колонка "Зависит от" для отражения связей параметров выбора
        *Исправлена работа связей параметров выбора сломанная несколько версий назад
        +Добавлена команда выгрузки избранных связанных колонок
        +При загрузке объекта из памяти теперь считываются дополнительные свойства в одноименную таблицу на форме
        *Исправлена ошибка при выборе метассылок (например перечислений) внесенная несколько версий назад
    Подбор и обработка объектов
        *Исправлена ошибка обработки строк некоторых регистров
        +В обработке "Добавить/изменить строку" добавлена колонка "Зависит от" для отражения связей параметров выбора
    Консоль заданий
        +Добавлена команда перехода к методу из списка фоновых заданий
        +Для фонового задания сделана полноценная форма
        *Список методов теперь сортируется по алфавиту
        +В списке методов добавлены колонки "Последний конец" и "Возраст, м"
        +Добавлен режим автообновления для списка методов
    Редактор хранилищ настроек
        +Добавлены команды выгрузки/загрузки выделенных настроек в/из файла
        +Добавлена команда установки отбора по настройкам инструментов разработчика
    Анализ техножурнала
        +При загрузке логов с отбором теперь выводится сообщение с представлением фильтра
        +Добавлен фильтр по типу события на этапе загрузке логов
2018-05-02 23:53:06 +03:00

278 lines
21 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.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
Перем мПлатформа Экспорт;
Перем мСтруктураХраненияSDBL Экспорт;
Перем мСтруктураХраненияСУБД Экспорт;
Перем мКомпонентаCDDB;
Перем мИменаДополнительныхТаблиц Экспорт;
Процедура ОбновитьТаблицы() Экспорт
Таблицы.Очистить();
Индексы.Очистить();
// Антибаг 8.3.7-8.3.8 https://partners.v8.1c.ru/forum/topic/1486259 Выполнение метода ПолучитьСтруктуруХраненияБазаДанных с фильтром, включающим строку "Константы", приводит к ошибке
Если Истина
И ОтборПоМетаданным <> Неопределено
И ирКэш.НомерВерсииПлатформыЛкс() > 803001
И Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_2_13
Тогда
ИндексТаблицы = ОтборПоМетаданным.Найти("Константы");
Если ИндексТаблицы <> Неопределено Тогда
ОтборПоМетаданным.Удалить(ИндексТаблицы);
Сообщить("Таблица Константы удалена из фильтра из-за ошибка платформы 8.3");
КонецЕсли;
КонецЕсли;
Если ПоказыватьSDBL Тогда
Если ОтборПоМетаданным = Неопределено Тогда
мСтруктураХраненияSDBL = ирКэш.ПолучитьСтруктуруХраненияБДЛкс(Ложь);
Иначе
мСтруктураХраненияSDBL = ирОбщий.ПолучитьСтруктуруХраненияБДЛкс(ОтборПоМетаданным, Ложь);
КонецЕсли;
ЗаполнитьТаблицыИзСтруктурыХранения(мСтруктураХраненияSDBL, Ложь);
КонецЕсли;
Если ПоказыватьСУБД Тогда
Если ОтборПоМетаданным = Неопределено Тогда
мСтруктураХраненияСУБД = ирКэш.ПолучитьСтруктуруХраненияБДЛкс(Истина);
Иначе
мСтруктураХраненияСУБД = ирОбщий.ПолучитьСтруктуруХраненияБДЛкс(ОтборПоМетаданным, Истина);
КонецЕсли;
ЗаполнитьТаблицыИзСтруктурыХранения(мСтруктураХраненияСУБД, Истина);
КонецЕсли;
РезультирующееПоказыватьРазмеры = ПоказыватьРазмеры И ПоказыватьСУБД;
Если РезультирующееПоказыватьРазмеры Тогда
Если ирКэш.ЭтоФайловаяБазаЛкс() Тогда
ЗаполнитьРазмерыФайлойБазы();
Иначе
ЗаполнитьРазмерыБазыMSSQL();
КонецЕсли;
КонецЕсли;
Таблицы.Сортировать("Метаданные, ИмяТаблицы, Назначение, ИмяТаблицыХранения, СУБД");
Индексы.Сортировать("Метаданные, ИмяТаблицы, Назначение, ИмяТаблицыХранения, ИмяИндекса, ИмяИндексаХранения, СУБД");
КонецПроцедуры
Процедура ЗаполнитьРазмерыБазыMSSQL()
Если Не ирОбщий.ПроверитьСоединениеADOЭтойБДЛкс() Тогда
Возврат;
КонецЕсли;
ТекстЗапроса = ПолучитьМакет("ЗапросРазмеров").ПолучитьТекст();
ТаблицаРезультата = ирОбщий.ВыполнитьЗапросКЭтойБазеЧерезADOЛкс(ТекстЗапроса,,,, Ложь);
Если ОбщаяТаблицаИндексов Тогда
Для Каждого СтрокаРезультата Из ТаблицаРезультата Цикл
КлючПоиска = Новый Структура("НИмяТаблицыХранения, НИмяИндексаХранения", НРег(СтрокаРезультата.TableName), НРег(СтрокаРезультата.IndexName));
СтрокиИндекса = Индексы.НайтиСтроки(КлючПоиска);
Если СтрокиИндекса.Количество() = 0 Тогда
Если ОтборПоМетаданным <> Неопределено Тогда
Продолжить;
КонецЕсли;
СтрокаИндекса = Индексы.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаИндекса, КлючПоиска);
СтрокаИндекса.ИмяИндексаХранения = СтрокаРезультата.IndexName;
СтрокаИндекса.ИмяИндекса = СтрокаРезультата.IndexName;
СтрокаИндекса.ИмяТаблицыХранения = СтрокаРезультата.TableName;
СтрокаИндекса.ИмяТаблицы = мИменаДополнительныхТаблиц[ВРег(СтрокаРезультата.TableName)];
Если Не ЗначениеЗаполнено(СтрокаИндекса.ИмяТаблицы) Тогда
СтрокаИндекса.ИмяТаблицы = СтрокаРезультата.TableName;
КонецЕсли;
СтрокаИндекса.Назначение = СтрокаИндекса.ИмяТаблицы;
СтрокаИндекса.СУБД = Истина;
Иначе
СтрокаИндекса = СтрокиИндекса[0];
КонецЕсли;
СтрокаИндекса.ТипИндекса = СтрокаРезультата.IndexType;
СтрокаИндекса.РазмерИндексы = СтрокаРезультата.IndexKB;
СтрокаИндекса.РазмерОбщий = СтрокаРезультата.ReservedKB;
КонецЦикла;
КонецЕсли;
ТаблицаРезультата.Свернуть("TableName", "IndexKB, ReservedKB, DataKB, Rows");
Для Каждого СтрокаРезультата Из ТаблицаРезультата Цикл
СтрокаТаблицы = Таблицы.Найти(НРег(СтрокаРезультата.TableName), "НИмяТаблицыХранения");
Если СтрокаТаблицы = Неопределено Тогда
Если ОтборПоМетаданным <> Неопределено Тогда
Продолжить;
КонецЕсли;
СтрокаТаблицы = Таблицы.Добавить();
СтрокаТаблицы.ИмяТаблицыХранения = СтрокаРезультата.TableName;
СтрокаТаблицы.НИмяТаблицыХранения = НРег(СтрокаТаблицы.ИмяТаблицыХранения);
СтрокаТаблицы.ИмяТаблицы = мИменаДополнительныхТаблиц[ВРег(СтрокаРезультата.TableName)];
Если Не ЗначениеЗаполнено(СтрокаТаблицы.ИмяТаблицы) Тогда
СтрокаТаблицы.ИмяТаблицы = СтрокаРезультата.TableName;
КонецЕсли;
СтрокаТаблицы.Назначение = СтрокаТаблицы.ИмяТаблицы;
СтрокаТаблицы.СУБД = Истина;
КонецЕсли;
СтрокаТаблицы.РазмерИндексы = СтрокаРезультата.IndexKB;
СтрокаТаблицы.РазмерОбщий = СтрокаРезультата.ReservedKB;
СтрокаТаблицы.КоличествоСтрок = СтрокаРезультата.Rows;
СтрокаТаблицы.РазмерЗаписи = СтрокаРезультата.DataKB;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьРазмерыФайлойБазы()
Если ирКэш.НомерВерсииПлатформыЛкс() > 803008 Тогда
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
Каталог = Нстр(СтрокаСоединения, "File");
ФайлБазы = Каталог + "\1Cv8.1CD";
КомандаСистемы = """" + КаталогПрограммы() + "CNVDBFL.EXE"" -i """ + ФайлБазы + """";
Текст = ирОбщий.ПолучитьТекстРезультатаКомандыОСЛкс(КомандаСистемы);
Если Найти(Текст, "8.2.14") = 0 Тогда
Сообщить(Текст + " Получения размеров файловой базы для текущего формата базы не поддерживается", СтатусСообщения.Внимание);
Возврат;
КонецЕсли;
КонецЕсли;
ирОбщий.ВычислитьКоличествоСтрокТаблицВДеревеМетаданныхЛкс();
Компонента1CD = мПлатформа.ПолучитьОбъектВнешнейКомпонентыИзМакета("_1CDLib", "T1CDLib.DB1CD", "T1CDLib", ТипВнешнейКомпоненты.Native);
ПапкаОб = НСтр(СтрокаСоединенияИнформационнойБазы(), "File");
ИмяЛога = ПапкаОб + "\logdb1cd.log";
ИмяФайла = ПапкаОб + "\1cv8.1cd";
мКомпонентаCDDB = Новый("AddIn.T1CDLib.DB1CD");
мКомпонентаCDDB.LogLevel=0;
мКомпонентаCDDB.FileOpeningMode=3;
//FileDB.OpenLogFile(ИмяЛога);
#Если Клиент Тогда
Состояние("Чтение структуры файла");
#КонецЕсли
мКомпонентаCDDB.Open1CDFile(ИмяФайла);
мКомпонентаCDDB.OpenMetadata();
ВерсияБД = мКомпонентаCDDB.BaseVersion;
//Элементы.НадписьВерсияБД.Заголовок="Версия БД: "+ВерсияБД;
ArrayPres = мКомпонентаCDDB.GetTablesArray(Ложь);
TablesArray = ЗначениеИзСтрокиВнутр(ArrayPres);
Для TabInd = 1 По TablesArray.Count() Цикл
TableInfo = TablesArray[TabInd-1];
СтрокаТаблицы = Таблицы.Найти(НРег(TableInfo.Name), "НИмяТаблицыХранения");
Если СтрокаТаблицы = Неопределено Тогда
Если ОтборПоМетаданным <> Неопределено Тогда
Продолжить;
КонецЕсли;
СтрокаТаблицы = Таблицы.Добавить();
//ТекСтр.НомерПП = TabInd;
СтрокаТаблицы.ИмяТаблицыХранения = TableInfo.Name;
СтрокаТаблицы.НИмяТаблицыХранения = НРег(СтрокаТаблицы.ИмяТаблицыХранения);
СтрокаТаблицы.ИмяТаблицы = мИменаДополнительныхТаблиц[ВРег(TableInfo.Name)];
Если Не ЗначениеЗаполнено(СтрокаТаблицы.ИмяТаблицы) Тогда
СтрокаТаблицы.ИмяТаблицы = TableInfo.Name;
КонецЕсли;
СтрокаТаблицы.Назначение = СтрокаТаблицы.ИмяТаблицы;
СтрокаТаблицы.СУБД = Истина;
//ТекСтр.НазначениеТаблицы = ПолучитьТипТаблицы(TableInfo.Name);
//ТекСтр.ОписаниеТаблицы=TablePres;
КонецЕсли;
СтрокаТаблицы.РазмерЗаписи = Окр(мКомпонентаCDDB.GetObjectSize(TableInfo.RecordsIndex) / 1024);
СтрокаТаблицы.РазмерБлоб = Окр(мКомпонентаCDDB.GetObjectSize(TableInfo.BlobIndex) / 1024);
СтрокаТаблицы.РазмерИндексы = Окр(мКомпонентаCDDB.GetObjectSize(TableInfo.IndexesIndex) / 1024);
СтрокаТаблицы.РазмерОбщий = СтрокаТаблицы.РазмерЗаписи + СтрокаТаблицы.РазмерБлоб + СтрокаТаблицы.РазмерИндексы;
Если ПоказыватьУдаленные Тогда
ПолучитьРазмерУдалДанных(TableInfo.Name, СтрокаТаблицы);
КонецЕсли;
ОписаниеТаблицы = ирОбщий.ПолучитьОписаниеТаблицыБДИис(СтрокаТаблицы.ИмяТаблицы);
Если Истина
И ОписаниеТаблицы <> Неопределено
И ОписаниеТаблицы.КоличествоСтрок <> Неопределено
Тогда
СтрокаТаблицы.КоличествоСтрок = ОписаниеТаблицы.КоличествоСтрок;
Иначе
Пустышка = 0; // Для отладки
КонецЕсли;
КонецЦикла;
мКомпонентаCDDB.CloseFile();
мКомпонентаCDDB.CloseLogFile();
КонецПроцедуры
Функция ПолучитьРазмерУдалДанных(TabName,ТекСтр)
РазмерУдал=0;
РазмерУдалБлоб=0;
Если мКомпонентаCDDB.OpenTable(0,TabName) Тогда
РазмерУдалБлоб=мКомпонентаCDDB.GetDelBlobDataLength(0);
Рез=мКомпонентаCDDB.MoveToRecord(0,0);
NextInd=мКомпонентаCDDB.GetNextDelRecordIndex(0);
КолвоУдал=0;
Пока Рез И (NextInd>0) Цикл
КолвоУдал=КолвоУдал+1;
Рез=мКомпонентаCDDB.MoveToRecord(0,NextInd);
NextInd=мКомпонентаCDDB.GetNextDelRecordIndex(0);
КонецЦикла;
РазмерУдал=КолвоУдал*мКомпонентаCDDB.GetTableRecordLength(0);
КонецЕсли;
мКомпонентаCDDB.CloseTable(0);
ТекСтр.РазмерУдаленЗаписи=РазмерУдал;
ТекСтр.РазмерУдаленБлоб=РазмерУдалБлоб;
ТекСтр.РазмерУдаленОбщий=ТекСтр.РазмерУдаленЗаписи+ТекСтр.РазмерУдаленБлоб;
Возврат Истина;
КонецФункции
Процедура ЗаполнитьТаблицыИзСтруктурыХранения(Знач СтруктураХранения, ЭтоСУБД)
#Если Сервер И Не Сервер Тогда
СтруктураХранения = Новый ТаблицаЗначений;
#КонецЕсли
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(СтруктураХранения.Количество(), "Структура " + ?(ЭтоСУБД, "СУБД", "SDBL"));
Для Каждого СтрокаСтруктурыХранения Из СтруктураХранения Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
СтрокаТаблицы = Таблицы.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтрокаСтруктурыХранения);
СтрокаТаблицы.Поля = СтрокаСтруктурыХранения.Поля.Количество();
СтрокаТаблицы.Индексы = СтрокаСтруктурыХранения.Индексы.Количество();
СтрокаТаблицы.СУБД = ЭтоСУБД;
СтрокаТаблицы.НИмяТаблицыХранения = НРег(СтрокаТаблицы.ИмяТаблицыХранения);
Если ОбщаяТаблицаИндексов Тогда
Для Каждого СтрокаХраненияИндекса Из СтрокаСтруктурыХранения.Индексы Цикл
СтрокаИндекса = Индексы.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаИндекса, СтрокаТаблицы);
СтрокаИндекса.ИмяИндекса = ирОбщий.ПолучитьПредставлениеИндексаХраненияЛкс(СтрокаХраненияИндекса, СтрокаТаблицы.СУБД, СтрокаСтруктурыХранения);
СтрокаИндекса.ИмяИндексаХранения = СтрокаХраненияИндекса.ИмяИндексаХранения;
СтрокаИндекса.Поля = СтрокаХраненияИндекса.Поля.Количество();
СтрокаИндекса.НИмяИндексаХранения = НРег(СтрокаИндекса.ИмяИндексаХранения);
СтрокаИндекса.НИмяТаблицыХранения = НРег(СтрокаИндекса.ИмяТаблицыХранения);
КонецЦикла;
КонецЕсли;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецПроцедуры
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
мПлатформа = ирКэш.Получить();
мИменаДополнительныхТаблиц = Новый Соответствие;
мИменаДополнительныхТаблиц.Вставить("CONFIG", "КонфигурацияБД");
мИменаДополнительныхТаблиц.Вставить("CONFIGSAVE", "СохранённаяКонфигурация");
мИменаДополнительныхТаблиц.Вставить("DBSCHEMA", "СхемаБД");
мИменаДополнительныхТаблиц.Вставить("DBCHANGES", "ИзмененияСхемыБД");
мИменаДополнительныхТаблиц.Вставить("FILES", "Файлы");
мИменаДополнительныхТаблиц.Вставить("PARAMS", "СлужебныеПараметры");
мИменаДополнительныхТаблиц.Вставить("V8USERS", "Пользователи");
мИменаДополнительныхТаблиц.Вставить("IBVERSION", "ВерсияИБ");
мИменаДополнительныхТаблиц.Вставить("DEPOTFILES", "НастройкиХранилищаКонфигурации");
мИменаДополнительныхТаблиц.Вставить("_YEAROFFSET", "СмещениеХраненияДатВГодах");
мИменаДополнительныхТаблиц.Вставить("CONFIGCAS", "СистемноеХранилищеКонфигурацийРасширений");
мИменаДополнительныхТаблиц.Вставить("CONFIGCASSAVE", "СохраненноеСистемноеХранилищеКонфигурацийРасширений");