RDT1C/CommonModules/ирКэш/Ext/Module.bsl
Администратор 41f19de0f7 .
2019-12-08 20:22:24 +03:00

1088 lines
72 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.

//ирПортативный Перем ирПлатформа Экспорт; // Эта переменная нужна только здесь
//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
#Если Не ТонкийКлиент И Не ВебКлиент И Не МобильныйКлиент Тогда
Функция Получить() Экспорт
// Не следует использовать для хранения таких данных, переинициализация которых автоматически невозможна или приведет к ошибкам
//#Если Клиент Или ВнешнееСоединение Или Не Сервер Тогда
Попытка
ирПлатформа = Вычислить("ирПлатформа");
Исключение
КонецПопытки;
Если ирПлатформа = Неопределено Тогда
//ирСервер.СтрокаСоединенияСервераЛкс(); // http://www.hostedredmine.com/issues/851201
ирПлатформа = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирПлатформа");
#Если Сервер И Не Сервер Тогда
ирПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
КонецЕсли;
Возврат ирПлатформа;
// В 8.3 это уже не работает. http://partners.v8.1c.ru/forum/thread.jsp?id=1058206#1058206
//#Иначе
// ИмяПараметраСеанса = "ирКэш";
// Попытка
// НадоИнициализировать = ПараметрыСеанса[ИмяПараметраСеанса] = Неопределено;
// Исключение
// НадоИнициализировать = Истина;
// КонецПопытки;
// Если Не НадоИнициализировать Тогда
// Кэш = ПолучитьИзВременногоХранилища(ПараметрыСеанса[ИмяПараметраСеанса]);
// КонецЕсли;
// Если ТипЗнч(Кэш) <> Тип("Структура") Тогда
// Кэш = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Обработкп.ирПлатформа");
// //ПараметрыСеанса[ИмяПараметраСеанса] = "1";
// ПараметрыСеанса[ИмяПараметраСеанса] = ПоместитьВоВременноеХранилище(Кэш, Новый УникальныйИдентификатор);
// КонецЕсли;
// Возврат Кэш;
//#КонецЕсли
КонецФункции // Получить()
Функция ИмяПродукта() Экспорт
Возврат "ИнструментыРазработчикаTormozit";
КонецФункции
Функция КомпоновщикТаблицыМетаданныхЛкс(Знач ПолноеИмяМД, ВызыватьИсключениеПриОтсутствииПрав = Истина, ИндексПараметраПериодичность = Неопределено,
ВыражениеПараметраПериодичность = "", ИменаВместоПредставлений = Ложь) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КомпоновщикТаблицыМетаданныхЛкс");
КлючНаборПараметров = "" + ПолноеИмяМД + ";" + ВызыватьИсключениеПриОтсутствииПрав + ";" + ИндексПараметраПериодичность + ";" + ВыражениеПараметраПериодичность
+ ";" + ИменаВместоПредставлений;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
КомпоновщикНастроек = ирОбщий.КомпоновщикТаблицыМетаданныхЛкс(ПолноеИмяМД, ВызыватьИсключениеПриОтсутствииПрав, ИндексПараметраПериодичность, ВыражениеПараметраПериодичность, ИменаВместоПредставлений);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = КомпоновщикНастроек;
КонецЕсли;
Возврат КомпоновщикНастроек;
КонецФункции
Функция ПоляТаблицыБДЛкс(ПолноеИмяТаблицыБД, _ВызыватьИсключениеПриОтсутствииПрав = Истина, ИндексПараметраПериодичность = Неопределено, ВыражениеПараметраПериодичность = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПоляТаблицыБДЛкс");
КлючНаборПараметров = "" + ПолноеИмяТаблицыБД + ";" + _ВызыватьИсключениеПриОтсутствииПрав + ";" + ИндексПараметраПериодичность + ";" + ВыражениеПараметраПериодичность;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = ирОбщий.ПоляТаблицыБДЛкс(ПолноеИмяТаблицыБД, _ВызыватьИсключениеПриОтсутствииПрав, ИндексПараметраПериодичность, ВыражениеПараметраПериодичность);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ИндивидуальныеТаблицыКонстантДоступныЛкс() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Результат = ирКэш.НомерРежимаСовместимостиЛкс() >= 802014;
Возврат Результат;
КонецФункции
Функция ТаблицаВсехТаблицБДЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ТаблицаВсехТаблицБДЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ТаблицаВсехТаблицБД = Неопределено;
// Этот способ оказался в большинстве случаев медленнее чем вычислять таблицу каждый раз
//Если мПлатформа.ИДВерсииПлатформы > "82" Тогда
// #Если Клиент Тогда
// Состояние("Получение структуры хранения БД...");
// #КонецЕсли
// СтруктураХраненияБД = ПолучитьСтруктуруХраненияБазыДанных(, Ложь);
// #Если Клиент Тогда
// Состояние("");
// #КонецЕсли
// ХМЛСтруктурыХранения = ЗначениеВСтрокуВнутр(СтруктураХраненияБД);
// Хеширование = Вычислить("Новый ХешированиеДанных(ХешФункция.MD5)");
// Хеширование.Добавить(ХМЛСтруктурыХранения);
// ХешСтруктурыХранения = Хеширование.ХешСумма;
// ФайлКэша = Новый Файл(мПлатформа.КаталогФайловогоКэша + "\irAllDBTables.tbl");
// Если ФайлКэша.Существует() Тогда
// КешТаблиц = ЗначениеИзФайла(ФайлКэша.ПолноеИмя);
// Если КешТаблиц.ХешСтруктурыХранения = ХешСтруктурыХранения Тогда
// ТаблицаВсехТаблицБД = КешТаблиц.ТаблицаВсехТаблицБД;
// КонецЕсли;
// КонецЕсли;
//КонецЕсли;
Если ТаблицаВсехТаблицБД = Неопределено Тогда
ТаблицаВсехТаблицБД = Новый ТаблицаЗначений;
ТаблицаВсехТаблицБД.Колонки.Добавить("ПолноеИмяМД");
ТаблицаВсехТаблицБД.Колонки.Добавить("НПолноеИмя");
ТаблицаВсехТаблицБД.Колонки.Добавить("ПолноеИмя");
ТаблицаВсехТаблицБД.Колонки.Добавить("Имя");
ТаблицаВсехТаблицБД.Колонки.Добавить("Представление");
ТаблицаВсехТаблицБД.Колонки.Добавить("Тип");
ТаблицаВсехТаблицБД.Колонки.Добавить("Схема");
ТаблицаВсехТаблицБД.Колонки.Добавить("ИндексПараметраОтбора");
ТаблицаВсехТаблицБД.Колонки.Добавить("КоличествоСтрок");
ТаблицаВсехТаблицБД.Колонки.Добавить("ТипСсылки");
КоллекцияКорневыхТипов = Новый Массив;
СтрокиМетаОбъектов = мПлатформа.ТаблицаТиповМетаОбъектов.НайтиСтроки(Новый Структура("Категория", 0));
Для Каждого СтрокаТаблицыМетаОбъектов Из СтрокиМетаОбъектов Цикл
Единственное = СтрокаТаблицыМетаОбъектов.Единственное;
Если Ложь
Или Единственное = "Константа"
Или Единственное = "КритерийОтбора"
Или Единственное = "ЖурналДокументов"
Или ирОбщий.ЛиКорневойТипПеречисленияЛкс(Единственное)
Или ирОбщий.ЛиКорневойТипСсылочногоОбъектаБДЛкс(Единственное)
Или ирОбщий.ЛиКорневойТипРегистраБДЛкс(Единственное)
Или ирОбщий.ЛиКорневойТипПоследовательностиЛкс(Единственное)
Тогда
КоллекцияКорневыхТипов.Добавить(Единственное);
КонецЕсли;
КонецЦикла;
Если ирКэш.НомерРежимаСовместимостиЛкс() >= 802013 Тогда
Для Каждого МетаВнешнийИсточникДанных Из Метаданные.ВнешниеИсточникиДанных Цикл
КоллекцияКорневыхТипов.Добавить(МетаВнешнийИсточникДанных.ПолноеИмя());
КонецЦикла;
КонецЕсли;
Если Метаданные.Константы.Количество() > 0 Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ирОбщий.ПеревестиСтроку("Константы"),, "Константы");
КонецЕсли;
мСтрокаТипаВнешнегоИсточникаДанных = мПлатформа.ПолучитьСтрокуТипаМетаОбъектов("ВнешнийИсточникДанных", , 0);
ИмяДвиженияССубконто = ирОбщий.ПеревестиСтроку("ДвиженияССубконто");
ИмяГраницы = ирОбщий.ПеревестиСтроку("Границы");
ИмяЗадачиПоИсполнителю = ирОбщий.ПеревестиСтроку("ЗадачиПоИсполнителю");
ИмяКонстанта = ирОбщий.ПеревестиСтроку("Константа");
ИмяОбороты = ирОбщий.ПеревестиСтроку("Обороты");
ИмяОборотыДтКт = ирОбщий.ПеревестиСтроку("ОборотыДтКт");
ИмяОстатки = ирОбщий.ПеревестиСтроку("Остатки");
ИмяОстаткиИОбороты = ирОбщий.ПеревестиСтроку("ОстаткиИОбороты");
ИмяСрезПервых = ирОбщий.ПеревестиСтроку("СрезПервых");
ИмяСрезПоследних = ирОбщий.ПеревестиСтроку("СрезПоследних");
ИмяСубконто = ирОбщий.ПеревестиСтроку("Субконто");
ИмяТабличнаяЧасть = ирОбщий.ПеревестиСтроку("ТабличнаяЧасть");
ИмяТочки = ирОбщий.ПеревестиСтроку("Точки");
ИндикаторТипов = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияКорневыхТипов.Количество(), "Анализ структуры БД");
Для Каждого КорневойТип Из КоллекцияКорневыхТипов Цикл
ирОбщий.ОбработатьИндикаторЛкс(ИндикаторТипов);
СтрокаКорневогоТипа = мПлатформа.ПолучитьСтрокуТипаМетаОбъектов(КорневойТип);
Если СтрокаКорневогоТипа = Неопределено Тогда
СтрокаКорневогоТипа = мСтрокаТипаВнешнегоИсточникаДанных;
МножественноеКорневогоТипа = СтрокаКорневогоТипа.Множественное;
ОбъектМДКорневогоТипа = Метаданные.НайтиПоПолномуИмени(КорневойТип);
КоллекцияМетаданных = ОбъектМДКорневогоТипа.Таблицы;
ПредставлениеКатегории = ОбъектМДКорневогоТипа.Представление();
СхемаТаблиц = ОбъектМДКорневогоТипа.Имя;
КорневойТип = "Внешняя";
Иначе
МножественноеКорневогоТипа = СтрокаКорневогоТипа.Множественное;
ПредставлениеКатегории = ирОбщий.ПолучитьПредставлениеИзИдентификатораЛкс(МножественноеКорневогоТипа);
СхемаТаблиц = "";
Если КорневойТип = "Перерасчет" Тогда
КоллекцияМетаданных = Новый Массив;
Для Каждого МетаРегистрРасчета Из Метаданные.РегистрыРасчета Цикл
Для Каждого Перерасчет Из МетаРегистрРасчета.Перерасчеты Цикл
КоллекцияМетаданных.Добавить(Перерасчет);
КонецЦикла;
КонецЦикла;
Иначе
КоллекцияМетаданных = Метаданные[МножественноеКорневогоТипа];
КонецЕсли;
КонецЕсли;
Если КоллекцияМетаданных.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
ЛиКорневойТипСсылки = ирОбщий.ЛиКорневойТипСсылкиЛкс(КорневойТип);
ЛиКорневойТипСсылочногоОбъекта = ирОбщий.ЛиКорневойТипСсылочногоОбъектаБДЛкс(КорневойТип);
//ПредставлениеТипаТаблицы = ирОбщий.ПолучитьПредставлениеИзИдентификатораЛкс(МножественноеКорневогоТипа);
ИндикаторТипа = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияМетаданных.Количество(), "Анализ " + КорневойТип);
Для Каждого МетаИсточник Из КоллекцияМетаданных Цикл
ирОбщий.ОбработатьИндикаторЛкс(ИндикаторТипа);
ПолноеИмяМД = МетаИсточник.ПолноеИмя();
ТипТаблицы = КорневойТип;
Если ТипТаблицы = "КритерийОтбора" Тогда
ТипТаблицы = "ВиртуальнаяТаблица";
КонецЕсли;
Если Ложь
Или КорневойТип <> "Константа"
Или ирКэш.ИндивидуальныеТаблицыКонстантДоступныЛкс()
Тогда
СтрокаОсновнойТаблицы = ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ирОбщий.ИмяТаблицыИзМетаданныхЛкс(ПолноеИмяМД,, Ложь), ПолноеИмяМД, ТипТаблицы, МетаИсточник.Имя,
МетаИсточник.Представление(), СхемаТаблиц, , МетаИсточник);
Если ЛиКорневойТипСсылки Тогда
СтрокаОсновнойТаблицы.ТипСсылки = Тип(ирОбщий.ИмяТипаИзПолногоИмениМДЛкс(ПолноеИмяМД));
КонецЕсли;
Если ЛиКорневойТипСсылочногоОбъекта Тогда
СтруктураТЧ = ирОбщий.ТабличныеЧастиОбъектаЛкс(МетаИсточник);
Для Каждого КлючИЗначение Из СтруктураТЧ Цикл
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + КлючИЗначение.Ключ, ПолноеИмяМД + "." + ИмяТабличнаяЧасть + "." + КлючИЗначение.Ключ, "ТабличнаяЧасть", ,
МетаИсточник.Представление() + "." + КлючИЗначение.Значение);
КонецЦикла;
Если КорневойТип = "БизнесПроцесс" Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяТочки,, "Точки", , МетаИсточник.Представление() + "." + "Точки");
КонецЕсли;
Если КорневойТип = "Задача" Тогда
Если МетаИсточник.Адресация <> Неопределено Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяЗадачиПоИсполнителю,, "ВиртуальнаяТаблица", ,
МетаИсточник.Представление() + "." + "Задачи по исполнителю",,,, 1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если КорневойТип = "РегистрСведений" Тогда
Если МетаИсточник.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяСрезПоследних,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Срез последних",,,, 1);
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяСрезПервых,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Срез первых",,,, 1);
КонецЕсли;
ИначеЕсли КорневойТип = "РегистрНакопления" Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОбороты,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Обороты",,,, 3);
Если МетаИсточник.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОстатки,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Остатки",,,, 1);
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОстаткиИОбороты,, "ВиртуальнаяТаблица", ,
МетаИсточник.Представление() + "." + "Остатки и обороты",,,, 4);
КонецЕсли;
ИначеЕсли КорневойТип = "РегистрБухгалтерии" Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяДвиженияССубконто,, "ДвиженияССубконто", ,
МетаИсточник.Представление() + "." + "Движения с субконто",,,, 2);
Если МетаИсточник.ПланСчетов.МаксКоличествоСубконто > 0 Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяСубконто,, "Субконто", , МетаИсточник.Представление() + "." + "Субконто");
КонецЕсли;
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОбороты,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Обороты",,,, 5);
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОборотыДтКт,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Обороты Дт Кт",,,, 7);
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОстатки,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Остатки",,,, 3);
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОстаткиИОбороты,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Остатки и обороты",,,, 6);
//ИначеЕсли КорневойТип = "РегистрРасчета" Тогда
// Для Каждого Перерасчет Из МетаИсточник.Перерасчеты Цикл
// ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ирОбщий.ИмяТаблицыИзМетаданныхЛкс(Перерасчет), "Перерасчет", Перерасчет.Имя, Перерасчет.Представление(), , , Перерасчет);
// КонецЦикла;
ИначеЕсли КорневойТип = "Последовательность" Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяГраницы,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Границы");
КонецЕсли;
КонецЕсли;
Если ирОбщий.ЕстьТаблицаИзмененийОбъектаМетаданных(МетаИсточник) Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ирОбщий.ИмяТаблицыИзМетаданныхЛкс(ПолноеИмяМД, Истина, Ложь), , "Изменения", МетаИсточник.Имя,
МетаИсточник.Представление() + "." + "Изменения");
КонецЕсли;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
ТаблицаВсехТаблицБД.Индексы.Добавить("НПолноеИмя");
ТаблицаВсехТаблицБД.Сортировать("НПолноеИмя");
//Если ФайлКэша <> Неопределено Тогда
// КешТаблиц = Новый Структура("ТаблицаВсехТаблицБД, ХешСтруктурыХранения", ТаблицаВсехТаблицБД, ХешСтруктурыХранения);
// ЗначениеВФайл(ФайлКэша.ПолноеИмя, КешТаблиц);
//КонецЕсли;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = ТаблицаВсехТаблицБД;
КонецЕсли;
Возврат ТаблицаВсехТаблицБД;
КонецФункции
Функция ЛиПортативныйРежимЛкс() Экспорт
//Попытка
// Пустышка = ирПортативный.мВнешниеМодули;
// Результат = Истина;
//Исключение
// Результат = Ложь;
//КонецПопытки;
Результат = ТипЗнч(ирПортативный) <> Тип("ОбщийМодуль");
Возврат Результат;
КонецФункции
Функция ЛиЭтоРасширениеКонфигурацииЛкс() Экспорт
Результат = ирКэш.ЭтотРасширениеКонфигурацииЛкс() <> Неопределено;
Возврат Результат;
КонецФункции
Функция ЭтотРасширениеКонфигурацииЛкс() Экспорт
Результат = ирОбщий.ЭтотРасширениеКонфигурацииЛкс();
Возврат Результат;
КонецФункции
Функция ПолучитьСтруктуруХраненияБДЛкс(ЛиИменаБД = Ложь, ВычислитьИменаИндексов = Истина, АдресЧужойСхемыБД = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПолучитьСтруктуруХраненияБДЛкс");
КлючНаборПараметров = "" + ЛиИменаБД + ";" + ВычислитьИменаИндексов + ";" + АдресЧужойСхемыБД;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = ирОбщий.ПолучитьСтруктуруХраненияБДЛкс(, ЛиИменаБД, ВычислитьИменаИндексов, АдресЧужойСхемыБД);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
// Получить словарь метаданных состоящий из шаблонов имен таблиц
//
// Параметры:
// ЛиИменаБД - Булево
//
// Возвращаемое значение:
// Соответствие - словарь шаблонов имен метаданных. Ключ - наименование объекта
// метаданных, где его номер заменен на номер позиции этого
// числа в строке; Значение - количество чисел в строке
//
Функция ПолучитьСловарьШаблоновМетаданныхЛкс(ЛиИменаБД = Ложь, АдресЧужойСхемыБД = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПолучитьСловарьШаблоновМетаданныхЛкс");
КлючНаборПараметров = "" + ЛиИменаБД + ";" + АдресЧужойСхемыБД;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
СтруктураХраненияБД = ирКэш.ПолучитьСтруктуруХраненияБДЛкс(ЛиИменаБД, , АдресЧужойСхемыБД);
Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("РегулярныйШаблон");
Результат.Колонки.Добавить("ПозиционныйШаблон");
Результат.Колонки.Добавить("КоличествоПараметров");
КоличествоСимволов = 0;
ПозицияЧисла = 0;
Для Каждого СтрокаСтруктурыБазы Из СтруктураХраненияБД Цикл
ИмяТаблицыХранения = НРег(Лев(СтрокаСтруктурыБазы.ИмяТаблицыХранения, СтрДлина(СтрокаСтруктурыБазы.ИмяТаблицыХранения)));
РегулярныйШаблон = "";
ПозиционныйШаблон = "";
КоличествоЧисел = 0;
ПоследнееИмяШаблона = "";
Пока ирОбщий.НайтиЧислоВСтрокеЛкс(ИмяТаблицыХранения, ПозицияЧисла, КоличествоСимволов) Цикл
КоличествоЧисел = КоличествоЧисел + 1;
ПоследнееИмяШаблона = Лев(ИмяТаблицыХранения, ПозицияЧисла - 1);
РегулярныйШаблон = РегулярныйШаблон + ПоследнееИмяШаблона + "(\d+)";
ПозиционныйШаблон = ПозиционныйШаблон + ПоследнееИмяШаблона + XMLСтрока(КоличествоЧисел);
ИмяТаблицыХранения = Прав(ИмяТаблицыХранения, СтрДлина(ИмяТаблицыХранения) - ПозицияЧисла - КоличествоСимволов + 1);
КонецЦикла;
РегулярныйШаблон = РегулярныйШаблон + ИмяТаблицыХранения;
ПозиционныйШаблон = ПозиционныйШаблон + ИмяТаблицыХранения;
СтрокаТаблицыСловаря = Результат.Добавить();
СтрокаТаблицыСловаря.РегулярныйШаблон = НРег(РегулярныйШаблон);
СтрокаТаблицыСловаря.ПозиционныйШаблон = ПозиционныйШаблон;
СтрокаТаблицыСловаря.КоличествоПараметров = КоличествоЧисел;
Если Не ЛиИменаБД Тогда
// Сохранить шаблон дочерней таблицы независимо
Если КоличествоЧисел > 1 Тогда
Если Лев(ПоследнееИмяШаблона, 1) = "." Тогда
ПоследнееИмяШаблона = Сред(ПоследнееИмяШаблона, 2);
КонецЕсли;
РегулярныйШаблон = ПоследнееИмяШаблона + "(\d+)";
ПозиционныйШаблон = ПоследнееИмяШаблона + XMLСтрока(КоличествоЧисел);
СтрокаТаблицыСловаря = Результат.Добавить();
СтрокаТаблицыСловаря.РегулярныйШаблон = НРег(РегулярныйШаблон);
СтрокаТаблицыСловаря.ПозиционныйШаблон = ПозиционныйШаблон;
СтрокаТаблицыСловаря.КоличествоПараметров = 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Результат.Свернуть("РегулярныйШаблон,ПозиционныйШаблон,КоличествоПараметров");
Результат.Сортировать("ПозиционныйШаблон");
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолучитьСеансПустойИнфобазы1С8Лкс(Знач ТипCOMОбъекта = "Application", Знач Видимость = Ложь, Знач ОбработатьИсключениеПодключения = Ложь,
ОписаниеОшибки = "", ИмяСервераПроцессов = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПолучитьСеансПустойИнфобазы1С8Лкс");
КлючНаборПараметров = "" + ТипCOMОбъекта + ";" + Видимость + ";" + ОбработатьИсключениеПодключения + ";" + ОписаниеОшибки + ";" + ИмяСервераПроцессов;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
СтрокаСоединения = ирОбщий.СтрокаСоединенияПустойИнфобазыЛкс();
Результат = ирОбщий.СоздатьСеансИнфобазы1С8Лкс(СтрокаСоединения, , , ТипCOMОбъекта, Видимость, ОбработатьИсключениеПодключения,
ОписаниеОшибки, ИмяСервераПроцессов);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция БуферСравненияЛкс(ТипДанных) Экспорт
Попытка
ирПлатформа = Вычислить("ирПлатформа");
Исключение
КонецПопытки;
Если ирПлатформа = Неопределено Тогда
Результат = Новый Массив();
Иначе
Результат = ирПлатформа.БуферыСравнения[ТипДанных];
Если Результат = Неопределено Тогда
Результат = Новый Массив;
ирПлатформа.БуферыСравнения[ТипДанных] = Результат;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолучитьWinAPI() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
WinAPI = мПлатформа.ПолучитьWinAPI();
Возврат WinAPI;
КонецФункции
Функция ФорматБуфераОбмена1СЛкс() Экспорт
WinAPI = ирКэш.ПолучитьWinAPI();
Если WinAPI <> Неопределено Тогда
ФорматБуфераОбмена1С = WinAPI.RegisterClipboardFormat("V8Value");
КонецЕсли;
Возврат ФорматБуфераОбмена1С;
КонецФункции
Функция ВнутреннийБуферОбмена() Экспорт
Результат = Новый Структура("Значение");
Возврат Результат;
КонецФункции
Функция Это64битнаяОСЛкс(Компьютер = Неопределено) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("Это64битнаяОСЛкс");
КлючНаборПараметров = "" + Компьютер;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
мWMI = ирКэш.ПолучитьCOMОбъектWMIЛкс(Компьютер);
// http://www.forum.mista.ru/topic.php?id=752260
//ИмяКласса = "Win32_OperatingSystem";
//КоллекцияОС = мWMI.InstancesOf(ИмяКласса);
//Для каждого лОС Из КоллекцияОС Цикл
// Прервать;
//КонецЦикла;
//Результат = Лев(лОС.OSArchitecture, 2) = "64";
РезультатЗапроса = мWMI.ExecQuery("select AddressWidth from Win32_Processor where DeviceID=""CPU0"" AND AddressWidth=64");
Результат = РезультатЗапроса.Count > 0;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает смещение времени из-за некорректной функции ПолучитьВремяИзменения()
// Часть примечание из описания функции:
// В режиме совместимости выдает местное время последней модификации файла с ошибкой NTFS.
// Если файл изменен летом, а просматривается зимой, то полученное время отстает на 1 час.
// Если файл изменен зимой, а просматривается летом, то полученное время опережает на 1 час.
//
// Источник - http://infostart.ru/public/323233/
// Автор - OtTech http://infostart.ru/profile/492011/
//
// Возвращаемое значение:
// Число - Количество секунд смещения.
//
Функция ПолучитьСмещениеВремениЛкс() Экспорт
ИмяФайла = ПолучитьИмяВременногоФайла();
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Записать(ИмяФайла);
Файл = Новый Файл(ИмяФайла);
Разница = ОКР((ТекущаяДата() - Файл.ПолучитьВремяИзменения()) / 3600);
УдалитьФайлы(ИмяФайла);
Возврат Разница * 3600;
КонецФункции
Функция ПолучитьАнализТехножурналаЛкс() Экспорт
Результат = ирОбщий.ПолучитьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирАнализТехножурнала");
Возврат Результат;
КонецФункции
Функция КоличествоОшибокВЖурналеЛкс(Знач Начало, Знач Конец, Знач СтруктураОтбора, Знач МаксимальныйРазмерВыгрузки = Неопределено) Экспорт
КоличествоОшибокВЖурнале = ирОбщий.КоличествоОшибокВЖурналеЛкс(Начало, Конец, СтруктураОтбора, МаксимальныйРазмерВыгрузки);
Возврат КоличествоОшибокВЖурнале;
КонецФункции
Функция ПолучитьСеансТонкогоКлиентаЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПолучитьСеансТонкогоКлиентаЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
СвязанныйСеансТонкогоКлиента = ирОбщий.ЗапуститьСеансПодПользователемЛкс(ИмяПользователя(),, "c.Application",,,, Ложь, Ложь);
Попытка
СвязанныйСеансТонкогоКлиента.Visible = Истина;
Исключение
Сообщить("Не удалось подключить тонкий клиент через COM", СтатусСообщения.Внимание);
Возврат Неопределено;
КонецПопытки;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = СвязанныйСеансТонкогоКлиента;
КонецЕсли;
Возврат СвязанныйСеансТонкогоКлиента;
КонецФункции
Функция ОбъектыМетаданныхСРегистрациейИзменений() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ОбъектыМетаданныхСРегистрациейИзменений");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый Соответствие;
Для Каждого МетаПланОбмена Из Метаданные.ПланыОбмена Цикл
Для Каждого ЭлементСостава Из МетаПланОбмена.Состав Цикл
Результат[ЭлементСостава.Метаданные.ПолноеИмя()] = 1;
КонецЦикла;
КонецЦикла;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ВКОбщая() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ВКОбщая");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Попытка
ВК = Новый ("AddIn.ирОбщая.AddIn");
Исключение
Это64битныйПроцесс = Это64битныйПроцессЛкс();
ИмяМакета = "ВК";
Если Это64битныйПроцесс Тогда
ИмяМакета = ИмяМакета + "64";
Иначе
ИмяМакета = ИмяМакета + "32";
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
ДвоичныеДанные = ирПортативный.ПолучитьМакет(ИмяМакета);
Иначе
ДвоичныеДанные = Обработки.ирПортативный.ПолучитьМакет(ИмяМакета);
КонецЕсли;
АдресКомпоненты = ПолучитьИмяВременногоФайла("dll");
ДвоичныеДанные.Записать(АдресКомпоненты);
//АдресКомпоненты = "D:\VC\Native_Comp_RDT\binWin32\AddInNative.dll"; // Для отладки
Результат = ПодключитьВнешнююКомпоненту(АдресКомпоненты, "ирОбщая", ТипВнешнейКомпоненты.Native);
Если Не Результат Тогда
ВызватьИсключение "Не удалось подключить внешнюю компоненту Общая";
КонецЕсли;
ВК = Новый ("AddIn.ирОбщая.AddIn");
КонецПопытки;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = ВК;
КонецЕсли;
Возврат ВК;
КонецФункции
Функция КорневыеТипыСсылочныеЛкс() Экспорт
Результат = Новый Массив;
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
СтрокиМетаОбъектов = мПлатформа.ТаблицаТиповМетаОбъектов.НайтиСтроки(Новый Структура("Категория", 0));
Для Каждого СтрокаТаблицыМетаОбъектов Из СтрокиМетаОбъектов Цикл
Единственное = СтрокаТаблицыМетаОбъектов.Единственное;
Если ирОбщий.ЛиКорневойТипСсылочногоОбъектаБДЛкс(Единственное) Тогда
Результат.Добавить(СтрокаТаблицыМетаОбъектов);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ЭтоФоновоеЗаданиеЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
Возврат Ложь;
КонецЕсли;
ТекущийСеанс = ирКэш.ТекущийСеансЛкс();
Если ТекущийСеанс = Неопределено Тогда
Результат = Ложь;
Иначе
Результат = ирОбщий.СтрокиРавныЛкс(ТекущийСеанс.ИмяПриложения, "BackgroundJob");
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ТекущийСеансЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ТекущийСеансЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = ирПривилегированный.ТекущийСеансЛкс();
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ДоступнаЗащитаОтОпасныхДействийЛкс() Экспорт
ЗащитаОтОпасныхДействийЛ = Неопределено;
Попытка
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
ЗащитаОтОпасныхДействийЛ = ТекущийПользователь.ЗащитаОтОпасныхДействий;
Исключение
КонецПопытки;
Возврат ЗащитаОтОпасныхДействийЛ <> Неопределено;
КонецФункции
Функция НомерРежимаСовместимостиЛкс() Экспорт
ТекущийРежимСовместимости = Метаданные.РежимСовместимости;
Если ТекущийРежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
СисИнфо = Новый СистемнаяИнформация;
Фрагменты = ирОбщий.ПолучитьМассивИзСтрокиСРазделителемЛкс(СисИнфо.ВерсияПриложения);
Иначе
// Пример значения СтрокаВерсии = Версия8_3_1
ТекущийРежимСовместимости = СтрЗаменить(ТекущийРежимСовместимости, "Версия", "");
ТекущийРежимСовместимости = СтрЗаменить(ТекущийРежимСовместимости, "Version", ""); // Вариант встроенного языка Английский
Фрагменты = ирОбщий.ПолучитьМассивИзСтрокиСРазделителемЛкс(ТекущийРежимСовместимости, "_");
КонецЕсли;
Результат = Число(Фрагменты[0]) * 100 * 1000 + Число(Фрагменты[1]) * 1000;
Если Фрагменты.Количество() > 2 Тогда
Результат = Результат + Число(Фрагменты[2]);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция НомерИзданияПлатформыЛкс() Экспорт
СисИнфо = Новый СистемнаяИнформация;
Фрагменты = ирОбщий.ПолучитьМассивИзСтрокиСРазделителемЛкс(СисИнфо.ВерсияПриложения);
Результат = Фрагменты[0] + Фрагменты[1];
Возврат Результат;
КонецФункции
Функция НомерВерсииПлатформыЛкс(ВключаяНомерСборки = Ложь) Экспорт
СисИнфо = Новый СистемнаяИнформация;
Фрагменты = ирОбщий.ПолучитьМассивИзСтрокиСРазделителемЛкс(СисИнфо.ВерсияПриложения);
Результат = Число(Фрагменты[0]) * 100 * 1000 + Число(Фрагменты[1]) * 1000 + Число(Фрагменты[2]); // 6 цифр
Если ВключаяНомерСборки Тогда
Результат = Результат * 10000 + Число(Фрагменты[3]); // 10 цифр
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ВерсияБСПЛкс() Экспорт
Если Метаданные.РегистрыСведений.Найти("ВерсииПодсистем") <> Неопределено Тогда
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| ВерсииПодсистем.Версия КАК Версия
|ИЗ
| РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем
|ГДЕ
| ВерсииПодсистем.ИмяПодсистемы = &ИмяПодсистемы
|";
Запрос.УстановитьПараметр("ИмяПодсистемы", "СтандартныеПодсистемы");
Таблица = Запрос.Выполнить().Выгрузить();
Если Таблица.Количество() > 0 Тогда
ВерсияБСП = Таблица[0].Версия;
КонецЕсли;
КонецЕсли;
Возврат ВерсияБСП;
КонецФункции
Функция НомерВерсииБСПЛкс() Экспорт
ВерсияБСП = ирКэш.ВерсияБСПЛкс();
Если ЗначениеЗаполнено(ВерсияБСП) Тогда
Фрагменты = ирОбщий.ПолучитьМассивИзСтрокиСРазделителемЛкс(ВерсияБСП);
Результат = Число(Фрагменты[0]) * 100 + Число(Фрагменты[1]);
Иначе
Результат = 0;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЭталонныйНаборЗаписейЛкс(Знач ПолноеИмяТаблицыБД) Экспорт
#Если Сервер И Не Клиент Тогда
ОбъектыНаСервере = Ложь;
#Иначе
ОбъектыНаСервере = "Обязательно";
#КонецЕсли
НаборЗаписей = ирОбщий.СоздатьНаборЗаписейПоИмениТаблицыБДЛкс(ПолноеИмяТаблицыБД, ОбъектыНаСервере).Методы;
Возврат НаборЗаписей;
КонецФункции
// Параметры:
// Локальный - Булево - При Истина будет Local, иначе - Roaming
Функция КаталогИзданияПлатформыВПрофилеЛкс(Локальный = Истина, Знач ИзданиеПлатформы = "") Экспорт
Если Не ЗначениеЗаполнено(ИзданиеПлатформы) Тогда
ИзданиеПлатформы = ирКэш.НомерИзданияПлатформыЛкс();
КонецЕсли;
ShellApplication = Новый COMobject("Shell.Application");
Если Локальный Тогда
КаталогДанныхПриложения = ShellApplication.NameSpace(28).Self.Path;
Иначе
КаталогДанныхПриложения = ShellApplication.NameSpace(26).Self.Path;
КонецЕсли;
КаталогДанныхПриложения = КаталогДанныхПриложения + "\1C";
Если ИзданиеПлатформы > "82" Тогда
Суффикс = Лев(ИзданиеПлатформы, 1);
Иначе
Суффикс = ИзданиеПлатформы;
КонецЕсли;
КаталогДанныхПриложения = КаталогДанныхПриложения + "\1Cv" + Суффикс;
ФайлПеренаправления = Новый Файл(КаталогДанныхПриложения + "\location.cfg");
Если ФайлПеренаправления.Существует() Тогда
ЧтениеТекста = Новый ЧтениеТекста;
ЧтениеТекста.Открыть(ФайлПеренаправления.ПолноеИмя);
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
НовыйКаталог = НСтр(СтрокаФайла, "location");
Если ЗначениеЗаполнено(НовыйКаталог) Тогда
КаталогДанныхПриложения = СтрЗаменить(НовыйКаталог, "/", "\");
КонецЕсли;
КонецЕсли;
Возврат КаталогДанныхПриложения;
КонецФункции
Функция ВычислительРегулярныхВыраженийЛкс() Экспорт
ВычислительРегулярныхВыражений = Новый COMОбъект("VBScript.RegExp");
Возврат ВычислительРегулярныхВыражений;
КонецФункции
Функция ПолучитьCOMОбъектWMIЛкс(Знач ИмяСервера = Неопределено, Знач ИмяСервераИсполнителя = Неопределено, Знач ТочкаПодключения = Неопределено) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("Получить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";
КонецЕсли;
Попытка
Результат = Locator.ConnectServer(ИмяСервера, ТочкаПодключения, , , );
Исключение
Результат = Неопределено;
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ТекущийПользовательОСЛкс() Экспорт
#Если ВебКлиент Тогда
ПользовательОС = "";
#Иначе
Network = Новый COMОбъект("WScript.Network");
ПользовательОС = Network.UserDomain + "\" + Network.UserName;
#КонецЕсли
Возврат ПользовательОС;
КонецФункции
Функция ПараметрыЗаписиОбъектовЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПараметрыЗаписиОбъектовЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый Структура("БезАвторегистрацииИзменений, ОбъектыНаСервере, ДополнительныеСвойства, ОтключатьКонтрольЗаписи, НеИспользоватьИмитаторыОбъектовДанных, ПривилегированныйРежим");
Результат.БезАвторегистрацииИзменений = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.БезАвторегистрацииИзменений");
Результат.ОбъектыНаСервере = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ОбъектыНаСервере");
Если Результат.ОбъектыНаСервере = Неопределено Тогда
Результат.ОбъектыНаСервере = ирОбщий.ПолучитьРежимОбъектыНаСервереПоУмолчаниюЛкс();
КонецЕсли;
Результат.НеИспользоватьИмитаторыОбъектовДанных = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.НеИспользоватьИмитаторыОбъектовДанных");
Если Результат.НеИспользоватьИмитаторыОбъектовДанных = Неопределено Тогда
Результат.НеИспользоватьИмитаторыОбъектовДанных = ирОбщий.ВосстановитьЗначениеЛкс("НеИспользоватьИмитаторыОбъектовДанных");
Если Результат.НеИспользоватьИмитаторыОбъектовДанных = Неопределено Тогда
Результат.НеИспользоватьИмитаторыОбъектовДанных = Ложь;
КонецЕсли;
КонецЕсли;
Результат.ДополнительныеСвойства = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ДополнительныеСвойства");
Если Результат.ДополнительныеСвойства = Неопределено Тогда
Результат.ДополнительныеСвойства = Новый ТаблицаЗначений;
КонецЕсли;
Результат.ОтключатьКонтрольЗаписи = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ОтключатьКонтрольЗаписи");
Если Результат.ОтключатьКонтрольЗаписи = Неопределено Тогда
Результат.ОтключатьКонтрольЗаписи = Ложь;
КонецЕсли;
Результат.ПривилегированныйРежим = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ПривилегированныйРежим");
Если Результат.ПривилегированныйРежим = Неопределено Тогда
Результат.ПривилегированныйРежим = Ложь;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПервыйПроизводныйТипРегистраЛкс(Знач Подтип) Экспорт
ТипОбразец = Неопределено;
КоллекцииМетаданных = Новый Массив;
КоллекцииМетаданных.Добавить(Метаданные.РегистрыСведений);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыНакопления);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыБухгалтерии);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыРасчета);
КоллекцииМетаданных.Добавить(Метаданные.Последовательности);
Для Каждого КоллекцияМетаданных Из КоллекцииМетаданных Цикл
Для Каждого МетаРегистр Из КоллекцияМетаданных Цикл
ИмяТипа = СтрЗаменить(МетаРегистр.ПолноеИмя(), ".", Подтип + ".");
Попытка
ТипОбразец = Тип(ИмяТипа);
Исключение
Продолжить;
КонецПопытки;
Прервать;
КонецЦикла;
Если ТипОбразец <> Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ТипОбразец;
КонецФункции // ЛиМенеджерЗаписиРегистраЛкс()
Функция КлючБазыВСпискеПользователяИзКоманднойСтрокиЛкс() Экспорт
Если ирОбщий.ЛиИдентификацияБазыВСпискеПоНаименованиюЛкс() Тогда
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ИдентификаторПроцессаОС = мПлатформа.ПолучитьИдентификаторПроцессаОС();
ТекущийПроцесс = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process.Handle='" + XMLСтрока(ИдентификаторПроцессаОС) + "'");
КоманднаяСтрокаПроцесса = ТекущийПроцесс.CommandLine;
ВычислительРегулярныхВыражений = Новый COMОбъект("VBScript.RegExp");
ВычислительРегулярныхВыражений.IgnoreCase = Истина;
ВычислительРегулярныхВыражений.Global = Истина;
ВычислительРегулярныхВыражений.Pattern = "(?:/IBName\s*((((.)+?))|""((.|"""")+)""))\s*( /|$)";
Вхождения = ВычислительРегулярныхВыражений.Execute(КоманднаяСтрокаПроцесса);
Если Вхождения.Count > 0 Тогда
Результат = Вхождения.Item(0).SubMatches(0);
Если Лев(Результат, 1) = """" Тогда
Результат = Вычислить(Результат);
КонецЕсли;
КонецЕсли;
Иначе
Результат = СтрокаСоединенияИнформационнойБазы();
КонецЕсли;
Возврат Результат;
КонецФункции
Функция НастройкиБазыНаКлиентеЛкс() Экспорт
ТаблицаБазКлиента = ирОбщий.ПолучитьСписокБазПользователяОСЛкс();
#Если Сервер И Не Сервер Тогда
ТаблицаБазКлиента = Обработки.ирПлатформа.Создать().СписокБазПользователя;
#КонецЕсли
КлючомЯвляетсяСтрокаСоединения = Ложь;
КлючБазыВСпискеПользователя = ирОбщий.КлючБазыВСпискеПользователяЛкс(КлючомЯвляетсяСтрокаСоединения);
Если КлючомЯвляетсяСтрокаСоединения Тогда
ИмяКлюча = "НСтрокаСоединения";
Иначе
ИмяКлюча = "КлючСтроки";
КонецЕсли;
СтрокаТекущейБазы = ТаблицаБазКлиента.Найти(НРег(КлючБазыВСпискеПользователя), ИмяКлюча);
Возврат СтрокаТекущейБазы;
КонецФункции
#КонецЕсли
Функция Это64битныйПроцессЛкс() Экспорт
СисИнфо = Новый СистемнаяИнформация;
Результат = СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64;
Возврат Результат;
КонецФункции
Функция ИмяКолонкиНомерСтрокиЛкс() Экспорт
ИмяКолонкиНомерСтроки = "НомерСтроки8793";
Возврат ИмяКолонкиНомерСтроки;
КонецФункции // ТабличноеПолеСВложеннымиКоллекциямиПриВыводеСтроки()
Функция ЭтоФайловаяБазаЛкс() Экспорт
ФайловыйКаталог = НСтр(СтрокаСоединенияИнформационнойБазы(), "File");
ЭтоФайловаяБаза = Не ПустаяСтрока(ФайловыйКаталог);
Возврат ЭтоФайловаяБаза;
КонецФункции // ЭтоФайловаяБазаИис()
Функция СтрокаСоединенияСервераЛкс() Экспорт
Результат = ирСервер.СтрокаСоединенияСервераЛкс();
Возврат Результат;
КонецФункции
Функция АдресСайтаЛкс() Экспорт
Возврат "devtool1c.ucoz.ru";
КонецФункции
Функция КартинкаПоИмениЛкс(Имя) Экспорт
#Если Сервер И Не Сервер Тогда
ирПортативный = Обработки.ирПортативный.Создать();
#КонецЕсли
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КартинкаПоИмениЛкс");
КлючНаборПараметров = "" + Имя;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Попытка
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
Результат = ирПортативный.КартинкаПоИмениЛкс(Имя);
Иначе
Результат = БиблиотекаКартинок[Имя];
КонецЕсли;
Исключение
ОписаниеОшибки = ОписаниеОшибки(); // Для отладки
Результат = Новый Картинка;
КонецПопытки;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции