RDT1C/CommonModules/ирКэш/Ext/Module.bsl
Администратор 9ef15cab2b .
2016-12-04 00:15:47 +03:00

232 lines
14 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.

#Если Не ТонкийКлиент И Не ВебКлиент Тогда
Функция Получить() Экспорт
//#Если Клиент Или ВнешнееСоединение Или Не Сервер Тогда
Попытка
ирПлатформа = Вычислить("ирПлатформа");
Исключение
КонецПопытки;
Если ирПлатформа = Неопределено Тогда
ирПлатформа = Обработки.ирПлатформа.Создать();
КонецЕсли;
Возврат ирПлатформа;
// В 8.3 это уже не работает. http://partners.v8.1c.ru/forum/thread.jsp?id=1058206#1058206
//#Иначе
// ИмяПараметраСеанса = "ирКэш";
// Попытка
// НадоИнициализировать = ПараметрыСеанса[ИмяПараметраСеанса] = Неопределено;
// Исключение
// НадоИнициализировать = Истина;
// КонецПопытки;
// Если Не НадоИнициализировать Тогда
// Кэш = ПолучитьИзВременногоХранилища(ПараметрыСеанса[ИмяПараметраСеанса]);
// КонецЕсли;
// Если ТипЗнч(Кэш) <> Тип("Структура") Тогда
// Кэш = Обработки.ирПлатформа.Создать();
// //ПараметрыСеанса[ИмяПараметраСеанса] = "1";
// ПараметрыСеанса[ИмяПараметраСеанса] = ПоместитьВоВременноеХранилище(Кэш, Новый УникальныйИдентификатор);
// КонецЕсли;
// Возврат Кэш;
//#КонецЕсли
КонецФункции // Получить()
Функция ПолучитьКомпоновщикТаблицыМетаданныхЛкс(ПолноеИмяМД, ВызыватьИсключениеПриОтсутствииПрав = Истина) Экспорт
СхемаКомпоновкиДанных = ирНеглобальный.ПолучитьСхемуКомпоновкиПоОбъектуМетаданныхЛкс(ПолноеИмяМД,, Ложь);
#Если _ Тогда
СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
#КонецЕсли
Попытка
ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);
Исключение
// Антибаг платформы 8.2.18
// Ошибка при вызове конструктора (ИсточникДоступныхНастроекКомпоновкиДанных)
// ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);
//по причине:
//Ошибка получения информации набора данных
//по причине:
//Ошибка в запросе набора данных
//по причине:
//{(1, 17)}: Неверное присоединение
//ВЫБРАТЬ Т.* ИЗ <<?>>КАК Т
ОбъектМД = Метаданные.НайтиПоПолномуИмени(ПолноеИмяМД);
Если ОбъектМД = Неопределено Тогда
// Возможно эта логика уже есть в какой то функции
Фрагменты = ЛксПолучитьМассивИзСтрокиСРазделителем(ПолноеИмяМД);
Если Фрагменты.Количество() > 1 Тогда
Фрагменты.Удалить(Фрагменты.Количество() - 1);
ПолноеИмяМД = ЛксПолучитьСтрокуСРазделителемИзМассива(Фрагменты, ".");
КонецЕсли;
ОбъектМД = Метаданные.НайтиПоПолномуИмени(ПолноеИмяМД);
КонецЕсли;
Если Ложь
Или ОбъектМД = Неопределено
Или Не ПравоДоступа("Чтение", ОбъектМД)
Тогда
Если ВызыватьИсключениеПриОтсутствииПрав Тогда
ВызватьИсключение "Таблица отсутствует или нет прав на ее чтение """ + ПолноеИмяМД + """";
Иначе
Возврат Неопределено;
КонецЕсли;
Иначе
ВызватьИсключение;
КонецЕсли;
КонецПопытки;
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);
Возврат КомпоновщикНастроек;
КонецФункции
Функция ЛиНемобильныйРежимЛкс() Экспорт
Попытка
Пустышка = Вычислить("ЭтотОбъект");
Результат = Ложь;
Исключение
Результат = Истина;
КонецПопытки;
Возврат Результат;
КонецФункции
Функция ПолучитьСтруктуруХраненияБДЛкс(ЛиИменаБД = Ложь) Экспорт
Результат = ПолучитьСтруктуруХраненияБазыДанных(, ЛиИменаБД);
Результат.Колонки.Добавить("КраткоеИмяТаблицыХранения", Новый ОписаниеТипов("Строка"));
Для Каждого СтрокаТаблицы Из Результат Цикл
СтрокаТаблицы.КраткоеИмяТаблицыХранения = НРег(ЛксПолучитьПоследнийФрагмент(СтрокаТаблицы.ИмяТаблицыХранения));
КонецЦикла;
Результат.Индексы.Добавить("КраткоеИмяТаблицыХранения");
Возврат Результат;
КонецФункции
// Получить словарь метаданных состоящий из шаблонов имен таблиц
//
// Параметры:
// ЛиИменаБД - Булево
//
// Возвращаемое значение:
// Соответствие - словарь шаблонов имен метаданных. Ключ - наименование объекта
// метаданных, где его номер заменен на номер позиции этого
// числа в строке; Значение - количество чисел в строке
//
Функция ПолучитьСловарьШаблоновМетаданных(ЛиИменаБД = Ложь) Экспорт
Перем ПозицияЧисла;
Перем КоличествоСимволов;
СтруктураХраненияБД = ирКэш.ПолучитьСтруктуруХраненияБДЛкс(ЛиИменаБД);
// Создать словарь метаданных
СловарьМетаданных = Новый Соответствие;
// Обработать структуру базы
Для Каждого СтрокаСтруктурыБазы Из СтруктураХраненияБД Цикл
// Скопировать имя таблицы
ИмяТаблицыХранения = Лев(СтрокаСтруктурыБазы.ИмяТаблицыХранения, СтрДлина(СтрокаСтруктурыБазы.ИмяТаблицыХранения));
ШаблонИмениТаблицыХранения = "";
КоличествоЧисел = 0;
ПоследнееИмяШаблона = "";
// Получить шаблон имени
Пока ирНеглобальный.НайтиЧислоВСтрокеЛкс(ИмяТаблицыХранения, ПозицияЧисла, КоличествоСимволов) Цикл
КоличествоЧисел = КоличествоЧисел + 1;
ПоследнееИмяШаблона = Лев(ИмяТаблицыХранения, ПозицияЧисла - 1);
ШаблонИмениТаблицыХранения = ШаблонИмениТаблицыХранения + ПоследнееИмяШаблона + XMLСтрока(КоличествоЧисел);
ИмяТаблицыХранения = Прав(ИмяТаблицыХранения, СтрДлина(ИмяТаблицыХранения) - ПозицияЧисла - КоличествоСимволов + 1);
КонецЦикла;
ШаблонИмениТаблицыХранения = ШаблонИмениТаблицыХранения + ИмяТаблицыХранения;
СловарьМетаданных.Вставить(ШаблонИмениТаблицыХранения, КоличествоЧисел);
Если Не ЛиИменаБД Тогда
// Сохранить шаблон дочерней таблицы независимо
Если КоличествоЧисел > 1 Тогда
Если Лев(ПоследнееИмяШаблона, 1) = "." Тогда
ПоследнееИмяШаблона = Сред(ПоследнееИмяШаблона, 2);
КонецЕсли;
СловарьМетаданных.Вставить(ПоследнееИмяШаблона + "1", 1);
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Предобразовать соответствие в ТЗ и отсортировать ее по ключу в обратном порядке
СловарьТаблица = Новый ТаблицаЗначений;
СловарьТаблица.Колонки.Добавить("Ключ");
СловарьТаблица.Колонки.Добавить("Значение");
Для Каждого СтрокаСловаря Из СловарьМетаданных Цикл
СтрокаТаблицыСловаря = СловарьТаблица.Добавить();
СтрокаТаблицыСловаря.Ключ = НРег(СтрокаСловаря.Ключ);
СтрокаТаблицыСловаря.Значение = СтрокаСловаря.Значение;
КонецЦикла;
СловарьТаблица.Сортировать("Ключ Убыв");
Возврат СловарьТаблица;
КонецФункции
Функция ПолучитьСеансПустойИнфобазы1С8Лкс(Знач ТипКомОбъекта = "Application", Знач Видимость = Ложь, Знач ОбработатьИсключениеПодключения = Ложь,
ОписаниеОшибки = "", ИмяСервераПроцессов = "") Экспорт
СтрокаСоединения = ирНеглобальный.ПолучитьСтрокуСоединенияПустойИнфобазыЛкс();
Сеанс = ирНеглобальный.СоздатьСеансИнфобазы1С8Лкс(СтрокаСоединения, , , ТипКомОбъекта, Видимость, ОбработатьИсключениеПодключения,
ОписаниеОшибки, ИмяСервераПроцессов);
Возврат Сеанс;
КонецФункции
#Если Клиент Тогда
Функция ПолучитьАнализТехножурналаЛкс() Экспорт
Результат = Обработки.ирАнализТехножурнала.Создать();
Возврат Результат;
КонецФункции
#КонецЕсли
#КонецЕсли
Функция ЭтоФайловаяБазаЛкс() Экспорт
ИмяКластераСерверов = НСтр(СтрокаСоединенияИнформационнойБазы(), "Srvr");
ЭтоФайловаяБаза = ПустаяСтрока(ИмяКластераСерверов);
Возврат ЭтоФайловаяБаза;
КонецФункции // ЭтоФайловаяБазаИис()
Функция ПолучитьСтрокуСоединенияСервераЛкс() Экспорт
Результат = ирСервер.ПолучитьСтрокуСоединенияСервераЛкс();
Возврат Результат;
КонецФункции
Функция ПолучитьCOMОбъектWMIЛкс(Знач ИмяСервера = Неопределено, Знач ИмяСервераИсполнителя = Неопределено, Знач ТочкаПодключения = Неопределено) Экспорт
//http://msdn.microsoft.com/en-us/library/windows/desktop/aa389763(v=vs.85).aspx
Если Не ЗначениеЗаполнено(ИмяСервераИсполнителя) Тогда
Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
Иначе
Locator = Новый COMОбъект("WbemScripting.SWbemLocator", ИмяСервераИсполнителя);
КонецЕсли;
Если Не ЗначениеЗаполнено(ИмяСервера) Тогда
ИмяСервера = ".";
КонецЕсли;
Если Не ЗначениеЗаполнено(ТочкаПодключения) Тогда
ТочкаПодключения = "root\cimv2";
КонецЕсли;
Попытка
СлужбаWMI = Locator.ConnectServer(ИмяСервера, ТочкаПодключения, , , ТекущийЯзыкСистемы());
Исключение
СлужбаWMI = Неопределено;
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Возврат СлужбаWMI;
КонецФункции