//ирПортативный Перем ирПлатформа Экспорт; // Эта переменная нужна только здесь //ирПортативный Перем ирПортативный Экспорт; //ирПортативный Перем ирОбщий Экспорт; //ирПортативный Перем ирСервер Экспорт; //ирПортативный Перем ирКэш Экспорт; //ирПортативный Перем ирПривилегированный Экспорт; #Если Не ТонкийКлиент И Не ВебКлиент И Не МобильныйКлиент Тогда Функция Получить() Экспорт // Не следует использовать для хранения таких данных, переинициализация которых автоматически невозможна или приведет к ошибкам Попытка ирПлатформа = Вычислить("ирПлатформа"); Исключение КонецПопытки; Если ирПлатформа = Неопределено Тогда //ирСервер.СтрокаСоединенияСервераЛкс(); // 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 Функция КаталогИзданияПлатформыВПрофилеЛкс(Локальный = Истина, Знач ИзданиеПлатформы = "") Экспорт Если Не ЗначениеЗаполнено(ИзданиеПлатформы) Тогда ИзданиеПлатформы = ирКэш.НомерИзданияПлатформыЛкс(); КонецЕсли; ShellApplication = Новый COMobject("Shell.Application"); Если Локальный Тогда КаталогДанныхПриложения = ShellApplication.NameSpace(28).Self.Path; Иначе КаталогДанныхПриложения = ShellApplication.NameSpace(26).Self.Path; КонецЕсли; КаталогДанныхПриложения = КаталогДанныхПриложения + "\1C"; Если ИзданиеПлатформы > "82" Тогда Суффикс = Лев(ИзданиеПлатформы, 1); Иначе Суффикс = ИзданиеПлатформы; КонецЕсли; КаталогДанныхПриложения = КаталогДанныхПриложения + "\1Cv" + Суффикс; ФайлПеренаправления = Новый Файл(КаталогДанныхПриложения + "\location.cfg"); Если ФайлПеренаправления.Существует() Тогда ЧтениеТекста = Новый ЧтениеТекста; ЧтениеТекста.Открыть(ФайлПеренаправления.ПолноеИмя); СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку(); НовыйКаталог = НСтр(СтрокаФайла, "location"); Если ЗначениеЗаполнено(НовыйКаталог) Тогда КаталогДанныхПриложения = СтрЗаменить(НовыйКаталог, "/", "\"); КонецЕсли; КонецЕсли; Возврат КаталогДанныхПриложения; КонецФункции Функция ВычислительРегулярныхВыраженийЛкс() Экспорт Вычислитель = Новый COMОбъект("VBScript.RegExp"); Вычислитель.IgnoreCase = Истина; Возврат Вычислитель; КонецФункции Функция Получить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(ИмяСервера, ТочкаПодключения, , , ); Исключение Результат = Неопределено; ирОбщий.СообщитьЛкс(ОписаниеОшибки(), СтатусСообщения.Внимание); КонецПопытки; Если ирКэш.ЛиПортативныйРежимЛкс() Тогда КэшФункции[КлючНаборПараметров] = Результат; КонецЕсли; Возврат Результат; КонецФункции Функция ТекущийПользовательОСЛкс() Экспорт #Если ВебКлиент Тогда ПользовательОС = ""; #Иначе 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) = """" Тогда Результат = Вычислить(Результат); КонецЕсли; КонецЕсли; Иначе Результат = СтрокаСоединенияИнформационнойБазы(); КонецЕсли; Возврат Результат; КонецФункции Функция НастройкиБазыНаКлиентеЛкс() Экспорт ТаблицаБазКлиента = ирОбщий.ПолучитьСписокБазПользователяОСЛкс(); #Если Сервер И Не Сервер Тогда ТаблицаБазКлиента = Обработки.ирПлатформа.Создать().СписокБазПользователя; #КонецЕсли КлючомЯвляетсяСтрокаСоединения = Ложь; КлючБазыВСпискеПользователя = ирОбщий.КлючБазыВСпискеПользователяЛкс(КлючомЯвляетсяСтрокаСоединения); Если КлючомЯвляетсяСтрокаСоединения Тогда ИмяКлюча = "НСтрокаСоединения"; Иначе ИмяКлюча = "КлючСтроки"; КонецЕсли; СтрокаТекущейБазы = ТаблицаБазКлиента.Найти(НРег(КлючБазыВСпискеПользователя), ИмяКлюча); Возврат СтрокаТекущейБазы; КонецФункции Функция АбсолютныйЦветЛкс(Знач ИсходныйЦвет) Экспорт Если ирКэш.ЛиПортативныйРежимЛкс() Тогда КэшФункции = ирПортативный.КэшФункцииЛкс("АбсолютныйЦветЛкс"); КлючНаборПараметров = "" + ИсходныйЦвет; Результат = КэшФункции[КлючНаборПараметров]; Если Результат <> Неопределено Тогда Возврат Результат; КонецЕсли; КонецЕсли; #Если Сервер И Не Сервер Тогда ИсходныйЦвет = Новый Цвет; #КонецЕсли ИсходныйЦвет = ЗначениеИзСтрокиВнутр(ИсходныйЦвет); Если ИсходныйЦвет.Вид = ВидЦвета.Абсолютный Тогда Возврат ИсходныйЦвет; КонецЕсли; Если ирКэш.НомерВерсииПлатформыЛкс() >= 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"); Возврат СкриптМенеджер; КонецФункции Функция КоманднаяСтрокаТекущегоПроцессаОСЛкс() Экспорт мПлатформа = ирКэш.Получить(); #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли ИдентификаторПроцессаОС = мПлатформа.ИдентификаторПроцессаОС(); ТекущийПроцесс = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process.Handle='" + XMLСтрока(ИдентификаторПроцессаОС) + "'"); КоманднаяСтрокаПроцесса = ТекущийПроцесс.CommandLine; Возврат КоманднаяСтрокаПроцесса; КонецФункции #Если Клиент Тогда Функция ОткрытыеФормыЛкс() Экспорт ирПлатформа = ирКэш.Получить(); #Если Сервер И Не Сервер Тогда ирПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли Результат = ирПлатформа.ОткрытыеФормы; Если Результат = Неопределено Тогда Результат = Новый Массив; ирПлатформа.ОткрытыеФормы = Результат; КонецЕсли; Возврат Результат; КонецФункции Функция ПерехватКлавиатурыЛкс() Экспорт Если Не ирКэш.ЛиПортативныйРежимЛкс() Тогда Попытка Результат = Вычислить("ирПерехватКлавиатуры"); Исключение КонецПопытки; КонецЕсли; Если Результат = Неопределено Тогда Результат = ирКэш.Получить().ПодключитьПерехватКлавиатуры(); // Тут будет обращение к ирОбщий КонецЕсли; Возврат Результат; КонецФункции Функция ЛиМодальностьЗапрещенаЛкс() Экспорт Результат = Ложь; Список = Новый СписокЗначений; Попытка Список.ВыбратьЭлемент(); Исключение Результат = Истина; КонецПопытки; Возврат Результат; КонецФункции // Кэшируем форму, т.к. иначе при повторных вызовах в одном потоке кода каждый раз будет возвращаться новый экземпляр Функция ОкноСообщенийЛкс(МодальнаяГруппа = 0) Экспорт Если МодальнаяГруппа = 0 Тогда #Если ТолстыйКлиентУправляемоеПриложение Тогда Форма = ПолучитьФорму("Обработка.ирПлатформа.Форма.ВременноеОкноСообщенийУпр",,, МодальнаяГруппа); #КонецЕсли Иначе мПлатформа = ирКэш.Получить(); #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли Форма = мПлатформа.ПолучитьФорму("СообщенияМодальнойГруппы",, МодальнаяГруппа); КонецЕсли; Возврат Форма; КонецФункции #КонецЕсли #КонецЕсли Функция ЛиПортативныйРежимЛкс() Экспорт //Попытка // Пустышка = ирПортативный.мВнешниеМодули; // Результат = Истина; //Исключение // Результат = Ложь; //КонецПопытки; Результат = ТипЗнч(ирПортативный) <> Тип("ОбщийМодуль"); Возврат Результат; КонецФункции Функция КодыКлавишЛкс() Экспорт Если ирКэш.ЛиПортативныйРежимЛкс() Тогда КэшФункции = ирПортативный.КэшФункцииЛкс("КодыКлавишЛкс"); КлючНаборПараметров = ""; Результат = КэшФункции[КлючНаборПараметров]; Если Результат <> Неопределено Тогда Возврат Результат; КонецЕсли; КонецЕсли; Результат = Новый Соответствие(); Результат.Вставить("ALT+SHIFT+V", "17494"); Результат.Вставить("CTRL+`", "04288"); Результат.Вставить("CTRL+A", "04161"); Результат.Вставить("CTRL+ALT+E", "05189"); Результат.Вставить("CTRL+C", "04163"); Результат.Вставить("CTRL+V", "04182"); Если ирКэш.ЛиПортативныйРежимЛкс() Тогда КэшФункции[КлючНаборПараметров] = Результат; КонецЕсли; Возврат Результат; КонецФункции Функция ЛиСеансТолстогоКлиентаЛкс() Экспорт #Если ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда Результат = Истина; #ИначеЕсли Сервер Тогда ТекущийСеанс = ирКэш.ТекущийСеансЛкс(); Результат = ирОбщий.СтрокиРавныЛкс(ТекущийСеанс.ИмяПриложения, "1CV8"); #Иначе Результат = Ложь; #КонецЕсли Возврат Результат; КонецФункции Функция ЛиСеансТонкогоКлиентаЛкс() Экспорт #Если ТонкийКлиент Тогда Результат = Истина; #ИначеЕсли Сервер Тогда ТекущийСеанс = ирКэш.ТекущийСеансЛкс(); Результат = ирОбщий.СтрокиРавныЛкс(ТекущийСеанс.ИмяПриложения, "1CV8C"); #Иначе Результат = Ложь; #КонецЕсли Возврат Результат; КонецФункции Функция Это64битныйПроцессЛкс() Экспорт СисИнфо = Новый СистемнаяИнформация; Результат = СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64; Возврат Результат; КонецФункции Функция ИмяКолонкиНомерСтрокиЛкс() Экспорт ИмяКолонкиНомерСтроки = "НомерСтроки" + ирОбщий.СуффиксСлужебногоСвойстваЛкс(); Возврат ИмяКолонкиНомерСтроки; КонецФункции Функция ЭтоФайловаяБазаЛкс() Экспорт ФайловыйКаталог = НСтр(СтрокаСоединенияИнформационнойБазы(), "File"); ЭтоФайловаяБаза = Не ПустаяСтрока(ФайловыйКаталог); Возврат ЭтоФайловаяБаза; КонецФункции Функция СтрокаСоединенияСервераЛкс() Экспорт Результат = ирСервер.СтрокаСоединенияСервераЛкс(); Возврат Результат; КонецФункции Функция КартинкаПоИмениЛкс(Имя) Экспорт #Если Сервер И Не Сервер Тогда ирПортативный = Обработки.ирПортативный.Создать(); #КонецЕсли Если ирКэш.ЛиПортативныйРежимЛкс() Тогда КэшФункции = ирПортативный.КэшФункцииЛкс("КартинкаПоИмениЛкс"); КлючНаборПараметров = "" + Имя; Результат = КэшФункции[КлючНаборПараметров]; Если Результат <> Неопределено Тогда Возврат Результат; КонецЕсли; КонецЕсли; Попытка Если ирКэш.ЛиПортативныйРежимЛкс() Тогда Результат = ирПортативный.КартинкаПоИмениЛкс(Имя); Иначе Результат = БиблиотекаКартинок[Имя]; КонецЕсли; Исключение ОписаниеОшибки = ОписаниеОшибки(); // Для отладки Результат = Новый Картинка; КонецПопытки; Если ирКэш.ЛиПортативныйРежимЛкс() Тогда КэшФункции[КлючНаборПараметров] = Результат; КонецЕсли; Возврат Результат; КонецФункции Функция ЭтоТолстыйКлиентЛкс() Экспорт #Если ТонкийКлиент Или ВебКлиент Или МобильныйКлиент Тогда Результат = Ложь; #Иначе Результат = Истина; #КонецЕсли Возврат Результат; КонецФункции Функция ЭтоУчебнаяПлатформаЛкс() Экспорт Если Не ирКэш.ЭтоФайловаяБазаЛкс() Тогда Возврат Ложь; КонецЕсли; ВременныйФайл = ПолучитьИмяВременногоФайла("mxl"); ТабДок = Новый ТабличныйДокумент; Попытка ТабДок.Записать(ВременныйФайл, ТипФайлаТабличногоДокумента.MXL7); // В учебной версии платформы это запрещено https://www.hostedredmine.com/issues/923942 Исключение // Сработает при отсутствии права "Вывод" (портативный вариант) и в учебной платформе ("Ограничение используемой лицензии") ОписаниеОшибки = ОписаниеОшибки(); Возврат Истина; КонецПопытки; УдалитьФайлы(ВременныйФайл); Возврат Ложь; КонецФункции