RDT1C/CommonModules/ирКэш/Ext/Module.bsl
Администратор a3ce1ca522 .
2021-05-11 01:02:06 +03:00

1939 lines
128 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
ирПлатформа = ирОбщий.СоздатьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирПлатформа");
#Если Сервер И Не Сервер Тогда
ирПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
КонецЕсли;
Возврат ирПлатформа;
КонецФункции
Функция ИмяПродукта() Экспорт
Возврат "ИнструментыРазработчикаTormozit";
КонецФункции
Функция КомпоновщикТаблицыМетаданныхЛкс(Знач ПолноеИмяМД, ВызыватьИсключениеПриОтсутствииПрав = Истина, ИндексПараметраПериодичность = Неопределено,
ВыражениеПараметраПериодичность = "", ИменаВместоПредставлений = Ложь) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КомпоновщикТаблицыМетаданныхЛкс");
КлючНаборПараметров = "" + ПолноеИмяМД + ";" + ВызыватьИсключениеПриОтсутствииПрав + ";" + ИндексПараметраПериодичность + ";" + ВыражениеПараметраПериодичность
+ ";" + ИменаВместоПредставлений;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
КомпоновщикНастроек = ирОбщий.КомпоновщикТаблицыМетаданныхЛкс(ПолноеИмяМД, ВызыватьИсключениеПриОтсутствииПрав, ИндексПараметраПериодичность, ВыражениеПараметраПериодичность, ИменаВместоПредставлений);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = КомпоновщикНастроек;
КонецЕсли;
Возврат КомпоновщикНастроек;
КонецФункции
Функция ПоляТаблицыБДЛкс(ПолноеИмяТаблицыБД, _ВызыватьИсключениеПриОтсутствииПрав = Истина, ИндексПараметраПериодичность = Неопределено, ВыражениеПараметраПериодичность = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПоляТаблицыБДЛкс");
КлючНаборПараметров = "" + ПолноеИмяТаблицыБД + ";" + _ВызыватьИсключениеПриОтсутствииПрав + ";" + ИндексПараметраПериодичность + ";" + ВыражениеПараметраПериодичность;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = ирОбщий.ПоляТаблицыБДЛкс(ПолноеИмяТаблицыБД, _ВызыватьИсключениеПриОтсутствииПрав, ИндексПараметраПериодичность, ВыражениеПараметраПериодичность);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ИндивидуальныеТаблицыКонстантДоступныЛкс() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Результат = ирКэш.НомерРежимаСовместимостиЛкс() >= 802016; // Здесь точно минимальная версия уже. Не трогать!
Возврат Результат;
КонецФункции
Функция ПараметрыСеансаЛкс() Экспорт
Результат = Новый Структура("ПереданныйКэш");
Возврат Результат;
КонецФункции
Функция ТаблицаВсехТаблицБДЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ТаблицаВсехТаблицБДЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
ПереданныйКэш = ирКэш.ПараметрыСеансаЛкс().ПереданныйКэш;
Если ЗначениеЗаполнено(ПереданныйКэш) Тогда
ПереданныйКэш = ПолучитьИзВременногоХранилища(ПереданныйКэш);
ТаблицаВсехТаблицБД = ПереданныйКэш.ТаблицаВсехТаблицБД;
КонецЕсли;
СостояниеРасчета = ирКэш.СостояниеПодготовкиТаблицыВсехТаблицБДЛкс();
Если СостояниеРасчета <> Неопределено Тогда
ФоновоеЗадание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(СостояниеРасчета.ИдентификаторЗадания);
КонецЕсли;
Если ФоновоеЗадание <> Неопределено Тогда
Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Активно Тогда
ирОбщий.ОжидатьЗавершенияФоновойОперацииЛкс(ФоновоеЗадание);
КонецЕсли;
Если ФоновоеЗадание.Состояние = СостояниеФоновогоЗадания.Завершено Тогда
ТаблицаВсехТаблицБД = ирОбщий.ПрочитатьРезультатФоновогоЗаданияЛкс(СостояниеРасчета.АдресРезультата, СостояниеРасчета.ФормаРезультата);
Если ТаблицаВсехТаблицБД = Null Тогда
ТаблицаВсехТаблицБД = Неопределено;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ТаблицаВсехТаблицБД = Неопределено Тогда
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ТаблицаВсехТаблицБД = Неопределено;
// Этот способ оказался в большинстве случаев медленнее чем вычислять таблицу каждый раз
//Если мПлатформа.ИДВерсииПлатформы > "82" Тогда
// #Если Клиент Тогда
// ирОбщий.СостояниеЛкс("Получение структуры хранения БД...");
// #КонецЕсли
// СтруктураХраненияБД = ПолучитьСтруктуруХраненияБазыДанных(, Ложь);
// #Если Клиент Тогда
// ирОбщий.СостояниеЛкс("");
// #КонецЕсли
// ХМЛСтруктурыХранения = ЗначениеВСтрокуВнутр(СтруктураХраненияБД);
// Хеширование = Вычислить("Новый ХешированиеДанных(ХешФункция.MD5)");
// Хеширование.Добавить(ХМЛСтруктурыХранения);
// ХешСтруктурыХранения = Хеширование.ХешСумма;
// ФайлКэша = Новый Файл(мПлатформа.КаталогФайловогоКэша + "\irAllDBTables.tbl");
// Если ФайлКэша.Существует() Тогда
// КешТаблиц = ЗначениеИзФайла(ФайлКэша.ПолноеИмя);
// Если КешТаблиц.ХешСтруктурыХранения = ХешСтруктурыХранения Тогда
// ТаблицаВсехТаблицБД = КешТаблиц.ТаблицаВсехТаблицБД;
// КонецЕсли;
// КонецЕсли;
//КонецЕсли;
Если ТаблицаВсехТаблицБД = Неопределено Тогда
ТаблицаВсехТаблицБД = ирОбщий.СоздатьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирКлсПолеТекстаПрограммы");
#Если Сервер И Не Сервер Тогда
ТаблицаВсехТаблицБД = Обработки.ирКлсПолеТекстаПрограммы.Создать();
#КонецЕсли
ТаблицаВсехТаблицБД = ТаблицаВсехТаблицБД.ДоступныеТаблицы.ВыгрузитьКолонки();
ТаблицаВсехТаблицБД.Колонки.Удалить("ПородившийЗапрос"); // Для экономии памяти
ТаблицаВсехТаблицБД.Колонки.Добавить("ТипСсылки");
//ТаблицаВсехТаблицБД.Колонки.Добавить("СтруктураКлюча");
КоллекцияКорневыхТипов = Новый Массив;
СтрокиМетаОбъектов = мПлатформа.ТаблицаТиповМетаОбъектов.НайтиСтроки(Новый Структура("Категория", 0));
Для Каждого СтрокаТаблицыМетаОбъектов Из СтрокиМетаОбъектов Цикл
Единственное = СтрокаТаблицыМетаОбъектов.Единственное;
Если Ложь
Или Единственное = "Константа"
Или Единственное = "КритерийОтбора"
Или Единственное = "ЖурналДокументов"
Или ирОбщий.ЛиКорневойТипПеречисленияЛкс(Единственное)
Или ирОбщий.ЛиКорневойТипСсылочногоОбъектаБДЛкс(Единственное)
Или ирОбщий.ЛиКорневойТипРегистраБДЛкс(Единственное)
Или ирОбщий.ЛиКорневойТипПоследовательностиЛкс(Единственное)
Тогда
КоллекцияКорневыхТипов.Добавить(Единственное);
КонецЕсли;
КонецЦикла;
Если ирКэш.ДоступныВнешниеИсточникДанныхЛкс() Тогда
Для Каждого МетаВнешнийИсточникДанных Из Метаданные.ВнешниеИсточникиДанных Цикл
КоллекцияКорневыхТипов.Добавить(МетаВнешнийИсточникДанных.ПолноеИмя());
КонецЦикла;
КонецЕсли;
Если Метаданные.Константы.Количество() > 0 Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ирОбщий.ПеревестиСтроку("Константы"),, "Константы");
КонецЕсли;
мСтрокаТипаВнешнегоИсточникаДанных = мПлатформа.ПолучитьСтрокуТипаМетаОбъектов("ВнешнийИсточникДанных", , 0);
ИмяДвиженияССубконто = ирОбщий.ПеревестиСтроку("ДвиженияССубконто");
ИмяГраницы = ирОбщий.ПеревестиСтроку("Границы");
ИмяЗадачиПоИсполнителю = ирОбщий.ПеревестиСтроку("ЗадачиПоИсполнителю");
ИмяКонстанта = ирОбщий.ПеревестиСтроку("Константа");
ИмяОбороты = ирОбщий.ПеревестиСтроку("Обороты");
ИмяОборотыДтКт = ирОбщий.ПеревестиСтроку("ОборотыДтКт");
ИмяОстатки = ирОбщий.ПеревестиСтроку("Остатки");
ИмяОстаткиИОбороты = ирОбщий.ПеревестиСтроку("ОстаткиИОбороты");
ИмяСрезПервых = ирОбщий.ПеревестиСтроку("СрезПервых");
ИмяСрезПоследних = ирОбщий.ПеревестиСтроку("СрезПоследних");
ИмяСубконто = ирОбщий.ПеревестиСтроку("Субконто");
ИмяТабличнаяЧасть = ирОбщий.ПеревестиСтроку("ТабличнаяЧасть");
ИмяТочки = ирОбщий.ПеревестиСтроку("Точки");
ИндикаторТипов = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияКорневыхТипов.Количество(), "Анализ структуры БД");
Для Каждого КорневойТип Из КоллекцияКорневыхТипов Цикл
ирОбщий.ОбработатьИндикаторЛкс(ИндикаторТипов);
СтрокаКорневогоТипа = мПлатформа.ПолучитьСтрокуТипаМетаОбъектов(КорневойТип);
Если СтрокаКорневогоТипа = Неопределено Тогда
СтрокаКорневогоТипа = мСтрокаТипаВнешнегоИсточникаДанных;
МножественноеКорневогоТипа = СтрокаКорневогоТипа.Множественное;
ОбъектМДКорневогоТипа = ирКэш.ОбъектМДПоПолномуИмениЛкс(КорневойТип);
КоллекцияМетаданных = ОбъектМДКорневогоТипа.Таблицы;
ПредставлениеКатегории = ОбъектМДКорневогоТипа.Представление();
СхемаТаблиц = ОбъектМДКорневогоТипа.Имя;
КорневойТип = "Внешняя";
Иначе
МножественноеКорневогоТипа = СтрокаКорневогоТипа.Множественное;
ПредставлениеКатегории = ирОбщий.ПредставлениеИзИдентификатораЛкс(МножественноеКорневогоТипа);
СхемаТаблиц = "";
Если КорневойТип = "Перерасчет" Тогда
КоллекцияМетаданных = Новый Массив;
Для Каждого МетаРегистрРасчета Из Метаданные.РегистрыРасчета Цикл
Для Каждого Перерасчет Из МетаРегистрРасчета.Перерасчеты Цикл
КоллекцияМетаданных.Добавить(Перерасчет);
КонецЦикла;
КонецЦикла;
Иначе
КоллекцияМетаданных = Метаданные[МножественноеКорневогоТипа];
КонецЕсли;
КонецЕсли;
Если КоллекцияМетаданных.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
ЛиКорневойТипСсылки = ирОбщий.ЛиКорневойТипСсылкиЛкс(КорневойТип);
ЛиКорневойТипСсылочногоОбъекта = ирОбщий.ЛиКорневойТипСсылочногоОбъектаБДЛкс(КорневойТип);
//ПредставлениеТипаТаблицы = ирОбщий.ПредставлениеИзИдентификатораЛкс(МножественноеКорневогоТипа);
ИндикаторТипа = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияМетаданных.Количество(), "Анализ " + КорневойТип);
Для Каждого МетаИсточник Из КоллекцияМетаданных Цикл
ирОбщий.ОбработатьИндикаторЛкс(ИндикаторТипа);
ПолноеИмяМД = МетаИсточник.ПолноеИмя();
ТипТаблицы = КорневойТип;
Если ТипТаблицы = "КритерийОтбора" Тогда
ТипТаблицы = "ВиртуальнаяТаблица";
КонецЕсли;
Если Ложь
Или КорневойТип <> "Константа"
Или ирКэш.ИндивидуальныеТаблицыКонстантДоступныЛкс()
Тогда
СтрокаОсновнойТаблицы = ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ирКэш.ИмяТаблицыИзМетаданныхЛкс(ПолноеИмяМД,, Ложь), ПолноеИмяМД, ТипТаблицы, МетаИсточник.Имя,
МетаИсточник.Представление(), СхемаТаблиц, , МетаИсточник);
Если ЛиКорневойТипСсылки Тогда
СтрокаОсновнойТаблицы.ТипСсылки = Тип(ирОбщий.ИмяТипаИзПолногоИмениМДЛкс(ПолноеИмяМД));
КонецЕсли;
Если ЛиКорневойТипСсылочногоОбъекта Тогда
СтруктураТЧ = ирОбщий.ТабличныеЧастиОбъектаЛкс(МетаИсточник);
Для Каждого КлючИЗначение Из СтруктураТЧ Цикл
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + КлючИЗначение.Ключ, ПолноеИмяМД + "." + ИмяТабличнаяЧасть + "." + КлючИЗначение.Ключ, "ТабличнаяЧасть", ,
МетаИсточник.Представление() + "." + КлючИЗначение.Значение,,, МетаИсточник);
КонецЦикла;
Если КорневойТип = "БизнесПроцесс" Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяТочки,, "Точки", , МетаИсточник.Представление() + "." + "Точки",,, МетаИсточник);
КонецЕсли;
Если КорневойТип = "Задача" Тогда
Если МетаИсточник.Адресация <> Неопределено Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяЗадачиПоИсполнителю,, "ВиртуальнаяТаблица", ,
МетаИсточник.Представление() + "." + "Задачи по исполнителю",,, МетаИсточник, 1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если КорневойТип = "РегистрСведений" Тогда
Если МетаИсточник.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяСрезПоследних,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Срез последних",,, МетаИсточник, 1);
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяСрезПервых,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Срез первых",,, МетаИсточник, 1);
КонецЕсли;
ИначеЕсли КорневойТип = "РегистрНакопления" Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОбороты,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Обороты",,, МетаИсточник, 3);
Если МетаИсточник.ВидРегистра = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОстатки,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Остатки",,, МетаИсточник, 1);
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОстаткиИОбороты,, "ВиртуальнаяТаблица", ,
МетаИсточник.Представление() + "." + "Остатки и обороты",,, МетаИсточник, 4);
КонецЕсли;
ИначеЕсли КорневойТип = "РегистрБухгалтерии" Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяДвиженияССубконто,, "ДвиженияССубконто", ,
МетаИсточник.Представление() + "." + "Движения с субконто",,, МетаИсточник, 2);
Если МетаИсточник.ПланСчетов.МаксКоличествоСубконто > 0 Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяСубконто,, "Субконто", , МетаИсточник.Представление() + "." + "Субконто",,, МетаИсточник);
КонецЕсли;
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОбороты,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Обороты",,, МетаИсточник, 5);
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОборотыДтКт,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Обороты Дт Кт",,, МетаИсточник, 7);
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОстатки,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Остатки",,, МетаИсточник, 3);
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяОстаткиИОбороты,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Остатки и обороты",,, МетаИсточник, 6);
//ИначеЕсли КорневойТип = "РегистрРасчета" Тогда
// Для Каждого Перерасчет Из МетаИсточник.Перерасчеты Цикл
// ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ирКэш.ИмяТаблицыИзМетаданныхЛкс(Перерасчет.ПолноеИмя()), "Перерасчет", Перерасчет.Имя, Перерасчет.Представление(), , , Перерасчет);
// КонецЦикла;
ИначеЕсли КорневойТип = "Последовательность" Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ПолноеИмяМД + "." + ИмяГраницы,, "ВиртуальнаяТаблица", , МетаИсточник.Представление() + "." + "Границы",,, МетаИсточник);
КонецЕсли;
КонецЕсли;
Если ирОбщий.ЕстьТаблицаИзмененийОбъектаМетаданных(МетаИсточник) Тогда
ирОбщий.ДобавитьДоступнуюТаблицуБДЛкс(ТаблицаВсехТаблицБД, ирКэш.ИмяТаблицыИзМетаданныхЛкс(ПолноеИмяМД, Истина, Ложь), , "Изменения", МетаИсточник.Имя,
МетаИсточник.Представление() + "." + "Изменения",,, МетаИсточник);
КонецЕсли;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
ТаблицаВсехТаблицБД.Индексы.Добавить("НПолноеИмя");
ТаблицаВсехТаблицБД.Сортировать("НПолноеИмя");
//Если ФайлКэша <> Неопределено Тогда
// КешТаблиц = Новый Структура("ТаблицаВсехТаблицБД, ХешСтруктурыХранения", ТаблицаВсехТаблицБД, ХешСтруктурыХранения);
// ЗначениеВФайл(ФайлКэша.ПолноеИмя, КешТаблиц);
//КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = ТаблицаВсехТаблицБД;
КонецЕсли;
Возврат ТаблицаВсехТаблицБД;
КонецФункции
Функция ЛиЭтоРасширениеКонфигурацииЛкс() Экспорт
Расширение = ирКэш.ЭтотРасширениеКонфигурацииЛкс();
#Если Сервер И Не Сервер Тогда
Расширение = РасширенияКонфигурации.Создать();
#КонецЕсли
Результат = Истина
И Расширение <> Неопределено
И (Ложь
Или ирКэш.НомерВерсииПлатформыЛкс() < 803012
Или Расширение.Активно);
Возврат Результат;
КонецФункции
Функция ЭтотРасширениеКонфигурацииЛкс() Экспорт
Результат = ирОбщий.ЭтотРасширениеКонфигурацииЛкс();
Возврат Результат;
КонецФункции
Функция СтруктураХраненияБДЛкс(ЛиИменаБД = Ложь, ВычислитьИменаИндексов = Истина, АдресЧужойСхемыБД = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("СтруктураХраненияБДЛкс");
КлючНаборПараметров = "" + ЛиИменаБД + ";" + ВычислитьИменаИндексов + ";" + АдресЧужойСхемыБД;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = ирОбщий.СтруктураХраненияБДЛкс(, ЛиИменаБД, ВычислитьИменаИндексов, АдресЧужойСхемыБД);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
// Получить словарь метаданных состоящий из шаблонов имен таблиц
//
// Параметры:
// ЛиИменаБД - Булево
//
// Возвращаемое значение:
// Соответствие - словарь шаблонов имен метаданных. Ключ - наименование объекта
// метаданных, где его номер заменен на номер позиции этого
// числа в строке; Значение - количество чисел в строке
//
Функция ПолучитьСловарьШаблоновМетаданныхЛкс(ЛиИменаБД = Ложь, АдресЧужойСхемыБД = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПолучитьСловарьШаблоновМетаданныхЛкс");
КлючНаборПараметров = "" + ЛиИменаБД + ";" + АдресЧужойСхемыБД;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
СтруктураХраненияБД = ирКэш.СтруктураХраненияБДЛкс(ЛиИменаБД, , АдресЧужойСхемыБД);
Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("РегулярныйШаблон");
Результат.Колонки.Добавить("ПозиционныйШаблон");
Результат.Колонки.Добавить("КоличествоПараметров");
КоличествоСимволов = 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. Пробуйте под пользователем без пароля https://www.hostedredmine.com/issues/917837.
|Для диагностики используйте инструмент ""Управление COM классами 1С""", СтатусСообщения.Внимание);
Форма = ирОбщий.ПолучитьФормуЛкс("Обработка.ирУправлениеCOMКлассами1С.Форма");
Форма.ПараметрТипКласса = "CApplication";
Форма.Открыть();
Возврат Неопределено;
КонецПопытки;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = СвязанныйСеансТонкогоКлиента;
КонецЕсли;
Возврат СвязанныйСеансТонкогоКлиента;
КонецФункции
Функция ОбъектыМетаданныхСРегистрациейИзменений() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ОбъектыМетаданныхСРегистрациейИзменений");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый Соответствие;
Для Каждого МетаПланОбмена Из Метаданные.ПланыОбмена Цикл
Для Каждого ЭлементСостава Из МетаПланОбмена.Состав Цикл
Если ЭлементСостава.Метаданные = Неопределено Тогда
// Битая ссылка
Продолжить;
КонецЕсли;
Результат[ЭлементСостава.Метаданные.ПолноеИмя()] = 1;
КонецЦикла;
КонецЦикла;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ВКОбщаяЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ВКОбщаяЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
ВК = ирОбщий.НоваяВКОбщаяЛкс();
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = ВК;
КонецЕсли;
Возврат ВК;
КонецФункции
Функция ВКПерехватКлавиатурыЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ВКПерехватКлавиатурыЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
ВК = ирОбщий.НоваяВКПерехватКлавиатурыЛкс();
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = ВК;
КонецЕсли;
Возврат ВК;
КонецФункции
Функция КорневыеТипыСсылочныеЛкс() Экспорт
Результат = Новый Массив;
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
СтрокиМетаОбъектов = мПлатформа.ТаблицаТиповМетаОбъектов.НайтиСтроки(Новый Структура("Категория", 0));
Для Каждого СтрокаТаблицыМетаОбъектов Из СтрокиМетаОбъектов Цикл
Единственное = СтрокаТаблицыМетаОбъектов.Единственное;
Если ирОбщий.ЛиКорневойТипСсылочногоОбъектаБДЛкс(Единственное) Тогда
Результат.Добавить(СтрокаТаблицыМетаОбъектов);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ЭтоФоновоеЗаданиеЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
Возврат Ложь;
КонецЕсли;
ТекущийСеанс = ирКэш.ТекущийСеансЛкс();
Если ТекущийСеанс = Неопределено Тогда
Результат = Ложь;
Иначе
Результат = ирОбщий.СтрокиРавныЛкс(ТекущийСеанс.ИмяПриложения, "BackgroundJob");
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ТекущийСеансЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ТекущийСеансЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Если ирКэш.НомерРежимаСовместимостиЛкс() >= 803007 Тогда
Результат = Вычислить("ПолучитьТекущийСеансИнформационнойБазы()");
Иначе
Результат = ирПривилегированный.ТекущийСеансЛкс();
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
// 8.3.8+
Функция ДоступныТаблицыМенеджераВременныхТаблицЛкс() Экспорт
Менеджер = Новый МенеджерВременныхТаблиц;
Попытка
Результат = Менеджер.Таблицы;
Исключение
Результат = Неопределено;
КонецПопытки;
Возврат Результат <> Неопределено;
КонецФункции
// 8.3.9+
Функция ДоступнаЗащитаОтОпасныхДействийЛкс() Экспорт
ЗащитаОтОпасныхДействийЛ = Неопределено;
Попытка
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
ЗащитаОтОпасныхДействийЛ = ТекущийПользователь.ЗащитаОтОпасныхДействий;
Исключение
КонецПопытки;
Возврат ЗащитаОтОпасныхДействийЛ <> Неопределено;
КонецФункции
// 8.3.18+
Функция ДоступноВосстановлениеПароляПользователямЛкс() Экспорт
Результат = Неопределено;
Попытка
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Результат = ТекущийПользователь.ЗапрещеноВосстанавливатьПароль;
Исключение
КонецПопытки;
Возврат Результат <> Неопределено;
КонецФункции
// 8.2.14+
Функция ДоступныВнешниеИсточникДанныхЛкс() Экспорт
Результат = ирКэш.НомерВерсииПлатформыЛкс() >= 802014;
Возврат Результат;
КонецФункции
// 8.2.14+
Функция ДоступныОбщиеРеквизитыЛкс() Экспорт
Результат = ирКэш.НомерВерсииПлатформыЛкс() >= 802014;
Возврат Результат;
КонецФункции
Функция НомерРежимаСовместимостиЛкс() Экспорт
ТекущийРежимСовместимости = Метаданные.РежимСовместимости;
Если ТекущийРежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
СисИнфо = Новый СистемнаяИнформация;
Фрагменты = ирОбщий.СтрРазделитьЛкс(СисИнфо.ВерсияПриложения,,, Ложь); // Защита от рекурсии!
Иначе
// Пример значения СтрокаВерсии = Версия8_3_1
ТекущийРежимСовместимости = СтрЗаменить(ТекущийРежимСовместимости, "Версия", "");
ТекущийРежимСовместимости = СтрЗаменить(ТекущийРежимСовместимости, "Version", ""); // Вариант встроенного языка Английский
Фрагменты = ирОбщий.СтрРазделитьЛкс(ТекущийРежимСовместимости, "_",, Ложь); // Защита от рекурсии!
КонецЕсли;
Результат = Число(Фрагменты[0]) * 100 * 1000 + Число(Фрагменты[1]) * 1000;
Если Фрагменты.Количество() > 2 Тогда
Результат = Результат + Число(Фрагменты[2]);
КонецЕсли;
Возврат Результат;
КонецФункции
// Например 8.2, 8.3
Функция НомерИзданияПлатформыЛкс() Экспорт
СисИнфо = Новый СистемнаяИнформация;
Фрагменты = ирОбщий.СтрРазделитьЛкс(СисИнфо.ВерсияПриложения);
Результат = Фрагменты[0] + Фрагменты[1];
Возврат Результат;
КонецФункции
Функция НомерВерсииПлатформыЛкс(ВключаяНомерСборки = Ложь) Экспорт
СисИнфо = Новый СистемнаяИнформация;
СтрокаВерсии = СисИнфо.ВерсияПриложения;
Результат = ирОбщий.НомерВерсииПлатформыЛкс(СтрокаВерсии, ВключаяНомерСборки);
Возврат Результат;
КонецФункции
Функция НомерВерсииPowerShellЛкс() Экспорт
ТекстСкрипта = Новый ТекстовыйДокумент;
ТекстСкрипта.УстановитьТекст("$PSVersionTable.PSVersion.major");
ФайлСкрипта = Новый Файл(ПолучитьИмяВременногоФайла("ps1"));
ТекстСкрипта.Записать(ФайлСкрипта.ПолноеИмя);
СтрокаЗапуска = ирОбщий.КомандаСистемыЗапускаСкриптаPowerShellЛкс(ФайлСкрипта.Имя);
РезультатКоманды = ирОбщий.ВыполнитьКомандуОСЛкс(СтрокаЗапуска);
Результат = Число(РезультатКоманды);
Возврат Результат;
КонецФункции
Функция ВерсияБСПЛкс() Экспорт
УстановитьПривилегированныйРежим(Истина);
Если Истина
И Метаданные.РегистрыСведений.Найти("ВерсииПодсистем") <> Неопределено
И ПравоДоступа("Чтение", Метаданные.РегистрыСведений.ВерсииПодсистем)
Тогда
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| ВерсииПодсистем.Версия КАК Версия
|ИЗ
| РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем
|ГДЕ
| ВерсииПодсистем.ИмяПодсистемы = &ИмяПодсистемы
|";
Запрос.УстановитьПараметр("ИмяПодсистемы", "СтандартныеПодсистемы");
Таблица = Запрос.Выполнить().Выгрузить();
Если Таблица.Количество() > 0 Тогда
ВерсияБСП = Таблица[0].Версия;
КонецЕсли;
КонецЕсли;
Возврат ВерсияБСП;
КонецФункции
Функция НомерВерсииБСПЛкс() Экспорт
ВерсияБСП = ирКэш.ВерсияБСПЛкс();
Если ЗначениеЗаполнено(ВерсияБСП) Тогда
Фрагменты = ирОбщий.СтрРазделитьЛкс(ВерсияБСП);
Результат = Число(Фрагменты[0]) * 100 + Число(Фрагменты[1]);
Иначе
Результат = 0;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЭталонныйНаборЗаписейЛкс(Знач ПолноеИмяТаблицыБД) Экспорт
#Если Сервер И Не Клиент Тогда
ОбъектыНаСервере = Ложь;
#Иначе
ОбъектыНаСервере = "Обязательно";
#КонецЕсли
НаборЗаписей = ирОбщий.СоздатьНаборЗаписейПоИмениТаблицыБДЛкс(ПолноеИмяТаблицыБД, ОбъектыНаСервере).Методы;
Возврат НаборЗаписей;
КонецФункции
// Параметры:
// Локальный - Булево - При Истина будет Local, иначе - Roaming
Функция КаталогИзданияПлатформыВПрофилеЛкс(Локальный = Истина, Знач ИзданиеПлатформы = "") Экспорт
КаталогДанныхПриложения = КаталогПлатформыВПрофилеЛкс(Локальный);
Если Не ЗначениеЗаполнено(ИзданиеПлатформы) Тогда
ИзданиеПлатформы = ирКэш.НомерИзданияПлатформыЛкс();
КонецЕсли;
Если ИзданиеПлатформы > "82" Тогда
Суффикс = Лев(ИзданиеПлатформы, 1);
Иначе
Суффикс = ИзданиеПлатформы;
КонецЕсли;
Разделитель = ирОбщий.РазделительФайловойСистемыЛкс();
КаталогДанныхПриложения = КаталогДанныхПриложения + Разделитель + "1cv" + Суффикс;
ФайлПеренаправления = Новый Файл(КаталогДанныхПриложения + Разделитель + "location.cfg");
Если ФайлПеренаправления.Существует() Тогда
ЧтениеТекста = Новый ЧтениеТекста;
ЧтениеТекста.Открыть(ФайлПеренаправления.ПолноеИмя);
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
НовыйКаталог = НСтр(СтрокаФайла, "location");
Если ЗначениеЗаполнено(НовыйКаталог) Тогда
Если Разделитель = "\" Тогда
КаталогДанныхПриложения = СтрЗаменить(НовыйКаталог, "/", Разделитель);
Иначе
КаталогДанныхПриложения = СтрЗаменить(НовыйКаталог, "\", Разделитель);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат КаталогДанныхПриложения;
КонецФункции
Функция КаталогПлатформыВПрофилеЛкс(Знач Локальный = Ложь) Экспорт
Если Не ирКэш.ЛиПлатформаWindowsЛкс() Тогда
//КаталогДанныхПриложения = "~/.1cv8"; // Похоже так можно только в bash. Ошибка доступа к файлу '~'. 13(0x0000000D): Permission denied
#Если Клиент Тогда
КаталогДанныхПриложения = "/home/" + ирКэш.ТекущийПользовательОСЛкс(Ложь) + "/.1cv8";
#Иначе
КаталогДанныхПриложения = КаталогВременныхФайлов();
#КонецЕсли
Иначе
ПриложениеОболочкиОС = Новый COMobject("Shell.Application");
Если Локальный Тогда
КаталогДанныхПриложения = ПриложениеОболочкиОС.NameSpace(28).Self.Path;
Иначе
КаталогДанныхПриложения = ПриложениеОболочкиОС.NameSpace(26).Self.Path;
КонецЕсли;
КонецЕсли;
КаталогДанныхПриложения = КаталогДанныхПриложения + ирОбщий.РазделительФайловойСистемыЛкс() + "1C";
Возврат КаталогДанныхПриложения;
КонецФункции
Функция ВычислительРегВыраженийЛкс() Экспорт
Результат = ирОбщий.НовыйВычислительРегВыражений();
Возврат Результат;
КонецФункции
Функция ПолучитьCOMОбъектWMIЛкс(Знач ИмяСервера = Неопределено, Знач ИмяСервераИсполнителя = Неопределено, Знач ТочкаПодключения = Неопределено) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПолучитьCOMОбъектWMIЛкс");
КлючНаборПараметров = "" + ИмяСервера + ";" + ИмяСервераИсполнителя + ";" + ТочкаПодключения;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Если Не ирОбщий.ЭтоИмяЛокальногоКомпьютераЛкс(ИмяСервера) Тогда
// Обходим проблему с большим таймаутом метода WbemScripting.SWbemLocator.ConnectServer http://www.forum.mista.ru/topic.php?id=752526
// https://www.hostedredmine.com/issues/907854
ДопустимоеОжиданиеОтвета = 1;
ИмяФайлаРезультата = ирОбщий.ВыполнитьКомандуОСЛкс("rpcping -s " + ИмяСервера, Ложь);
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстРезультата = "";
НачальнаяДата = ТекущаяДата();
Пока Истина Цикл
Попытка
ТекстовыйДокумент.Прочитать(ИмяФайлаРезультата);
ТекстРезультата = ТекстовыйДокумент.ПолучитьТекст();
УдалитьФайлы(ИмяФайлаРезультата);
Исключение
// Файл недоступен, значит процесс все еще запускается
КонецПопытки;
Если Ложь
Или ИмяФайлаРезультата = Неопределено
Или ТекущаяДата() - НачальнаяДата >= ДопустимоеОжиданиеОтвета
Или Найти(ТекстРезультата, "0x000006BA") > 0
Тогда
ирОбщий.СообщитьЛкс("The RPC server """ + ИмяСервера + """ is unavailable", СтатусСообщения.Внимание);
Возврат Неопределено;
КонецЕсли;
Если ЗначениеЗаполнено(ТекстРезультата) Тогда
Прервать;
КонецЕсли;
ирОбщий.ПаузаЛкс(1);
КонецЦикла;
КонецЕсли;
//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(ИмяСервера, ТочкаПодключения, , , );
Исключение
Результат = Неопределено;
ирОбщий.СообщитьЛкс(ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ТекущийПользовательОСЛкс(СИменемДомена = Истина) Экспорт
#Если ВебКлиент Тогда
ПользовательОС = "";
#Иначе
Если Не ирКэш.ЛиПлатформаWindowsЛкс() Тогда
// https://wiki.merionet.ru/servernye-resheniya/43/peremennye-okruzheniya-v-linux-kak-posmotret-ustanovit-i-sbrosit/
ПеременныеОкружения = ирОбщий.ВыполнитьКомандуОСЛкс("env");
ПользовательОС = ирОбщий.СтрокаМеждуМаркерамиЛкс(ПеременныеОкружения, "USER=", Символы.ПС, Ложь);
Если Не ЗначениеЗаполнено(ПользовательОС) Тогда
ПользовательОС = ирОбщий.ПоследнийФрагментЛкс(ирОбщий.СтрокаМеждуМаркерамиЛкс(ПеременныеОкружения, "HOME=", Символы.ПС, Ложь), "/");
КонецЕсли;
// Переделать на ирОбщий.ВыполнитьКомандуОСЛкс("whoami")
Иначе
Network = Новый COMОбъект("WScript.Network");
ПользовательОС = Network.UserName;
Если СИменемДомена Тогда
ПользовательОС = Network.UserDomain + "\" + ПользовательОС;
КонецЕсли;
КонецЕсли;
#КонецЕсли
Возврат ПользовательОС;
КонецФункции
Функция ПеременныеОкруженияПроцессаЛкс() Экспорт
// https://ab57.ru/cmdlist/set.html
Shell = Новый COMОбъект("WScript.Shell");
ПеременныеОкружения = Shell.Environment("PROCESS");
Возврат ПеременныеОкружения;
КонецФункции
Функция ПараметрыЗаписиОбъектовЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПараметрыЗаписиОбъектовЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый Структура("БезАвторегистрацииИзменений, ОбъектыНаСервере, ДополнительныеСвойства, ОтключатьКонтрольЗаписи, НеИспользоватьИмитаторыОбъектовДанных, ПривилегированныйРежим, ОтключатьЗаписьВерсии");
Результат.БезАвторегистрацииИзменений = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.БезАвторегистрацииИзменений");
Результат.ОбъектыНаСервере = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ОбъектыНаСервере");
Если Результат.ОбъектыНаСервере = Неопределено Тогда
Результат.ОбъектыНаСервере = ирОбщий.ПолучитьРежимОбъектыНаСервереПоУмолчаниюЛкс();
КонецЕсли;
Результат.НеИспользоватьИмитаторыОбъектовДанных = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.НеИспользоватьИмитаторыОбъектовДанных");
Если Результат.НеИспользоватьИмитаторыОбъектовДанных = Неопределено Тогда
Результат.НеИспользоватьИмитаторыОбъектовДанных = ирОбщий.ВосстановитьЗначениеЛкс("НеИспользоватьИмитаторыОбъектовДанных");
Если Результат.НеИспользоватьИмитаторыОбъектовДанных = Неопределено Тогда
Результат.НеИспользоватьИмитаторыОбъектовДанных = Ложь;
КонецЕсли;
КонецЕсли;
Результат.ДополнительныеСвойства = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ДополнительныеСвойства");
Если Результат.ДополнительныеСвойства = Неопределено Тогда
Результат.ДополнительныеСвойства = Новый ТаблицаЗначений;
КонецЕсли;
Результат.ОтключатьКонтрольЗаписи = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ОтключатьКонтрольЗаписи");
Если Результат.ОтключатьКонтрольЗаписи = Неопределено Тогда
Результат.ОтключатьКонтрольЗаписи = Ложь;
КонецЕсли;
Результат.ОтключатьЗаписьВерсии = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ОтключатьЗаписьВерсии");
Если Результат.ОтключатьЗаписьВерсии = Неопределено Тогда
Результат.ОтключатьЗаписьВерсии = Ложь;
КонецЕсли;
Результат.ПривилегированныйРежим = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ПривилегированныйРежим");
Если Результат.ПривилегированныйРежим = Неопределено Тогда
Результат.ПривилегированныйРежим = Ложь;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПервыйПроизводныйТипРегистраЛкс(Знач Подтип) Экспорт
ТипОбразец = Неопределено;
КоллекцииМетаданных = Новый Массив;
КоллекцииМетаданных.Добавить(Метаданные.РегистрыСведений);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыНакопления);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыБухгалтерии);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыРасчета);
КоллекцииМетаданных.Добавить(Метаданные.Последовательности);
Для Каждого КоллекцияМетаданных Из КоллекцииМетаданных Цикл
Для Каждого МетаРегистр Из КоллекцияМетаданных Цикл
ИмяТипа = СтрЗаменить(МетаРегистр.ПолноеИмя(), ".", Подтип + ".");
Попытка
ТипОбразец = Тип(ИмяТипа);
Исключение
Продолжить;
КонецПопытки;
Прервать;
КонецЦикла;
Если ТипОбразец <> Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ТипОбразец;
КонецФункции // ЛиМенеджерЗаписиРегистраЛкс()
Функция КлючБазыВСпискеПользователяИзКоманднойСтрокиЛкс() Экспорт
Если ирОбщий.ЛиИдентификацияБазыВСпискеПоНаименованиюЛкс() Тогда
Если Не ирКэш.ЛиДоступныРегВыраженияЛкс() Тогда
Результат = Неопределено;
Иначе
КоманднаяСтрокаПроцесса = ирКэш.КоманднаяСтрокаТекущегоПроцессаОСЛкс();
ВычислительРегВыражений = ирОбщий.НовыйВычислительРегВыражений();
ВычислительРегВыражений.IgnoreCase = Истина;
ВычислительРегВыражений.Global = Истина;
ВычислительРегВыражений.Pattern = "(?:/IBName\s*(""((.|"""")+?)""|(((.)+?))))\s*( /|$)";
Вхождения = ВычислительРегВыражений.НайтиВхождения(КоманднаяСтрокаПроцесса);
Если Вхождения.Количество() > 0 Тогда
Результат = Вхождения[0].SubMatches(0);
Если Лев(Результат, 1) = """" Тогда
Результат = Вычислить(Результат);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
Результат = СтрокаСоединенияИнформационнойБазы();
КонецЕсли;
Возврат Результат;
КонецФункции
Функция НастройкиБазыНаКлиентеЛкс() Экспорт
ТаблицаБазКлиента = ирОбщий.ПолучитьСписокБазПользователяОСЛкс();
#Если Сервер И Не Сервер Тогда
ТаблицаБазКлиента = Обработки.ирПлатформа.Создать().СписокБазПользователя;
#КонецЕсли
КлючомЯвляетсяСтрокаСоединения = Ложь;
КлючБазыВСпискеПользователя = ирОбщий.КлючБазыВСпискеПользователяЛкс(КлючомЯвляетсяСтрокаСоединения);
Если КлючомЯвляетсяСтрокаСоединения Тогда
ИмяКлюча = "НСтрокаСоединения";
Иначе
ИмяКлюча = "КлючСтроки";
КонецЕсли;
СтрокаТекущейБазы = ТаблицаБазКлиента.Найти(НРег(КлючБазыВСпискеПользователя), ИмяКлюча);
Возврат СтрокаТекущейБазы;
КонецФункции
Функция АбсолютныйЦветЛкс(Знач ИсходныйЦвет) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("АбсолютныйЦветЛкс");
КлючНаборПараметров = "" + ИсходныйЦвет;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
#Если Сервер И Не Сервер Тогда
ИсходныйЦвет = Новый Цвет;
#КонецЕсли
ИсходныйЦвет = ЗначениеИзСтрокиВнутр(ИсходныйЦвет);
Если ИсходныйЦвет.Вид = ВидЦвета.Абсолютный Тогда
Возврат ИсходныйЦвет;
КонецЕсли;
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803001 Тогда
// Способ без операций вывода https://infostart.ru/public/1278131/
ФорматДок = Новый ФорматированныйДокумент;
ФорматДок.УстановитьФорматированнуюСтроку(Вычислить("Новый ФорматированнаяСтрока("" "", , ИсходныйЦвет)")); // На 8.2 нет типа ФорматированнаяСтрока
ТекстHTML = "";
ФорматДок.ПолучитьHTML(ТекстHTML, Неопределено);
ПозицияЧислаHEX = Найти(ТекстHTML, "#") + 1;
ЧислоHEX = Сред(ТекстHTML, ПозицияЧислаHEX, 6);
Результат = ирОбщий.ЧислоHEXВЦветЛкс(ЧислоHEX);
Иначе
Если ирКэш.ЭтоУчебнаяПлатформаЛкс() Тогда
Результат = ИсходныйЦвет;
Иначе
ВременныйФайл = ПолучитьИмяВременногоФайла("mxl");
ТабДок = Новый ТабличныйДокумент;
ТабДок.Область("R1C1").ЦветФона = ИсходныйЦвет;
ТабДок.Записать(ВременныйФайл, ТипФайлаТабличногоДокумента.MXL7); // В учебной версии платформы это запрещено https://www.hostedredmine.com/issues/923942
ТабДок.Прочитать(ВременныйФайл);
Результат = ТабДок.Область("R1C1").ЦветФона;
КонецЕсли;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция КартинкаИнструментаЛкс(ПолноеИмя) Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
мПлатформа.ЗаполнитьСписокИнструментов();
СтрокаИнструмента = мПлатформа.СписокИнструментов.Найти(ПолноеИмя, "ПолноеИмя");
Если СтрокаИнструмента <> Неопределено Тогда
Результат = ирКэш.КартинкаПоИмениЛкс(СтрокаИнструмента.ИмяКартинки);
Иначе
Результат = Новый Картинка;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ТипыРасширенийКонфигурацииЛкс(Знач ИмяКлассаМетаданных = Неопределено) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ТипыРасширенийКонфигурацииЛкс");
КлючНаборПараметров = "" + ИмяКлассаМетаданных;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
РасширенияКонфигурацииЛ = Вычислить("РасширенияКонфигурации");
#Если Сервер И Не Сервер Тогда
РасширенияКонфигурацииЛ = РасширенияКонфигурации;
#КонецЕсли
ВсеРасширения = РасширенияКонфигурацииЛ.Получить();
Если Ложь
Или ВсеРасширения.Количество() > 1
Или (Не ирКэш.ЛиЭтоРасширениеКонфигурацииЛкс() И ВсеРасширения.Количество() > 0)
Тогда
//// Медленный способ. Необходимость обусловлена отсутствием типов расширений конфигурации в супертипе ЛюбаяСсылка https://partners.v8.1c.ru/forum/t/1823711/m/1823711
//ТаблицаВсехТаблицБД = ирКэш.ТаблицаВсехТаблицБДЛкс();
//#Если Сервер И Не Сервер Тогда
// РасширенияКонфигурацииЛ = РасширенияКонфигурации;
// ТаблицаВсехТаблицБД = Новый ТаблицаЗначений;
//#КонецЕсли
//ВсеТипыСсылок = ТаблицаВсехТаблицБД.ВыгрузитьКолонку("ТипСсылки");
//Результат = Новый ОписаниеТипов(ВсеТипыСсылок);
Результат = Новый Массив;
ТаблицаТиповМетаОбъектов = ирКэш.ТипыМетаОбъектов(Ложь, Ложь, Ложь);
Для Каждого СтрокаМетаТипа Из ТаблицаТиповМетаОбъектов Цикл
Если Ложь
Или (Истина
И ЗначениеЗаполнено(ИмяКлассаМетаданных)
И СтрокаМетаТипа.Единственное <> ИмяКлассаМетаданных)
Или Не ирОбщий.ЛиКорневойТипСсылкиЛкс(СтрокаМетаТипа.Единственное)
Тогда
Продолжить;
КонецЕсли;
Для Каждого МетаОбъект Из Метаданные[СтрокаМетаТипа.Множественное] Цикл
Если МетаОбъект.РасширениеКонфигурации() <> Неопределено Тогда
Результат.Добавить(Тип(ирОбщий.ИмяТипаИзПолногоИмениМДЛкс(МетаОбъект)));
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция СостояниеПодготовкиТаблицыВсехТаблицБДЛкс() Экспорт
Если Ложь
#Если Не Клиент И Сервер Тогда
Или Истина
#КонецЕсли
Или ЭтоФоновоеЗаданиеЛкс()
//Или Не ирОбщий.ЛиАсинхронностьДоступнаЛкс() // Этот способ более жесткий, а в этом фоновом задании права на объекты подсистемы пока не нужны. Поэтому пока не будет его применять
//
Или ирКэш.ЛиПортативныйРежимЛкс()
Или ирКэш.ЭтоФайловаяБазаЛкс()
Тогда
Возврат Неопределено;
КонецЕсли;
// Антибаг 8.3.16- В обычном приложении в клиент-серверном режиме из временного хранилища иногда возвращается Неопределено https://partners.v8.1c.ru/forum/t/1768363/m/1768363, http://www.hostedredmine.com/issues/884756
ФормаРезультата = ирОбщий.НоваяФормаРезультатаФоновогоЗаданияЛкс();
АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, ФормаРезультата.УникальныйИдентификатор);
ПараметраЗадания = Новый Массив(1);
ПараметраЗадания[0] = АдресРезультата;
#Если Сервер И Не Сервер Тогда
ирОбщий.ТаблицаВсехТаблицБДВФонеЛкс();
#КонецЕсли
ирОбщий.ДобавитьТекущемуПользователюРолиИРЛкс();
ФоновоеЗадание = ФоновыеЗадания.Выполнить("ирОбщий.ТаблицаВсехТаблицБДВФонеЛкс", ПараметраЗадания,, "Расчет таблицы всех таблиц БД (ИР)");
Результат = Новый Структура;
Результат.Вставить("ИдентификаторЗадания", ФоновоеЗадание.УникальныйИдентификатор);
Результат.Вставить("АдресРезультата", АдресРезультата);
Результат.Вставить("ФормаРезультата", ФормаРезультата);
Возврат Результат;
КонецФункции
// Кэширование в 100 раз ускоряет повторный поиск
Функция ОбъектМДПоПолномуИмениЛкс(ПолноеИмяМД) Экспорт
Если Найти(ПолноеИмяМД, ".") = 0 Тогда
// https://www.hostedredmine.com/issues/890489
Возврат Неопределено;
КонецЕсли;
Возврат Метаданные.НайтиПоПолномуИмени(ПолноеИмяМД);
КонецФункции
Функция ИмяТаблицыИзМетаданныхЛкс(Знач ОбъектИлиИмяМД, ЛиТаблицаИзменений = Ложь, ЛиДвиженияССубконтоДляРегистраБухгалтерии = Истина, ТолькоРазрешенные = Ложь) Экспорт
//Если ТипЗнч(ОбъектИлиИмяМД) <> Тип("Строка") Тогда
// ПолноеИмя = ОбъектИлиИмяМД.ПолноеИмя();
//Иначе
ПолноеИмя = ОбъектИлиИмяМД;
//КонецЕсли;
Фрагменты = ирОбщий.СтрРазделитьЛкс(ПолноеИмя);
Если ТолькоРазрешенные Тогда
Если ТипЗнч(ОбъектИлиИмяМД) = Тип("Строка") Тогда
Если Фрагменты.Количество() > 1 Тогда
ОбъектМД = ирКэш.ОбъектМДПоПолномуИмениЛкс(Фрагменты[0] + "." + Фрагменты[1]); // очень долгая операция, поэтому лучше не устанавливать флаг ТолькоРазрешенные
Иначе
//ОбъектМД = Метаданные[Фрагменты[0]];
ОбъектМД = Неопределено;
КонецЕсли;
Иначе
ОбъектМД = ОбъектИлиИмяМД;
КонецЕсли;
Если Истина
И ОбъектМД <> Неопределено
И Не ПравоДоступа("Чтение", ОбъектМД)
Тогда
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
Если Истина
И Фрагменты[0] = ирОбщий.ПеревестиСтроку("Константа")
И Фрагменты.Количество() = 2
И Не ЛиТаблицаИзменений
Тогда
Если Не ирКэш.ИндивидуальныеТаблицыКонстантДоступныЛкс() Тогда
Фрагменты = ирОбщий.СтрРазделитьЛкс("Константы");
КонецЕсли;
КонецЕсли;
Если Фрагменты.Количество() = 4 Тогда
Если Ложь
Или ирОбщий.СтрокиРавныЛкс(Фрагменты[2], ирОбщий.ПеревестиСтроку("ТабличнаяЧасть"))
Или ирОбщий.СтрокиРавныЛкс(Фрагменты[2], ирОбщий.ПеревестиСтроку("Перерасчет"))
//Или СтрокиРавныЛкс(Фрагменты[2], "Таблица") // Неправильная строка!
Тогда
Фрагменты.Удалить(2);
КонецЕсли;
КонецЕсли;
ИмяТаблицы = ирОбщий.СтрСоединитьЛкс(Фрагменты, ".");
Если Истина
И ирОбщий.ЛиПолноеИмяРегистраБухгалтерииЛкс(ПолноеИмя)
И Не ЛиТаблицаИзменений
И ЛиДвиженияССубконтоДляРегистраБухгалтерии
Тогда
ИмяТаблицы = ИмяТаблицы + "." + ирОбщий.ПеревестиСтроку("ДвиженияССубконто");
КонецЕсли;
Если ЛиТаблицаИзменений Тогда
ИмяТаблицы = ИмяТаблицы + "." + ирОбщий.ПеревестиСтроку("Изменения");
КонецЕсли;
Возврат ИмяТаблицы;
КонецФункции
Функция ДоступныеОбщиеМодулиЛкс(Знач ЛиСерверныйКонтекст) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ДоступныеОбщиеМодулиЛкс");
КлючНаборПараметров = "" + ЛиСерверныйКонтекст;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
СхемаКоллекции = Новый Структура;
Для Каждого МетаОбщийМодуль Из Метаданные.ОбщиеМодули Цикл
Если МетаОбщийМодуль.Глобальный Тогда
Продолжить;
КонецЕсли;
ОбщийМодуль = Неопределено;
Если ЛиСерверныйКонтекст Тогда
Если Не МетаОбщийМодуль.Сервер Тогда
Продолжить;
КонецЕсли;
//ИначеЕсли ирОбщий.СтрокиРавныЛкс(МетаОбщийМодуль.Имя, Слово) Тогда
// Попытка
// ОбщийМодуль = Вычислить(МетаОбщийМодуль.Имя);
// Исключение
// КонецПопытки;
Иначе
// В больших или содержащих ошибки конфигурациях компиляция неглобальных общих модулей неудобна
//Попытка
// ОбщийМодуль = Вычислить(МетаОбщийМодуль.Имя);
//Исключение
//КонецПопытки;
//КоллекцияЗначений.Вставить(МетаОбщийМодуль.Имя, ОбщийМодуль);
//
Попытка
Выполнить("Если Ложь Тогда " + МетаОбщийМодуль.Имя + ".Й() КонецЕсли");
Исключение
Продолжить;
КонецПопытки;
КонецЕсли;
СхемаКоллекции.Вставить(МетаОбщийМодуль.Имя, МетаОбщийМодуль);
КонецЦикла;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат СхемаКоллекции;
КонецФункции
// Добавляет новую строку в таблицу корневых объектов.
//
// Параметры:
// Таблица ТаблицаЗначений;
// *Категория - Число, *0;
// Единственное Строка;
// ИндексКартинкиЕдинственное Число;
// Множественное Строка;
// ИндексКартинкиМножественное Число;
//
Процедура ДобавитьВТаблицуТиповМетаОбъектов(Таблица, Категория = 0, Единственное, ИндексКартинкиЕдинственное, Множественное, ИндексКартинкиМножественное)
НовыйКорневойОбъект = Таблица.Добавить();
НовыйКорневойОбъект.Категория = Категория;
НовыйКорневойОбъект.Единственное = Единственное;
НовыйКорневойОбъект.НЕдинственное = НРег(Единственное);
НовыйКорневойОбъект.ИндексКартинкиЕдинственное = ИндексКартинкиЕдинственное;
НовыйКорневойОбъект.Множественное = Множественное;
НовыйКорневойОбъект.НМножественное = НРег(Множественное);
НовыйКорневойОбъект.ИндексКартинкиМножественное = ИндексКартинкиМножественное;
КонецПроцедуры
// Получает таблицу единственных и множественных чисел корневых типов.
//
// Параметры:
// *ЛиВключатьНехранимые - Булево, *Истина - включать ли нехранимые корневые типы;
// *ЛиВключатьДочерние - Булево, *Истина - включать ли дочерние корневые типы;
// *ЛиВключатьВнешние - Булево, *Истина - включать ли внешние корневые типы (внешние отчеты и обработки).
//
// Возвращаемое значение:
// Массив имен хранимых типов
//
Функция ТипыМетаОбъектов(ЛиВключатьНехранимые = Истина, ЛиВключатьДочерние = Истина, ЛиВключатьВнешние = Истина) Экспорт
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Категория", Новый ОписаниеТипов("Число")); // 0 - корневой, 1 - нехранимый, 2 - дочерний, 3 - внешний
Таблица.Колонки.Добавить("Единственное");
Таблица.Колонки.Добавить("НЕдинственное");
Таблица.Колонки.Добавить("ИндексКартинкиЕдинственное");
Таблица.Колонки.Добавить("Множественное"); // Имя свойства, содержащего коллекцию этих объектов
Таблица.Колонки.Добавить("НМножественное");
Таблица.Колонки.Добавить("ИндексКартинкиМножественное");
// Корневые типы
Если ЛиВключатьНехранимые Тогда
// Главным образом эти строки нужны для связи с пиктограммами этих коллекций
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "WebСервис", , "WebСервисы", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "WSСсылка", , "WSСсылки", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ГруппаКоманд", , "ГруппыКоманд", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Интерфейс", , "Интерфейсы", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Нумератор", , "НумераторыДокументов", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Обработка", 19, "Обработки", 18);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ОбщаяКартинка", , "ОбщиеКартинки", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ОбщаяКоманда", , "ОбщиеКоманды", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ОбщаяФорма", , "ОбщиеФормы", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ОбщийМакет", , "ОбщиеМакеты", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ОбщийМодуль", , "ОбщиеМодули", );
Если ирКэш.НомерВерсииПлатформыЛкс() >= 802014 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ОбщийРеквизит", , "ОбщиеРеквизиты", );
КонецЕсли;
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803003 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ОпределяемыйТип", , "ОпределяемыеТипы", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "HTTPСервис", , "HTTPСервисы", );
КонецЕсли;
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803017 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "СервисИнтеграции", , "СервисыИнтеграции", );
КонецЕсли;
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803018 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Бот", , "Боты", );
КонецЕсли;
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Отчет", 24, "Отчеты", 23);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ПараметрСеанса", , "ПараметрыСеанса", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ПараметрФункциональныхОпций", , "ПараметрыФункциональныхОпций", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ПакетXDTO", , "ПакетыXDTO", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ПодпискаНаСобытие", , "ПодпискиНаСобытия", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Подсистема", , "Подсистемы", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "РегламентноеЗадание", , "РегламентныеЗадания", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Роль", , "Роли", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Стиль", , "Стили", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ФункциональнаяОпция", ,"ФункциональныеОпции", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ХранилищеНастроек", , "ХранилищаНастроек", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ЭлементСтиля", , "ЭлементыСтиля", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Язык", , "Языки", );
КонецЕсли;
Если ирКэш.ДоступныВнешниеИсточникДанныхЛкс() Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ВнешнийИсточникДанных", 59, "ВнешниеИсточникиДанных", 58);
КонецЕсли;
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланОбмена", 52, "ПланыОбмена", 51);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Константа", 0, "Константы", 1);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Справочник", 3, "Справочники", 2);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Последовательность", 30, "Последовательности", 29);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Документ", 13, "Документы", 12);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Перечисление", 10, "Перечисления", 9);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланВидовХарактеристик", 38, "ПланыВидовХарактеристик", 37);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланСчетов", 40, "ПланыСчетов",39 );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланВидовРасчета", 48, "ПланыВидовРасчета", 47);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрСведений", 34, "РегистрыСведений", 33);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрНакопления", 32, "РегистрыНакопления", 31);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрБухгалтерии", 42, "РегистрыБухгалтерии", 41);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрРасчета", 50, "РегистрыРасчета", 49);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "БизнесПроцесс", 44, "БизнесПроцессы", 43);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Задача", 46, "Задачи", 45);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Перерасчет", 57, "Перерасчеты", 57);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "КритерийОтбора", , "КритерииОтбора", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ЖурналДокументов", 16, "ЖурналыДокументов", 15);
// Дочерние типы
Если ЛиВключатьДочерние Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Графа", , "Графы", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ЗначениеПеречисления", , "ЗначенияПеречисления", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Измерение", , "Измерения", );
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803017 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "КаналСервисаИнтеграции", , "Каналы", );
КонецЕсли;
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Команда", , "Команды", );
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803003 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Куб", , "Кубы", );
КонецЕсли;
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Макет", , "Макеты", );
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803005 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "МетодHTTPСервиса", , "Методы", );
КонецЕсли;
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Операция", , "Операции", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Параметр", , "Параметры", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Поле", , "Поля", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ПризнакУчетаПланаСчетов", , "ПризнакиУчета", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ПризнакУчетаСубконтоПланаСчетов", , "ПризнакиУчетаСубконто", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Реквизит", , "Реквизиты", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "РеквизитАдресации", , "РеквизитыАдресации", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Ресурс", , "Ресурсы", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Таблица", , "Таблицы", );
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803003 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ТаблицаИзмерения", , "ТаблицыИзмерений", );
КонецЕсли;
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ТабличнаяЧасть", 55, "ТабличныеЧасти", 54);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Форма", , "Формы", );
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803004 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Функция", , "Функции", );
КонецЕсли;
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803005 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ШаблонURLHTTPСервиса", , "ШаблоныURL", );
КонецЕсли;
КонецЕсли;
// Внешние типы
Если ЛиВключатьВнешние Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 3, "ВнешняяОбработка", , "ВнешниеОбработки", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 3, "ВнешнийОтчет", , "ВнешниеОтчеты", );
КонецЕсли;
Таблица.Индексы.Добавить("Единственное, Категория");
Таблица.Индексы.Добавить("НЕдинственное");
Таблица.Индексы.Добавить("Множественное, Категория");
Таблица.Индексы.Добавить("НМножественное");
Возврат Таблица;
КонецФункции
Функция ФормаПустышкаЛкс() Экспорт
ирПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
ирПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Форма = ирПлатформа.ФормаПустышка;
Если Форма = Неопределено Тогда
ирПлатформа.ФормаПустышка = ирПлатформа.ПолучитьФорму("Пустышка");
Форма = ирПлатформа.ФормаПустышка;
КонецЕсли;
Возврат Форма;
КонецФункции
Функция ЗначенияДляПроверкиИзмененияЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ЗначенияДляПроверкиИзмененияЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый Структура;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ФункциональныеОпцииОбъектовМДЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ФункциональныеОпцииОбъектовМДЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("ИмяОбъектаМД");
Результат.Колонки.Добавить("ИмяОпции");
Для Каждого ФункциональнаяОпция Из Метаданные.ФункциональныеОпции Цикл
Для Каждого ЭлементСостава Из ФункциональнаяОпция.Состав Цикл
Если ЭлементСостава.Объект = Неопределено Тогда
// Битая ссылка
Продолжить;
КонецЕсли;
СтрокаТЗ = Результат.Добавить();
СтрокаТЗ.ИмяОбъектаМД = ЭлементСостава.Объект.ПолноеИмя();
СтрокаТЗ.ИмяОпции = ФункциональнаяОпция.Имя;
КонецЦикла;
КонецЦикла;
Результат.Индексы.Добавить("ИмяОбъектаМД");
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция СкриптМенеджерЛкс() Экспорт
СкриптМенеджер = Новый COMОбъект("MSScriptControl.ScriptControl");
Возврат СкриптМенеджер;
КонецФункции
Функция КоманднаяСтрокаТекущегоПроцессаОСЛкс() Экспорт
Если Не ирКэш.ЛиПлатформаWindowsЛкс() Тогда
КомандаЗапуска = Новый Массив;
КомандаЗапуска.Добавить("cat");
КомандаЗапуска.Добавить("/proc/$PPID/cmdline");
Результат = ирОбщий.ВыполнитьКомандуОСЛкс(КомандаЗапуска);
// Пример результата
// /opt/1cv8/x86_64/8.3.18.1363/rphost -range 1560:1591 -reghost ИмяХоста -regport 1541 -pid 466a359c-54bd-4d6c-9198-ea9f92a74fa2 -debug -tcp
Иначе
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ИдентификаторПроцессаОС = мПлатформа.ИдентификаторПроцессаОС();
ТекущийПроцесс = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process.Handle='" + XMLСтрока(ИдентификаторПроцессаОС) + "'");
КоманднаяСтрокаПроцесса = ТекущийПроцесс.CommandLine;
КонецЕсли;
Возврат КоманднаяСтрокаПроцесса;
КонецФункции
Функция ЭтоУчебнаяПлатформаЛкс() Экспорт
Если Не ирКэш.ЭтоФайловаяБазаЛкс() Тогда
Возврат Ложь;
КонецЕсли;
ВременныйФайл = ПолучитьИмяВременногоФайла("mxl");
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Записать(ВременныйФайл, ТипФайлаТабличногоДокумента.MXL7); // В учебной версии платформы это запрещено https://www.hostedredmine.com/issues/923942
Исключение
// Сработает при отсутствии права "Вывод" (портативный вариант) и в учебной платформе ("Ограничение используемой лицензии")
ОписаниеОшибки = ОписаниеОшибки();
Возврат Истина;
КонецПопытки;
УдалитьФайлы(ВременныйФайл);
Возврат Ложь;
КонецФункции
#Если Клиент Тогда
Функция ОткрытыеФормыЛкс() Экспорт
ирПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
ирПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Результат = ирПлатформа.ОткрытыеФормы;
Если Результат = Неопределено Тогда
Результат = Новый Массив;
ирПлатформа.ОткрытыеФормы = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПерехватКлавиатурыЛкс() Экспорт
Если Не ирКэш.ЛиПортативныйРежимЛкс() Тогда
Попытка
Результат = Вычислить("ирПерехватКлавиатуры");
Исключение
КонецПопытки;
КонецЕсли;
Если Результат = Неопределено Тогда
Результат = ирКэш.Получить().ПодключитьПерехватКлавиатуры(); // Тут будет обращение к ирОбщий
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЛиМодальностьЗапрещенаЛкс() Экспорт
Результат = Ложь;
Список = Новый СписокЗначений;
Попытка
Список.ВыбратьЭлемент();
Исключение
Результат = Истина;
КонецПопытки;
Возврат Результат;
КонецФункции
// Кэшируем форму, т.к. иначе при повторных вызовах в одном потоке кода каждый раз будет возвращаться новый экземпляр
Функция ОкноСообщенийЛкс(МодальнаяГруппа = 0) Экспорт
Если МодальнаяГруппа = 0 Тогда
#Если ТолстыйКлиентУправляемоеПриложение Тогда
//Форма = ПолучитьФорму("Обработка.ирПлатформа.Форма.ВременноеОкноСообщенийУпр",,, МодальнаяГруппа); // Так будет ошибка компиляции в портативном варианте в файловой базе
Форма = ирОбщий.ПолучитьФормуЛкс("Обработка.ирПлатформа.Форма.ВременноеОкноСообщенийУпр",,, МодальнаяГруппа);
#КонецЕсли
Иначе
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Форма = мПлатформа.ПолучитьФорму("СообщенияМодальнойГруппы",, МодальнаяГруппа);
КонецЕсли;
Возврат Форма;
КонецФункции
#КонецЕсли
#КонецЕсли
Функция ЛиПортативныйРежимЛкс() Экспорт
//Попытка
// Пустышка = ирПортативный.мВнешниеМодули;
// Результат = Истина;
//Исключение
// Результат = Ложь;
//КонецПопытки;
Результат = ТипЗнч(ирПортативный) <> Тип("ОбщийМодуль");
Возврат Результат;
КонецФункции
Функция КодыКлавишЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КодыКлавишЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый Соответствие();
Результат.Вставить("ALT+SHIFT+V", "17494");
Результат.Вставить("CTRL+`", "04288");
Результат.Вставить("CTRL+A", "04161");
Результат.Вставить("CTRL+ALT+E", "05189");
Результат.Вставить("CTRL+C", "04163");
Результат.Вставить("CTRL+V", "04182");
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЛиСеансТолстогоКлиентаЛкс() Экспорт
#Если ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
Результат = Истина;
#ИначеЕсли Сервер Тогда
ТекущийСеанс = ирКэш.ТекущийСеансЛкс();
Результат = ирОбщий.СтрокиРавныЛкс(ТекущийСеанс.ИмяПриложения, "1CV8");
#Иначе
Результат = Ложь;
#КонецЕсли
Возврат Результат;
КонецФункции
Функция ЛиСеансТонкогоКлиентаЛкс() Экспорт
#Если ТонкийКлиент Тогда
Результат = Истина;
#ИначеЕсли Сервер Тогда
ТекущийСеанс = ирКэш.ТекущийСеансЛкс();
Результат = ирОбщий.СтрокиРавныЛкс(ТекущийСеанс.ИмяПриложения, "1CV8C");
#Иначе
Результат = Ложь;
#КонецЕсли
Возврат Результат;
КонецФункции
Функция ЛиПлатформаLinuxЛкс() Экспорт
//Возврат Истина; // Для отладки
СисИнфо = Новый СистемнаяИнформация;
Результат = Ложь
Или СисИнфо.ТипПлатформы = ТипПлатформы.Linux_x86
Или СисИнфо.ТипПлатформы = ТипПлатформы.Linux_x86_64;
Возврат Результат;
КонецФункции
Функция ЛиПлатформаWindowsЛкс() Экспорт
//Возврат Ложь; // Для отладки
СисИнфо = Новый СистемнаяИнформация;
Результат = Ложь
Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86
Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64;
Возврат Результат;
КонецФункции
Функция ЛиДоступныРегВыраженияЛкс() Экспорт
Результат = Ложь
Или ирКэш.НомерВерсииПлатформыЛкс() >= 803006
#Если Клиент Тогда
Или ирКэш.ЛиПлатформаWindowsЛкс()
#КонецЕсли
;
Возврат Результат;
КонецФункции
Функция ЛиДоступенРедакторМонакоЛкс() Экспорт
Возврат Истина
И ирКэш.НомерВерсииПлатформыЛкс() >= 803018
И ирКэш.ЛиПлатформаWindowsЛкс();
КонецФункции
// Метка_9в6676вап6438о
Функция Это64битныйПроцессЛкс() Экспорт
СисИнфо = Новый СистемнаяИнформация;
Результат = Ложь
Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64
Или СисИнфо.ТипПлатформы = ТипПлатформы.Linux_x86_64
Или ирКэш.НомерВерсииПлатформыЛкс() > 803001 И СисИнфо.ТипПлатформы = ТипПлатформы.MacOS_x86_64; // Появилось в 8.3
Возврат Результат;
КонецФункции
Функция ИмяКолонкиНомерСтрокиЛкс() Экспорт
ИмяКолонкиНомерСтроки = "НомерСтроки" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
Возврат ИмяКолонкиНомерСтроки;
КонецФункции
Функция ЭтоФайловаяБазаЛкс() Экспорт
ФайловыйКаталог = НСтр(СтрокаСоединенияИнформационнойБазы(), "File");
ЭтоФайловаяБаза = Не ПустаяСтрока(ФайловыйКаталог);
Возврат ЭтоФайловаяБаза;
КонецФункции
Функция СтрокаСоединенияСервераЛкс() Экспорт
Результат = ирСервер.СтрокаСоединенияСервераЛкс();
Возврат Результат;
КонецФункции
Функция КартинкаПоИмениЛкс(Имя) Экспорт
#Если Сервер И Не Сервер Тогда
ирПортативный = Обработки.ирПортативный.Создать();
#КонецЕсли
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КартинкаПоИмениЛкс");
КлючНаборПараметров = "" + Имя;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Попытка
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
Результат = ирПортативный.КартинкаПоИмениЛкс(Имя);
Иначе
Результат = БиблиотекаКартинок[Имя];
КонецЕсли;
Исключение
ОписаниеОшибки = ОписаниеОшибки(); // Для отладки
Результат = Новый Картинка;
КонецПопытки;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЭтоТолстыйКлиентЛкс() Экспорт
#Если ТонкийКлиент Или ВебКлиент Или МобильныйКлиент Тогда
Результат = Ложь;
#Иначе
Результат = Истина;
#КонецЕсли
Возврат Результат;
КонецФункции