RDT1C/DataProcessors/ирСтруктураХраненияБД/Ext/ObjectModule.bsl
Администратор b7956738c6 Портативные
*Исправлена свежая ошибка открытия управляемой формы
    Конструктор запроса
        +Для списка доступных таблиц добавлена колонка и переключатель "Количество строк" использующий глобальную статистику
    Форма выбора объекта метаданных
        +Теперь используется глобальная статистика при заполнении колонки "Количество строк"
        *Решена проблема с обновлением количества строк регистров бухгалтерии
    Форма выбора редактируемых типов
        +Добавлена скрытая колонка "Имя XML"
    Интерфейсная панель
        +Переключатель "Количество строк" теперь использует глобальную статистику
    Структура хранения БД
        +Реализовано заполнение колонки "Количество строк" для файловой базы
    Подбор и обработка объектов
        *Устранена запись наборов записей регистров, если их строки не были модифицированы
        +В обработке "Произвольный алгоритм" добавлен флаг "Принудительная запись"
        +В обработке "Изменить добавить строку" в таблице добавлена колонка "Имя типа значения" с возможностью сортировки
        *Исправлена ошибка перечитывания неключевых колонок при наличии полей-функций ТипЗначения в выбранных полях
    Поиск дублей и замена ссылок
        *Исправлена свежая ошибка поиска дублей без учета правых пробелов при наличии в одной группе строковых значений с разным количеством правых пробелов
        *Исправлено свежее ошибочное отрезание последнего символа строковых полей сравнения
    Динамический список
        *Исправлена ошибка открытия расширенного отбора для перечисления
        +Добавлена колонка "Идентификатор ссылки" для перечислений и точек маршрута
    Редактор изменений на узлах
        +Добавлена кнопка "Главный узел..." открывающая новую форму управления главным узлом РИБ
    Консоль запросов
        +В таблице свойств текущей строки результата добавлена колонка "Имя типа значения" с возможностью сортировки
    Консоль кода
        +В таблице параметров добавлена колонка "Имя типа значения" с возможностью сортировки
    Консоль запросов
        +В таблице параметров добавлена колонка "Имя типа значения" с возможностью сортировки
    Редактор объекта БД
        +В таблице реквизитов и отборе регистра добавлена колонка "Имя типа значения" с возможностью сортировки
    Регистрация COM компонент
        *Исправлена проблема наследования прав от каталога установки компонент
2016-12-18 22:11:57 +03:00

279 lines
20 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 = Неопределено Тогда
Возврат;
КонецЕсли;
ТекстЗапроса = ПолучитьМакет("ЗапросРазмеров").ПолучитьТекст();
РезультатЗапроса = Новый COMОбъект("ADODB.Recordset");
adOpenStatic = 3;
adLockOptimistic = 3;
adCmdText = 1;
РезультатЗапроса.Open(ТекстЗапроса, СоединениеADO, adOpenStatic, adLockOptimistic, adCmdText);
//Если СоединениеADO.Properties("Multiple Results").Value <> 0 Тогда
// // Получаем последний результат пакетной команды
// Пока Истина Цикл
// лРезультат = РезультатЗапроса.NextRecordset();
// Если лРезультат = Неопределено Тогда
// Прервать;
// КонецЕсли;
// РезультатЗапроса = лРезультат;
// КонецЦикла;
//КонецЕсли;
ADOUtils = мПлатформа.ПолучитьADOUtils(Истина, , Истина);
ТаблицаРезультата = ADOUtils.ADORecordsetToValueTable(РезультатЗапроса);
Если ОбщаяТаблицаИндексов Тогда
Для Каждого СтрокаРезультата Из ТаблицаРезультата Цикл
КлючПоиска = Новый Структура("НИмяТаблицыХранения, НИмяИндексаХранения", НРег(СтрокаРезультата.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;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьРазмерыФайлойБазы()
ирОбщий.ВычислитьКоличествоСтрокТаблицВДеревеМетаданныхЛкс();
Компонента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", "СхемаБД");
мИменаДополнительныхТаблиц.Вставить("FILES", "Файлы");
мИменаДополнительныхТаблиц.Вставить("PARAMS", "Параметры");
мИменаДополнительныхТаблиц.Вставить("V8USERS", "Пользователи");
мИменаДополнительныхТаблиц.Вставить("IBVERSION", "ВерсияИБ");