RDT1C/src/DataProcessors/ирКолонкиБД/Ext/ObjectModule.bsl
Администратор 10b0dc6cb2 .
2023-02-19 21:23:05 +03:00

139 lines
18 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирКлиент Экспорт;
Перем мПлатформа Экспорт;
Функция РеквизитыДляСервера(Параметры) Экспорт
Результат = ирОбщий.РеквизитыОбработкиЛкс(ЭтотОбъект);
Возврат Результат;
КонецФункции
Функция ЗаполнитьТаблицуКолонок(Параметры) Экспорт
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ПолноеИмяТаблицыБД = Параметры.ПолноеИмяТаблицыБД;
ЭтаФорма = Параметры.ЭтаФорма;
Результат = Новый Структура;
_РежимОтладки = ирКэш.РежимОтладкиЛкс();
Если КолонкиБД.Количество() = 0 Тогда
Если ЭтаФорма <> Неопределено Тогда
ЭтаФорма.ПодключитьОбработчикОжидания("ОчиститьКолонкиБД", 0.1, Истина);
КонецЕсли;
ТаблицаВсехТаблицБД = ирКэш.ТаблицаВсехТаблицБДЛкс();
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(ТаблицаВсехТаблицБД.Количество(), "Анализ метаданных колонок БД");
Для Каждого ОписаниеТаблицы Из ТаблицаВсехТаблицБД Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
Если Ложь
Или ирОбщий.ЛиКорневойТипКритерияОтбораЛкс(ОписаниеТаблицы.Тип)
Или ОписаниеТаблицы.Тип = "ВиртуальнаяТаблица"
Или ОписаниеТаблицы.Тип = "Изменения"
Или ПолноеИмяТаблицыБД <> Неопределено И ОписаниеТаблицы.ПолноеИмя <> ПолноеИмяТаблицыБД
Тогда
Продолжить;
КонецЕсли;
ПоляТаблицыБД = ирКэш.ПоляТаблицыБДЛкс(ОписаниеТаблицы.ПолноеИмя);
Если ПоляТаблицыБД = Неопределено Тогда
Продолжить;
КонецЕсли;
#Если Сервер И Не Сервер Тогда
ПоляТаблицыБД = НайтиПоСсылкам().Колонки;
#КонецЕсли
// Ускорено 5.3с->2.3с
Если _РежимОтладки Тогда // Можно менять на Истина в точке останова, например условием ирОбщий.ПрЛкс(_РежимОтладки, 1, 1)
// Пассивный оригинал расположенного ниже однострочного кода. Выполняйте изменения синхронно в обоих вариантах.
Для Каждого ПолеТаблицыБД Из ПоляТаблицыБД Цикл
ТипЗначения = ПолеТаблицыБД.ТипЗначения;
Если Ложь
Или ТипЗначения.СодержитТип(Тип("ТаблицаЗначений"))
Или (Истина
И Не УчитыватьВсеКолонкиТаблицИзменений
И ОписаниеТаблицы.Тип = "Изменения"
И Не ирОбщий.СтрокиРавныЛкс(ПолеТаблицыБД.Имя, "Узел"))
Тогда
Продолжить;
КонецЕсли;
СтрокаКолонкиБД = КолонкиБД.Добавить();
СтрокаКолонкиБД.КоличествоСтрокНайдено = "?";
СтрокаКолонкиБД.ТипТаблицы = ОписаниеТаблицы.Тип;
СтрокаКолонкиБД.ИмяТаблицы = ОписаниеТаблицы.Имя;
СтрокаКолонкиБД.ПолноеИмяТаблицы = ОписаниеТаблицы.ПолноеИмя;
СтрокаКолонкиБД.ПредставлениеТаблицы = ОписаниеТаблицы.Представление;
СтрокаКолонкиБД.ИмяКолонки = ПолеТаблицыБД.Имя;
СтрокаКолонкиБД.ПредставлениеКолонки = ПолеТаблицыБД.Заголовок;
СтрокаКолонкиБД.ЕстьДоступ = ОписаниеТаблицы.ЕстьДоступ;
СтрокаКолонкиБД.КоличествоСтрокВТаблице = ОписаниеТаблицы.КоличествоСтрок;
СтрокаКолонкиБД.КоличествоТипов = ТипЗначения.Типы().Количество();
СтрокаКолонкиБД.ТипБулевоЕсть = ТипЗначения.СодержитТип(Тип("Булево"));
СтрокаКолонкиБД.ТипУникальныйИдентификаторЕсть = ТипЗначения.СодержитТип(Тип("УникальныйИдентификатор"));
СтрокаКолонкиБД.ТипХранилищеЗначенияЕсть = ТипЗначения.СодержитТип(Тип("ХранилищеЗначения"));
СтрокаКолонкиБД.ТипСтрокаЕсть = ТипЗначения.СодержитТип(Тип("Строка"));
Если СтрокаКолонкиБД.ТипСтрокаЕсть Тогда
СтрокаКолонкиБД.ТипСтрокаДлина = ТипЗначения.КвалификаторыСтроки.Длина;
СтрокаКолонкиБД.ТипСтрокаФиксированнаяДлина = ТипЗначения.КвалификаторыСтроки.ДопустимаяДлина = ДопустимаяДлина.Фиксированная;
КонецЕсли;
СтрокаКолонкиБД.ТипЧислоЕсть = ТипЗначения.СодержитТип(Тип("Число"));
Если СтрокаКолонкиБД.ТипЧислоЕсть Тогда
СтрокаКолонкиБД.ТипЧислоРазрядность = ТипЗначения.КвалификаторыЧисла.Разрядность;
СтрокаКолонкиБД.ТипЧислоРазрядностьДробнойЧасти = ТипЗначения.КвалификаторыЧисла.РазрядностьДробнойЧасти;
КонецЕсли;
СтрокаКолонкиБД.ТипДатаЕсть = ТипЗначения.СодержитТип(Тип("Дата"));
Если СтрокаКолонкиБД.ТипДатаЕсть Тогда
СтрокаКолонкиБД.ТипДатаЧастьДата = ТипЗначения.КвалификаторыДаты.ЧастиДаты <> ЧастиДаты.Время;
СтрокаКолонкиБД.ТипДатаЧастьВремя = ТипЗначения.КвалификаторыДаты.ЧастиДаты <> ЧастиДаты.Дата;
КонецЕсли;
СтрокаКолонкиБД.ТипНеопределеноЕсть = СтрокаКолонкиБД.КоличествоТипов > 1;
Если ПолеТаблицыБД.Метаданные <> Неопределено Тогда
Попытка
СтрокаКолонкиБД.ПодсказкаКолонки = ПолеТаблицыБД.Метаданные.Подсказка;
Исключение
// тип таблицы БД "Перерасчет"
КонецПопытки;
СтрокаКолонкиБД.РольМетаданных = ирОбщий.РольПоляБДЛкс(ПолеТаблицыБД.Метаданные);
КонецЕсли;
СтрокаКолонкиБД.ПолноеИмяКолонки = СтрокаКолонкиБД.ПолноеИмяТаблицы + "." + СтрокаКолонкиБД.ИмяКолонки;
СтрокаКолонкиБД.КоличествоСсылочныхТипов = СтрокаКолонкиБД.КоличествоТипов - ?(СтрокаКолонкиБД.ТипБулевоЕсть, 1, 0) - ?(СтрокаКолонкиБД.ТипДатаЕсть, 1, 0)
- ?(СтрокаКолонкиБД.ТипСтрокаДлина, 1, 0) - ?(СтрокаКолонкиБД.ТипЧислоЕсть, 1, 0) - ?(СтрокаКолонкиБД.ТипУникальныйИдентификаторЕсть, 1, 0) - ?(СтрокаКолонкиБД.ТипХранилищеЗначенияЕсть, 1, 0);
//Если ОписаниеТаблицы.СтруктураКлюча <> Неопределено Тогда
// СтрокаКолонкиБД.Ключевая = ОписаниеТаблицы.СтруктураКлюча.Свойство(ПолеТаблицыБД.Имя);
//КонецЕсли;
КонецЦикла;
Иначе
// Однострочный код использован для ускорения. Выше расположен оригинал. Выполняйте изменения синхронно в обоих вариантах. Преобразовано консолью кода из подсистемы "Инструменты разработчика" (http://devtool1c.ucoz.ru)
Для Каждого ПолеТаблицыБД Из ПоляТаблицыБД Цикл   ТипЗначения = ПолеТаблицыБД.ТипЗначения;   Если Ложь   Или ТипЗначения.СодержитТип(Тип("ТаблицаЗначений"))   Или (Истина   И Не УчитыватьВсеКолонкиТаблицИзменений   И ОписаниеТаблицы.Тип = "Изменения"   И Не ирОбщий.СтрокиРавныЛкс(ПолеТаблицыБД.Имя, "Узел"))   Тогда   Продолжить;   КонецЕсли;   СтрокаКолонкиБД = КолонкиБД.Добавить();   СтрокаКолонкиБД.КоличествоСтрокНайдено = "?";   СтрокаКолонкиБД.ТипТаблицы = ОписаниеТаблицы.Тип;   СтрокаКолонкиБД.ИмяТаблицы = ОписаниеТаблицы.Имя;   СтрокаКолонкиБД.ПолноеИмяТаблицы = ОписаниеТаблицы.ПолноеИмя;   СтрокаКолонкиБД.ПредставлениеТаблицы = ОписаниеТаблицы.Представление;   СтрокаКолонкиБД.ИмяКолонки = ПолеТаблицыБД.Имя;   СтрокаКолонкиБД.ПредставлениеКолонки = ПолеТаблицыБД.Заголовок;   СтрокаКолонкиБД.ЕстьДоступ = ОписаниеТаблицы.ЕстьДоступ;   СтрокаКолонкиБД.КоличествоСтрокВТаблице = ОписаниеТаблицы.КоличествоСтрок;   СтрокаКолонкиБД.КоличествоТипов = ТипЗначения.Типы().Количество();   СтрокаКолонкиБД.ТипБулевоЕсть = ТипЗначения.СодержитТип(Тип("Булево"));   СтрокаКолонкиБД.ТипУникальныйИдентификаторЕсть = ТипЗначения.СодержитТип(Тип("УникальныйИдентификатор"));   СтрокаКолонкиБД.ТипХранилищеЗначенияЕсть = ТипЗначения.СодержитТип(Тип("ХранилищеЗначения"));   СтрокаКолонкиБД.ТипСтрокаЕсть = ТипЗначения.СодержитТип(Тип("Строка"));   Если СтрокаКолонкиБД.ТипСтрокаЕсть Тогда   СтрокаКолонкиБД.ТипСтрокаДлина = ТипЗначения.КвалификаторыСтроки.Длина;   СтрокаКолонкиБД.ТипСтрокаФиксированнаяДлина = ТипЗначения.КвалификаторыСтроки.ДопустимаяДлина = ДопустимаяДлина.Фиксированная;   КонецЕсли;   СтрокаКолонкиБД.ТипЧислоЕсть = ТипЗначения.СодержитТип(Тип("Число"));   Если СтрокаКолонкиБД.ТипЧислоЕсть Тогда   СтрокаКолонкиБД.ТипЧислоРазрядность = ТипЗначения.КвалификаторыЧисла.Разрядность;   СтрокаКолонкиБД.ТипЧислоРазрядностьДробнойЧасти = ТипЗначения.КвалификаторыЧисла.РазрядностьДробнойЧасти;   КонецЕсли;   СтрокаКолонкиБД.ТипДатаЕсть = ТипЗначения.СодержитТип(Тип("Дата"));   Если СтрокаКолонкиБД.ТипДатаЕсть Тогда   СтрокаКолонкиБД.ТипДатаЧастьДата = ТипЗначения.КвалификаторыДаты.ЧастиДаты <> ЧастиДаты.Время;   СтрокаКолонкиБД.ТипДатаЧастьВремя = ТипЗначения.КвалификаторыДаты.ЧастиДаты <> ЧастиДаты.Дата;   КонецЕсли;   СтрокаКолонкиБД.ТипНеопределеноЕсть = СтрокаКолонкиБД.КоличествоТипов > 1;   Если ПолеТаблицыБД.Метаданные <> Неопределено Тогда   Попытка   СтрокаКолонкиБД.ПодсказкаКолонки = ПолеТаблицыБД.Метаданные.Подсказка;   Исключение     КонецПопытки;   СтрокаКолонкиБД.РольМетаданных = ирОбщий.РольПоляБДЛкс(ПолеТаблицыБД.Метаданные);   КонецЕсли;   СтрокаКолонкиБД.ПолноеИмяКолонки = СтрокаКолонкиБД.ПолноеИмяТаблицы + "." + СтрокаКолонкиБД.ИмяКолонки;   СтрокаКолонкиБД.КоличествоСсылочныхТипов = СтрокаКолонкиБД.КоличествоТипов - ?(СтрокаКолонкиБД.ТипБулевоЕсть, 1, 0) - ?(СтрокаКолонкиБД.ТипДатаЕсть, 1, 0)   - ?(СтрокаКолонкиБД.ТипСтрокаДлина, 1, 0) - ?(СтрокаКолонкиБД.ТипЧислоЕсть, 1, 0) - ?(СтрокаКолонкиБД.ТипУникальныйИдентификаторЕсть, 1, 0) - ?(СтрокаКолонкиБД.ТипХранилищеЗначенияЕсть, 1, 0);         КонецЦикла;  
КонецЕсли;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
Если ЭтаФорма <> Неопределено Тогда
ЭтаФорма.ОтключитьОбработчикОжидания("ОчиститьКолонкиБД");
Иначе
Результат.Вставить("КолонкиБД", КолонкиБД.Выгрузить());
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ОбщийМодульЛкс("ирСервер");
//ирПортативный ирКлиент = ирПортативный.ОбщийМодульЛкс("ирКлиент");
мПлатформа = ирКэш.Получить();