RDT1C/src/CommonModules/ирКэш/Ext/Module.bsl
Администратор 6297fbc048 .
2024-02-04 21:21:06 +03:00

2269 lines
138 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";
КонецФункции
Функция КомпоновщикТаблицыМетаданныхЛкс(Знач ПолноеИмяМД, ВызыватьИсключениеПриОтсутствииПрав = Истина, ИндексПараметраПериодичность = Неопределено,
ВыражениеПараметраПериодичность = "", ИменаВместоПредставлений = Ложь) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КомпоновщикТаблицыМетаданныхЛкс");
КлючНаборПараметров = "" + ПолноеИмяМД + ";" + ВызыватьИсключениеПриОтсутствииПрав + ";" + ИндексПараметраПериодичность + ";" + ВыражениеПараметраПериодичность
+ ";" + ИменаВместоПредставлений;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
КомпоновщикНастроек = ирОбщий.КомпоновщикТаблицыМетаданныхЛкс(ПолноеИмяМД, ВызыватьИсключениеПриОтсутствииПрав, ИндексПараметраПериодичность, ВыражениеПараметраПериодичность, ИменаВместоПредставлений);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = КомпоновщикНастроек;
КонецЕсли;
Возврат КомпоновщикНастроек;
КонецФункции
Функция ПоляТаблицыБДЛкс(ПолноеИмяТаблицыБД, НужныТолькоТипы = Ложь, ИндексПараметраПериодичность = Неопределено, ВыражениеПараметраПериодичность = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПоляТаблицыБДЛкс");
КлючНаборПараметров = "" + ПолноеИмяТаблицыБД + ";" + НужныТолькоТипы + ";" + ИндексПараметраПериодичность + ";" + ВыражениеПараметраПериодичность;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = ирОбщий.ПоляТаблицыБДЛкс(ПолноеИмяТаблицыБД, НужныТолькоТипы, ИндексПараметраПериодичность, ВыражениеПараметраПериодичность);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПараметрыСеансаЛкс() Экспорт
Результат = Новый Структура("ПереданныйКэш");
Возврат Результат;
КонецФункции
Функция ТаблицаВсехТаблицБДЛкс() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ТаблицаВсехТаблицБД = мПлатформа.ТаблицаВсехТаблицБД();
Возврат ТаблицаВсехТаблицБД;
КонецФункции
Функция ДеревоОбъектовМДЛкс() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ТаблицаВсехТаблицБД = мПлатформа.ДеревоОбъектовМД();
Возврат ТаблицаВсехТаблицБД;
КонецФункции
Функция ЛиЭтоРасширениеКонфигурацииЛкс() Экспорт
Расширение = ирКэш.ЭтотРасширениеКонфигурацииЛкс();
#Если Сервер И Не Сервер Тогда
Расширение = РасширенияКонфигурации.Создать();
#КонецЕсли
Результат = Истина
И Расширение <> Неопределено
И (Ложь
Или ирКэш.НомерВерсииПлатформыЛкс() < 803012
Или Расширение.Активно);
Возврат Результат;
КонецФункции
Функция ЭтотРасширениеКонфигурацииЛкс() Экспорт
Результат = ирОбщий.ЭтотРасширениеКонфигурацииЛкс();
Возврат Результат;
КонецФункции
Функция СтруктураХраненияБДЛкс(ЛиИменаБД = Ложь, АдресЧужойСхемыБД = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("СтруктураХраненияБДЛкс");
КлючНаборПараметров = "" + ЛиИменаБД + ";" + АдресЧужойСхемыБД;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = ирОбщий.СтруктураХраненияБДЛкс(, ЛиИменаБД, АдресЧужойСхемыБД);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
// Получить словарь метаданных состоящий из шаблонов имен таблиц
//
// Параметры:
// ЛиИменаБД - Булево
//
// Возвращаемое значение:
// Соответствие - словарь шаблонов имен метаданных. Ключ - наименование объекта
// метаданных, где его номер заменен на номер позиции этого
// числа в строке; Значение - количество чисел в строке
//
Функция СловарьШаблоновХраненияБДЛкс(ЛиИменаБД = Ложь, АдресЧужойСхемыБД = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("СловарьШаблоновХраненияБДЛкс");
КлючНаборПараметров = "" + ЛиИменаБД + ";" + АдресЧужойСхемыБД;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
СтруктураХраненияБД = ирКэш.СтруктураХраненияБДЛкс(ЛиИменаБД, АдресЧужойСхемыБД);
Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("РегулярныйШаблон");
Результат.Колонки.Добавить("ПозиционныйШаблон");
Результат.Колонки.Добавить("КоличествоПараметров");
КоличествоСимволов = 0;
ПозицияЧисла = 0;
Для Каждого СтрокаСтруктурыБазы Из СтруктураХраненияБД Цикл
ИмяТаблицыХранения = НРег(Лев(СтрокаСтруктурыБазы.ИмяТаблицыХранения, СтрДлина(СтрокаСтруктурыБазы.ИмяТаблицыХранения)));
РегулярныйШаблон = "";
ПозиционныйШаблон = "";
КоличествоЧисел = 0;
ПоследнееИмяШаблона = "";
Пока ирОбщий.НайтиЧислоВСтрокеЛкс(ИмяТаблицыХранения, ПозицияЧисла, КоличествоСимволов) Цикл
КоличествоЧисел = КоличествоЧисел + 1;
ПоследнееИмяШаблона = Лев(ИмяТаблицыХранения, ПозицияЧисла - 1);
РегулярныйШаблон = РегулярныйШаблон + ПоследнееИмяШаблона + "(\d+)";
ПозиционныйШаблон = ПозиционныйШаблон + ПоследнееИмяШаблона + XMLСтрока(КоличествоЧисел);
ИмяТаблицыХранения = Прав(ИмяТаблицыХранения, СтрДлина(ИмяТаблицыХранения) - ПозицияЧисла - КоличествоСимволов + 1);
КонецЦикла;
РегулярныйШаблон = РегулярныйШаблон + ИмяТаблицыХранения;
ПозиционныйШаблон = ПозиционныйШаблон + ИмяТаблицыХранения;
СтрокаРезультата = Результат.Добавить();
СтрокаРезультата.РегулярныйШаблон = НРег(РегулярныйШаблон);
СтрокаРезультата.ПозиционныйШаблон = ПозиционныйШаблон;
СтрокаРезультата.КоличествоПараметров = КоличествоЧисел;
Если Не ЛиИменаБД Тогда
// Сохранить шаблон дочерней таблицы независимо
Если КоличествоЧисел > 1 Тогда
Если Лев(ПоследнееИмяШаблона, 1) = "." Тогда
ПоследнееИмяШаблона = Сред(ПоследнееИмяШаблона, 2);
КонецЕсли;
РегулярныйШаблон = ПоследнееИмяШаблона + "(\d+)";
ПозиционныйШаблон = ПоследнееИмяШаблона + XMLСтрока(КоличествоЧисел);
СтрокаРезультата = Результат.Добавить();
СтрокаРезультата.РегулярныйШаблон = НРег(РегулярныйШаблон);
СтрокаРезультата.ПозиционныйШаблон = ПозиционныйШаблон;
СтрокаРезультата.КоличествоПараметров = 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Результат.Свернуть("РегулярныйШаблон,ПозиционныйШаблон,КоличествоПараметров");
Результат.Сортировать("ПозиционныйШаблон");
// Для ускорения многократного использования
Результат.Колонки.Добавить("БыстрыйМаркер"); // главное ускорение
Результат.Колонки.Добавить("Вычислитель");
Для Каждого СтрокаРезультата Из Результат Цикл
СтрокаРезультата.БыстрыйМаркер = ирОбщий.ПервыйФрагментЛкс(СтрокаРезультата.РегулярныйШаблон, "(");
Вычислитель = ирОбщий.НовоеРегВыражениеЛкс();
Вычислитель.Global = Истина;
Вычислитель.Pattern = СтрокаРезультата.РегулярныйШаблон;
СтрокаРезультата.Вычислитель = Вычислитель;
КонецЦикла;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолучитьСеансПустойИнфобазы1С8Лкс(Знач ТипCOMОбъекта = "Application", Знач Видимость = Ложь, Знач ОбработатьИсключениеПодключения = Ложь,
ОписаниеОшибки = "", ИмяСервераПроцессов = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПолучитьСеансПустойИнфобазы1С8Лкс");
КлючНаборПараметров = "" + ТипCOMОбъекта + ";" + Видимость + ";" + ОбработатьИсключениеПодключения + ";" + ОписаниеОшибки + ";" + ИмяСервераПроцессов;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
СтрокаСоединения = ирОбщий.СтрокаСоединенияПустойИнфобазыЛкс();
Результат = ирОбщий.СоздатьСеансИнфобазы1С8Лкс(СтрокаСоединения, , , ТипCOMОбъекта, Видимость, ОбработатьИсключениеПодключения,
ОписаниеОшибки, ИмяСервераПроцессов);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция БуферСравненияЛкс(ТипДанных) Экспорт
ирПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
ирПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Результат = ирПлатформа.БуферыСравнения[ТипДанных];
Если Результат = Неопределено Тогда
Результат = Новый Массив;
ирПлатформа.БуферыСравнения[ТипДанных] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ФорматБуфераОбмена1СЛкс() Экспорт
WinAPI = ирКэш.ПолучитьWinAPI();
Если WinAPI <> Неопределено Тогда
ФорматБуфераОбмена1С = WinAPI.RegisterClipboardFormat("V8Value");
КонецЕсли;
Возврат ФорматБуфераОбмена1С;
КонецФункции
Функция Это64битнаяОСЛкс(Компьютер = Неопределено) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("Это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;
КонецЦикла;
КонецЦикла;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ВКОбщаяЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ВКОбщаяЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
// Все способы помещения ВК в кэш приводят к ошибке плафтормы https://github.com/tormozit/RDT1C/issues/29
//Результат = ирОбщий.НоваяВКОбщаяЛкс(Секунда(ТекущаяДата()));
Результат = ирОбщий.НоваяВКОбщаяЛкс();
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция КорневыеТипыСсылочныеЛкс() Экспорт
Результат = Новый Массив;
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
СтрокиМетаОбъектов = мПлатформа.ТаблицаТиповМетаОбъектов.НайтиСтроки(Новый Структура("Категория", 0));
Для Каждого СтрокаТаблицыМетаОбъектов Из СтрокиМетаОбъектов Цикл
Единственное = СтрокаТаблицыМетаОбъектов.Единственное;
Если ирОбщий.ЛиКорневойТипСсылочногоОбъектаБДЛкс(Единственное) Тогда
Результат.Добавить(СтрокаТаблицыМетаОбъектов);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ЭтоФоновоеЗаданиеЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
Возврат Ложь;
КонецЕсли;
ТекущийСеанс = ирКэш.ТекущийСеансЛкс();
Если ТекущийСеанс = Неопределено Тогда
Результат = Ложь;
Иначе
Результат = ирОбщий.СтрокиРавныЛкс(ТекущийСеанс.ИмяПриложения, "BackgroundJob");
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ТекущийСеансЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ТекущийСеансЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Если ирКэш.НомерРежимаСовместимостиЛкс() >= 803007 Тогда
Результат = Вычислить("ПолучитьТекущийСеансИнформационнойБазы()");
Иначе
Результат = ирСервер.ТекущийСеансЛкс();
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция РежимОтладкиЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("РежимОтладкиЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = ирКэш.Получить().РежимОтладки;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
// 8.3.5+
Функция ДоступныВидыСравненияПодобноШаблонЛкс() Экспорт
Результат = ирКэш.НомерВерсииПлатформыЛкс() >= 803005;
Возврат Результат;
КонецФункции
// 8.3.8+
Функция ДоступныТаблицыМенеджераВременныхТаблицЛкс() Экспорт
Менеджер = Новый МенеджерВременныхТаблиц;
Попытка
Результат = Менеджер.Таблицы;
Исключение
Результат = Неопределено;
КонецПопытки;
Возврат Результат <> Неопределено;
КонецФункции
// 8.3.9+
Функция ДоступнаЗащитаОтОпасныхДействийЛкс() Экспорт
ЗащитаОтОпасныхДействийЛ = Неопределено;
Попытка
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
ЗащитаОтОпасныхДействийЛ = ТекущийПользователь.ЗащитаОтОпасныхДействий;
Исключение
КонецПопытки;
Возврат ЗащитаОтОпасныхДействийЛ <> Неопределено;
КонецФункции
// 8.2.14+
Функция ДоступныВнешниеИсточникДанныхЛкс() Экспорт
Результат = ирКэш.НомерВерсииПлатформыЛкс() >= 802014;
Возврат Результат;
КонецФункции
// 8.2.14+
Функция ДоступныОбщиеРеквизитыЛкс() Экспорт
Результат = ирКэш.НомерВерсииПлатформыЛкс() >= 802014;
Возврат Результат;
КонецФункции
// 8.3.18+
Функция ДоступноВосстановлениеПароляПользователямЛкс() Экспорт
Результат = Неопределено;
Попытка
ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Результат = ТекущийПользователь.ЗапрещеноВосстанавливатьПароль;
Исключение
КонецПопытки;
Возврат Результат <> Неопределено;
КонецФункции
Функция ДоступноИсторияДанныхЛкс() Экспорт
Возврат ирКэш.НомерРежимаСовместимостиЛкс() >= 803011;
КонецФункции
Функция ДоступныПодключемыеКомандыЛкс() Экспорт
Результат = Истина
И ирКэш.НомерВерсииБСПЛкс() >= 204
И Метаданные.ОбщиеМодули.Найти("ПодключаемыеКоманды") <> Неопределено
И Не ирКэш.ЛиПортативныйРежимЛкс();
Возврат Результат;
КонецФункции
// 8.3.6+
// https://www.hostedredmine.com/issues/964302
Функция ЛиДоступнаКомпоновкаТаблицыЗначенийКлс() Экспорт
Возврат ирКэш.НомерРежимаСовместимостиЛкс() > 803005;
КонецФункции
// Результат: Число . Например 801000-8.1, 803019-8.3.19
Функция НомерРежимаСовместимостиЛкс() Экспорт
ТекущийРежимСовместимости = Метаданные.РежимСовместимости;
Если ТекущийРежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
СисИнфо = Новый СистемнаяИнформация;
Фрагменты = ирОбщий.СтрРазделитьЛкс(СисИнфо.ВерсияПриложения,,, Ложь); // Защита от рекурсии!
Иначе
// Пример значения СтрокаВерсии = Версия8_3_1
ТекущийРежимСовместимости = СтрЗаменить(ТекущийРежимСовместимости, "Версия", "");
ТекущийРежимСовместимости = СтрЗаменить(ТекущийРежимСовместимости, "Version", ""); // Вариант встроенного языка Английский
Фрагменты = ирОбщий.СтрРазделитьЛкс(ТекущийРежимСовместимости, "_",, Ложь); // Защита от рекурсии!
КонецЕсли;
Результат = Число(Фрагменты[0]) * 100 * 1000 + Число(Фрагменты[1]) * 1000;
Если Фрагменты.Количество() > 2 Тогда
Результат = Результат + Число(Фрагменты[2]);
КонецЕсли;
Возврат Результат;
КонецФункции
// Например "82", "83"
// Результат: Строка
Функция НомерИзданияПлатформыЛкс() Экспорт
СисИнфо = Новый СистемнаяИнформация;
Фрагменты = ирОбщий.СтрРазделитьЛкс(СисИнфо.ВерсияПриложения);
Результат = Фрагменты[0] + Фрагменты[1];
Возврат Результат;
КонецФункции
// Результат: Число
Функция НомерВерсииПлатформыЛкс(ВключаяНомерСборки = Ложь) Экспорт
СисИнфо = Новый СистемнаяИнформация;
СтрокаВерсии = СисИнфо.ВерсияПриложения;
Результат = ирОбщий.НомерВерсииПлатформыЛкс(СтрокаВерсии, ВключаяНомерСборки);
Возврат Результат;
КонецФункции
Функция НомерВерсииПодсистемыИРЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
ИспользуемаяВерсия = ирПортативный.мВерсия;
Иначе
ИспользуемаяВерсия = Метаданные.Подсистемы.ИнструментыРазработчикаTormozit.Комментарий;
КонецЕсли;
Фрагменты = ирОбщий.СтрРазделитьЛкс(ИспользуемаяВерсия);
#Если Сервер И Не Сервер Тогда
Фрагменты = Новый Массив;
#КонецЕсли
Для Счетчик = Фрагменты.Количество() По 2 Цикл
Фрагменты.Добавить("0");
КонецЦикла;
Результат = Число(Фрагменты[0]) * 100 + Число(Фрагменты[1]);
Возврат Результат;
КонецФункции
Функция НомерВерсииPowerShellЛкс() Экспорт
ТекстСкрипта = Новый ТекстовыйДокумент;
ТекстСкрипта.УстановитьТекст("$PSVersionTable.PSVersion.major");
ФайлСкрипта = Новый Файл(ПолучитьИмяВременногоФайла("ps1"));
ТекстСкрипта.Записать(ФайлСкрипта.ПолноеИмя);
СтрокаЗапуска = ирОбщий.КомандаСистемыЗапускаСкриптаPowerShellЛкс(ФайлСкрипта.Имя);
РезультатКоманды = ирОбщий.ВыполнитьКомандуОСЛкс(СтрокаЗапуска);
Результат = Число(РезультатКоманды);
Возврат Результат;
КонецФункции
Функция ВерсияБСПЛкс() Экспорт
УстановитьПривилегированныйРежим(Истина);
Если Истина
И Метаданные.РегистрыСведений.Найти("ВерсииПодсистем") <> Неопределено
И ПравоДоступа("Чтение", Метаданные.РегистрыСведений.ВерсииПодсистем)
Тогда
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| ВерсииПодсистем.Версия КАК Версия
|ИЗ
| РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем
|ГДЕ
| ВерсииПодсистем.ИмяПодсистемы = &ИмяПодсистемы
|";
Запрос.УстановитьПараметр("ИмяПодсистемы", "СтандартныеПодсистемы");
Таблица = Запрос.Выполнить().Выгрузить();
Если Таблица.Количество() > 0 Тогда
ВерсияБСП = Таблица[0].Версия;
КонецЕсли;
КонецЕсли;
Возврат ВерсияБСП;
КонецФункции
Функция НомерВерсииБСПЛкс() Экспорт
ВерсияБСП = ирКэш.ВерсияБСПЛкс();
Если ЗначениеЗаполнено(ВерсияБСП) Тогда
Фрагменты = ирОбщий.СтрРазделитьЛкс(ВерсияБСП);
Результат = Число(Фрагменты[0]) * 100 + Число(Фрагменты[1]);
Иначе
Результат = 0;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЭталонныйНаборЗаписейЛкс(Знач ПолноеИмяТаблицыБД) Экспорт
#Если Сервер Тогда
// Будет всегда работать в файловой базе. Поэтому там объект будет всегда на клиенте создаваться
ОбъектыНаСервере = Ложь;
#Иначе
ОбъектыНаСервере = "Обязательно";
#КонецЕсли
НаборЗаписей = ирОбщий.СоздатьНаборЗаписейПоИмениТаблицыБДЛкс(ПолноеИмяТаблицыБД, ОбъектыНаСервере).Методы;
Возврат НаборЗаписей;
КонецФункции
// Каталог издания платформы в профиле пользователя ОС
//
// Параметры:
// Локальный - Булево - при Истина будет Local, иначе Roaming
// ИзданиеПлатформы - Строка - например "82", "83"
//
// Возвращаемое значение:
// -
//
Функция КаталогИзданияПлатформыВПрофилеЛкс(Локальный = Истина, Знач ИзданиеПлатформы = "") Экспорт
КаталогДанныхПриложения = КаталогПлатформыВПрофилеЛкс(Локальный);
Если Не ЗначениеЗаполнено(ИзданиеПлатформы) Тогда
ИзданиеПлатформы = ирКэш.НомерИзданияПлатформыЛкс();
КонецЕсли;
Если ИзданиеПлатформы > "82" Тогда
Суффикс = Лев(ИзданиеПлатформы, 1);
Иначе
Суффикс = ИзданиеПлатформы;
КонецЕсли;
Разделитель = ирОбщий.РазделительПутиКФайлуЛкс();
КаталогДанныхПриложения = КаталогДанныхПриложения + Разделитель + "1cv" + Суффикс;
ФайлПеренаправления = Новый Файл(КаталогДанныхПриложения + Разделитель + "location.cfg");
Если ФайлПеренаправления.Существует() Тогда
ЧтениеТекста = Новый ЧтениеТекста;
ЧтениеТекста.Открыть(ФайлПеренаправления.ПолноеИмя);
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
НовыйКаталог = НСтр(СтрокаФайла, "location");
Если ЗначениеЗаполнено(НовыйКаталог) Тогда
Если Разделитель = "\" Тогда
КаталогДанныхПриложения = СтрЗаменить(НовыйКаталог, "/", Разделитель);
Иначе
КаталогДанныхПриложения = СтрЗаменить(НовыйКаталог, "\", Разделитель);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат КаталогДанныхПриложения;
КонецФункции
Функция КаталогПлатформыВПрофилеЛкс(Знач Локальный = Ложь) Экспорт
Если Не ирКэш.ЛиПлатформаWindowsЛкс() Тогда
//КаталогДанныхПриложения = "~/.1cv8"; // Похоже так можно только в bash. Ошибка доступа к файлу '~'. 13(0x0000000D): Permission denied
#Если Клиент Тогда
Если Локальный Тогда
Подкаталог = ".1cv8" + ирОбщий.РазделительПутиКФайлуЛкс() + "1C";
Иначе
Подкаталог = ".1C";
КонецЕсли;
ПеременныеОкружения = ирОбщий.ВыполнитьКомандуОСЛкс("env");
КаталогПользователя = ирОбщий.ЗначениеПеременнойОкруженияЛкс(ПеременныеОкружения, "HOME=");
Если Не ЗначениеЗаполнено(КаталогПользователя) Тогда
КаталогДанныхПриложения = "/home/" + ирКэш.ТекущийПользовательОСЛкс(Ложь) + ирОбщий.РазделительПутиКФайлуЛкс() + Подкаталог;
Иначе
КаталогДанныхПриложения = КаталогПользователя + ирОбщий.РазделительПутиКФайлуЛкс() + Подкаталог;
КонецЕсли;
#Иначе
КаталогДанныхПриложения = КаталогВременныхФайлов();
#КонецЕсли
Иначе
Если Локальный Тогда
Подкаталог = 28;
Иначе
Подкаталог = 26;
КонецЕсли;
ПриложениеОболочкиОС = Новый COMobject("Shell.Application");
КаталогДанныхПриложения = ПриложениеОболочкиОС.NameSpace(Подкаталог);
Если КаталогДанныхПриложения = Неопределено Тогда
// https://www.hostedredmine.com/issues/954427
КаталогДанныхПриложения = КаталогВременныхФайлов();
Иначе
КаталогДанныхПриложения = КаталогДанныхПриложения.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 %1 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");
Возврат ПеременныеОкружения;
КонецФункции
Функция ПараметрыЗаписиОбъектовЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПараметрыЗаписиОбъектовЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый Структура("БезАвторегистрацииИзменений, ОбъектыНаСервере, ДополнительныеСвойства, ОтключатьКонтрольЗаписи, НеИспользоватьИмитаторыОбъектовДанных, ПривилегированныйРежим,
|ОтключатьЗаписьВерсии, ПроверятьЗаполнение");
Результат.БезАвторегистрацииИзменений = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.БезАвторегистрацииИзменений");
Результат.ОбъектыНаСервере = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ОбъектыНаСервере");
Если Результат.ОбъектыНаСервере = Неопределено Тогда
Результат.ОбъектыНаСервере = ирОбщий.РежимОбъектыНаСервереПоУмолчаниюЛкс();
КонецЕсли;
Результат.НеИспользоватьИмитаторыОбъектовДанных = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.НеИспользоватьИмитаторыОбъектовДанных");
Если Результат.НеИспользоватьИмитаторыОбъектовДанных = Неопределено Тогда
Результат.НеИспользоватьИмитаторыОбъектовДанных = ирОбщий.ВосстановитьЗначениеЛкс("НеИспользоватьИмитаторыОбъектовДанных");
Если Результат.НеИспользоватьИмитаторыОбъектовДанных = Неопределено Тогда
Результат.НеИспользоватьИмитаторыОбъектовДанных = Ложь;
КонецЕсли;
КонецЕсли;
Результат.ДополнительныеСвойства = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ДополнительныеСвойства");
Если Результат.ДополнительныеСвойства = Неопределено Тогда
Результат.ДополнительныеСвойства = Новый ТаблицаЗначений; // см. Обработка.ирПлатформа.Форма.ПараметрыЗаписиОбъектов.ДополнительныеСвойства
КонецЕсли;
Если Результат.ДополнительныеСвойства.Колонки.Найти("Пометка") = Неопределено Тогда
Результат.ДополнительныеСвойства.Колонки.Добавить("Пометка");
КонецЕсли;
Результат.ОтключатьКонтрольЗаписи = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ОтключатьКонтрольЗаписи");
Если Результат.ОтключатьКонтрольЗаписи = Неопределено Тогда
Результат.ОтключатьКонтрольЗаписи = Ложь;
КонецЕсли;
Результат.ПроверятьЗаполнение = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ПроверятьЗаполнение");
Если Результат.ПроверятьЗаполнение = Неопределено Тогда
Результат.ПроверятьЗаполнение = Ложь;
КонецЕсли;
Результат.ОтключатьЗаписьВерсии = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ОтключатьЗаписьВерсии");
Если Результат.ОтключатьЗаписьВерсии = Неопределено Тогда
Результат.ОтключатьЗаписьВерсии = Ложь;
КонецЕсли;
Результат.ПривилегированныйРежим = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ПривилегированныйРежим");
Если Результат.ПривилегированныйРежим = Неопределено Тогда
Результат.ПривилегированныйРежим = Ложь;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЛюбойТипРегистраЛкс(Знач ПодтипРус) Экспорт
ПодтипРус = ирОбщий.ПеревестиСтроку(ПодтипРус);
ТипОбразец = Неопределено;
КоллекцииМетаданных = Новый Массив;
КоллекцииМетаданных.Добавить(Метаданные.РегистрыСведений);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыНакопления);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыБухгалтерии);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыРасчета);
КоллекцииМетаданных.Добавить(Метаданные.Последовательности);
Для Каждого КоллекцияМетаданных Из КоллекцииМетаданных Цикл
Для Каждого МетаРегистр Из КоллекцияМетаданных Цикл
ИмяТипа = СтрЗаменить(МетаРегистр.ПолноеИмя(), ".", ПодтипРус + ".");
Попытка
ТипОбразец = Тип(ИмяТипа);
Исключение
Продолжить;
КонецПопытки;
Прервать;
КонецЦикла;
Если ТипОбразец <> Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ТипОбразец;
КонецФункции
Функция ЛюбойТипТабличнойЧастиЛкс() Экспорт
Результат = ТипЗнч(ирКэш.Получить().КолонкиТабличногоПоля);
Возврат Результат;
КонецФункции
Функция ЛюбойТипСтрокиТабличнойЧастиЛкс() Экспорт
Результат = ТипЗнч(ирКэш.Получить().КолонкиТабличногоПоля.Добавить());
Возврат Результат;
КонецФункции
Функция МаркерПодтипаИзТипаЛкс(Знач ПредставлениеТипа, Знач КоличествоСлов) Экспорт
ПредставлениеОбразца = ирОбщий.ПервыйФрагментЛкс(ПредставлениеТипа, ":");
ФрагментыОбразца = ирОбщий.СтрРазделитьЛкс(ПредставлениеОбразца, " ");
#Если Сервер И Не Сервер Тогда
ФрагментыОбразца = Новый Массив;
#КонецЕсли
МаркерТипа = "";
Для Счетчик = 1 По КоличествоСлов Цикл
Если МаркерТипа <> "" Тогда
МаркерТипа = МаркерТипа + " ";
КонецЕсли;
МаркерТипа = МаркерТипа + ФрагментыОбразца[ФрагментыОбразца.ВГраница() - (КоличествоСлов - Счетчик)];
КонецЦикла;
Возврат МаркерТипа;
КонецФункции
Функция КлючБазыВСпискеПользователяИзКоманднойСтрокиЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КлючБазыВСпискеПользователяИзКоманднойСтрокиЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Если ирОбщий.ЛиИдентификацияБазыВСпискеПоНаименованиюЛкс() Тогда
Если Не ирКэш.ДоступныРегВыраженияЛкс() Тогда
Результат = Неопределено;
Иначе
КоманднаяСтрокаПроцесса = ирКэш.КоманднаяСтрокаТекущегоПроцессаОСЛкс();
ВычислительРегВыражений = ирОбщий.НовоеРегВыражениеЛкс();
ВычислительРегВыражений.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
Возврат Неопределено;
КонецЕсли;
Возврат Метаданные.НайтиПоПолномуИмени(ПолноеИмяМД);
КонецФункции
Функция ИмяТаблицыИзМетаданныхЛкс(Знач ПолноеИмяМД, Знач ЛиТаблицаИзменений = Ложь, Знач ЛиДвиженияССубконтоДляРегистраБухгалтерии = Истина, Знач ТолькоРазрешенные = Ложь) Экспорт
Фрагменты = ирОбщий.СтрРазделитьЛкс(ПолноеИмяМД);
Если ТолькоРазрешенные Тогда
//Если ТипЗнч(ОбъектИлиИмяМД) = Тип("Строка") Тогда
Если Фрагменты[0] = "ВнешнийИсточникДанных" Тогда
ОбъектМД = ирКэш.ОбъектМДПоПолномуИмениЛкс(ПолноеИмяМД);
ИначеЕсли Фрагменты.Количество() > 1 Тогда
ОбъектМД = ирКэш.ОбъектМДПоПолномуИмениЛкс(Фрагменты[0] + "." + Фрагменты[1]); // очень долгая операция, поэтому лучше не устанавливать флаг ТолькоРазрешенные
Иначе
//ОбъектМД = Метаданные[Фрагменты[0]];
ОбъектМД = Неопределено;
КонецЕсли;
//Иначе
// ОбъектМД = ОбъектИлиИмяМД;
//КонецЕсли;
Если Истина
И ОбъектМД <> Неопределено
И Не ПравоДоступа("Чтение", ОбъектМД)
Тогда
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
Если ЛиТаблицаИзменений Тогда
ДублиТаблицыБД = ирКэш.ТаблицаВсехТаблицБДЛкс().НайтиСтроки(Новый Структура("НПолноеИмя", Нрег(ПолноеИмяМД + ".Изменения")));
Если ДублиТаблицыБД.Количество() > 1 Тогда
// Конфликтная ситуация в платформе - ТЧ имеет имя совпадающее с именем общей таблицы "Изменения" - побеждает ТЧ
ирОбщий.СообщитьЛкс(ирОбщий.СтрШаблонИменЛкс("Таблица изменений %1 перекрыта табличной частью ""Изменения"". Поэтому невозможно получить количество изменений в ней.",, ПолноеИмяМД),
СтатусСообщения.Внимание);
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
Если Истина
И Фрагменты.Количество() = 2
И Не ЛиТаблицаИзменений
И Фрагменты[0] = ирОбщий.ПеревестиСтроку("Константа")
Тогда
Если Не ирКэш.ДоступныТаблицыКонстантЛкс() Тогда
Фрагменты = ирОбщий.СтрРазделитьЛкс("Константы");
КонецЕсли;
КонецЕсли;
Если Фрагменты.Количество() = 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, "Подсистема", 61, "Подсистемы", 61);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "РегламентноеЗадание", , "РегламентныеЗадания", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Роль", 60, "Роли", 60);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Стиль", , "Стили", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ФункциональнаяОпция", ,"ФункциональныеОпции", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ХранилищеНастроек", , "ХранилищаНастроек", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ЭлементСтиля", , "ЭлементыСтиля", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Язык", , "Языки", );
КонецЕсли;
// Порядок влияет на отображение пользователю
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Константа", 0, "Константы", 1);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Справочник", 3, "Справочники", 2);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Документ", 13, "Документы", 12);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ЖурналДокументов", 16, "ЖурналыДокументов", 15);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланВидовХарактеристик", 38, "ПланыВидовХарактеристик", 37);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланСчетов", 40, "ПланыСчетов",39 );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланВидовРасчета", 48, "ПланыВидовРасчета", 47);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрСведений", 34, "РегистрыСведений", 33);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрНакопления", 32, "РегистрыНакопления", 31);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрБухгалтерии", 42, "РегистрыБухгалтерии", 41);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрРасчета", 50, "РегистрыРасчета", 49);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Перерасчет", 57, "Перерасчеты", 57);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Последовательность", 30, "Последовательности", 29);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "БизнесПроцесс", 44, "БизнесПроцессы", 43);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Задача", 46, "Задачи", 45);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланОбмена", 52, "ПланыОбмена", 51);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Перечисление", 10, "Перечисления", 9);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "КритерийОтбора", , "КритерииОтбора", );
Если ирКэш.ДоступныВнешниеИсточникДанныхЛкс() Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ВнешнийИсточникДанных", 59, "ВнешниеИсточникиДанных", 58);
КонецЕсли;
// Дочерние типы
Если ЛиВключатьДочерние Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 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Лкс() Тогда
Результат = ирОбщий.ВыполнитьКомандуОСЛкс("echo $PPID");
Попытка
ИдентификаторПроцессаОС = Число(Результат);
Исключение
ИдентификаторПроцессаОС = 0;
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Иначе
#Если ТонкийКлиент Тогда
// Первый вариант иногда не оставлял процесс работать (он сразу завершался) и приводил ниже к ошибкам "Произошла исключительная ситуация (SWbemServicesEx): Not found"
Оболочка = Новый COMОбъект("WScript.Shell");
ДочернийПроцесс = Оболочка.Exec("rundll32.exe kernel32,Sleep");
ИдентификаторПроцессаОС = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process.Handle='" + Формат(ДочернийПроцесс.ProcessID, "ЧГ=") + "'").ParentProcessID;
ДочернийПроцесс.Terminate(); // Может выполняться долго!
#Иначе
Попытка
ВК = ирОбщий.ВКОбщаяЛкс();
Исключение
// Например - Не найден файл внешней компоненты
ИдентификаторПроцессаОС = 0;
Сообщить(ОписаниеОшибки(), СтатусСообщения.Внимание);
КонецПопытки;
Если ВК <> Неопределено Тогда
ИдентификаторПроцессаОС = ВК.PID();
КонецЕсли;
#КонецЕсли
КонецЕсли;
Возврат ИдентификаторПроцессаОС;
КонецФункции
Функция КоманднаяСтрокаТекущегоПроцессаОСЛкс() Экспорт
Если Не ирКэш.ЛиПлатформа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
Исключение
// Сработает при отсутствии права "Вывод" (портативный вариант) и в учебной платформе ("Ограничение используемой лицензии")
ОписаниеОшибки = ОписаниеОшибки();
Возврат Истина;
КонецПопытки;
УдалитьФайлы(ВременныйФайл);
Возврат Ложь;
КонецФункции
Функция СоставОбщегоРеквизитаЛкс(Знач Имя) Экспорт
Состав = Новый Соответствие;
Для Каждого ЭлементСостава Из Метаданные.ОбщиеРеквизиты[Имя].Состав Цикл
Состав.Вставить(ЭлементСостава.Метаданные.ПолноеИмя(), ЭлементСостава);
КонецЦикла;
Возврат Состав;
КонецФункции
Функция ЛиДоступноДопРеквизитыБСПЛкс() Экспорт
Результат = Истина
И Не ирКэш.ЛиПортативныйРежимЛкс()
И Метаданные.ОбщиеМодули.Найти("УправлениеСвойствами") <> Неопределено
И ирКэш.НомерВерсииБСПЛкс() >= 204;
Возврат Результат;
КонецФункции
Функция ЛиДоступноФорматированнаяСтрокаЛкс() Экспорт
Результат = ирКэш.НомерВерсииПлатформыЛкс() > 803001;
Возврат Результат;
КонецФункции
Функция СобытияПоИмениОбщегоТипаЛкс(Знач ИмяОбщегоТипа, Знач ИмяТипаРасширения = Неопределено) Экспорт
мПлатформа = ирКэш.Получить();
мПлатформа.ИнициацияОписанияМетодовИСвойств();
СобытияЭлементаФормы = мПлатформа.ТаблицаКонтекстов.НайтиСтроки(Новый Структура("ТипКонтекста, ЯзыкПрограммы, ТипЯзыка, ТипСлова", ИмяОбщегоТипа, 0, "", "Событие"));
Если ИмяТипаРасширения <> Неопределено Тогда
СобытияРасширения = ирКэш.СобытияПоИмениОбщегоТипаЛкс(ИмяТипаРасширения);
ирОбщий.ДополнитьМассивЛкс(СобытияЭлементаФормы, СобытияРасширения);
КонецЕсли;
Возврат СобытияЭлементаФормы;
КонецФункции
Функция ДоступныеСборкиПлатформыЛкс() Экспорт
СборкиПлатформы = ирОбщий.ЗаполнитьДоступныеСборкиПлатформыЛкс();
Возврат СборкиПлатформы;
КонецФункции
Функция ВсеВидыПравДоступаЛкс() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ВсеВидыПравДоступа = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(мПлатформа.ПолучитьМакет("ВидыПравДоступа"));
ирОбщий.ЗаполнитьКолонкуПорядкаТаблицыЛкс(ВсеВидыПравДоступа);
Возврат ВсеВидыПравДоступа;
КонецФункции
Функция ЛиСквознаяФайловаяСистемаКлиентаИСервера() Экспорт
#Если Не Клиент Тогда
ВызватьИсключение "Запрещнный вызов на сервере";
#КонецЕсли
Результат = ирСервер.ИмяКомпьютераЛкс() = ИмяКомпьютера();
Возврат Результат;
КонецФункции
#Если Клиент Тогда
// Постоянный список открытых форм подсистемы
Функция ОткрытыеФормыПодсистемыЛкс() Экспорт
ирПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
ирПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Результат = ирПлатформа.ОткрытыеФормыПодсистемы;
Если Результат = Неопределено Тогда
Результат = Новый Массив;
ирПлатформа.ОткрытыеФормыПодсистемы = Результат;
КонецЕсли;
#Если Сервер И Не Сервер Тогда
Результат.Добавить(ПолучитьФорму());
#КонецЕсли
Возврат Результат;
КонецФункции
// Временный список открытых форм. Они помещаются сюда обычно на несколько секунд - для определения, нужно ли добавлять их в историю.
//
// Возвращаемое значение:
// Соответствие -
//
Функция ОтслеживаемыеФормыЛкс() Экспорт
ирПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
ирПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Результат = ирПлатформа.ОтслеживаемыеФормы;
Если Результат = Неопределено Тогда
Результат = Новый Соответствие;
ирПлатформа.ОтслеживаемыеФормы = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПерехватКлавиатурыЛкс() Экспорт
Если Не ирКэш.ЛиПортативныйРежимЛкс() Тогда
Попытка
Результат = Вычислить("ирПерехватКлавиатуры");
Исключение
КонецПопытки;
КонецЕсли;
Если Результат = Неопределено Тогда
Результат = ирКэш.Получить().ПодключитьПерехватКлавиатуры(); // Тут будет обращение к ирОбщий
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЛиМодальностьЗапрещенаЛкс() Экспорт
Результат = Ложь;
Список = Новый СписокЗначений;
Попытка
Список.ВыбратьЭлемент();
Исключение
Результат = Истина;
КонецПопытки;
Возврат Результат;
КонецФункции
// Кэшируем форму, т.к. иначе при повторных вызовах в одном потоке кода каждый раз будет возвращаться новый экземпляр
Функция ОкноСообщенийЛкс(МодальнаяГруппа = 0) Экспорт
Если МодальнаяГруппа = 0 Тогда
#Если ТолстыйКлиентУправляемоеПриложение Тогда
//Форма = ПолучитьФорму("Обработка.ирПлатформа.Форма.ВременноеОкноСообщенийУпр",,, МодальнаяГруппа); // Так будет ошибка компиляции в портативном варианте в файловой базе
Форма = ирКлиент.ПолучитьФормуЛкс("Обработка.ирПлатформа.Форма.ВременноеОкноСообщенийУпр",,, МодальнаяГруппа);
#КонецЕсли
Иначе
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Форма = мПлатформа.ПолучитьФорму("СообщенияМодальнойГруппы",, МодальнаяГруппа);
КонецЕсли;
Возврат Форма;
КонецФункции
Функция ФормаСравнителяТекстовЛкс() Экспорт
Результат = ирКлиент.НоваяФормаСравнителяТекстовЛкс();
Возврат Результат;
КонецФункции
Функция ФормаОбщихКомандЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ФормаОбщихКомандЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Результат = мПлатформа.ПолучитьФорму("ОбщиеКоманды");
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ИмяШрифтаРедактораМодуляКонфигуратораЛкс() Экспорт
НастройкиКонфигуратора = ирОбщий.ПрочитатьТекстИзФайлаЛкс(ирКэш.КаталогИзданияПлатформыВПрофилеЛкс(Ложь) + ирОбщий.РазделительПутиКФайлуЛкс() + "1Cv8cmn.pfl");
ИмяШрифта = ирОбщий.ТекстМеждуМаркерамиЛкс(НастройкиКонфигуратора, "9cd510c8-abfc-11d4-9434-004095e12fc7", """SearchResultBackground""", Ложь);
ИмяШрифта = ирОбщий.ТекстМеждуМаркерамиЛкс(ИмяШрифта, """", """", Ложь);
Возврат ИмяШрифта;
КонецФункции
Функция ДоступенРедакторМонакоЛкс() Экспорт
Возврат Истина
И ирКэш.ЛиПлатформаWindowsЛкс()
И (Ложь
Или ирКэш.НомерВерсииПлатформыЛкс() >= 803018
Или (Истина
И ирКэш.НомерВерсииПлатформыЛкс() >= 803015
И ирКлиент.ЛиПерехватКлавиатурногоВводаЛкс()))
;
КонецФункции
Функция КоличествоСтрокВТаблицеБДЛкс(ПолноеИмяТаблицы) Экспорт
Результат = ирОбщий.КоличествоСтрокВТаблицеБДЛкс(ПолноеИмяТаблицы);
Возврат Результат;
КонецФункции
Функция ЛиДоступноВыполнениеКомандныхФайловЛкс(Знач ВыброситьИсключение = Ложь) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ЛиДоступноВыполнениеКомандныхФайловЛкс");
КлючНаборПараметров = "" + ВыброситьИсключение;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Если Не ирКэш.ЛиПлатформаWindowsЛкс() Тогда
Результат = Истина;
Иначе
Файл = ПолучитьИмяВременногоФайла("bat");
Маркер = Новый УникальныйИдентификатор;
Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст("echo " + Маркер);
Текст.Записать(Файл, КодировкаТекста.ANSI);
Результат = ирОбщий.ВыполнитьКомандуОСЛкс(Файл);
Результат = Найти(Результат, Маркер) > 0;
Если Не Результат Тогда
ирОбщий.СообщитьЛкс("Пользователю ОС недоступно выполнение командных файлов (bat). Выполнение некоторых операций будет замедлено или невозможно!", СтатусСообщения.Внимание,, Истина);
КонецЕсли;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
// Нельзя звать напрямую, т.к. текст модуля может быть неактуален!
// Вместо этого надо звать ирПлатформа.ПолеТекстаМодуля()
// Параметры:
// ИмяМодуля - Строка -
// ТекстФайла - Строка -
// Возвращаемое значение:
// ОбработкаОбъект.ирКлсПолеТекстаПрограммы -
Функция ПолеТекстаМодуляЛкс(ИмяМодуля) Экспорт
ПолеТекстаМодуля = ирКэш.ПолеТекстаМодуляБезСтруктурыТипаЛкс(ИмяМодуля);
ПолеТекстаМодуля.УстановитьТекст(,,,,, СтрЗаменить(ИмяМодуля, "\", " "));
Возврат ПолеТекстаМодуля;
КонецФункции
// Нельзя звать напрямую, т.к. текст модуля может быть неактуален!
// Параметры:
// ИмяМодуля - Строка -
// ТекстФайла - Строка -
// Возвращаемое значение:
// ОбработкаОбъект.ирКлсПолеТекстаПрограммы -
Функция ПолеТекстаМодуляБезСтруктурыТипаЛкс(ИмяМодуля) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПолеТекстаМодуляБезСтруктурыТипаЛкс");
КлючНаборПараметров = ИмяМодуля;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
ПолеТекстаМодуля = ирОбщий.НовыйАнализаторКодаЛкс();
#Если Сервер И Не Сервер Тогда
ПолеТекстаМодуля = Обработки.ирКлсПолеТекстаПрограммы.Создать();
#КонецЕсли
ПолеТекстаМодуля.ИнициироватьНеинтерактивно();
ПолеТекстаМодуля.СлужебноеПолеТекстаДолгое = ПолеТекстаМодуля.ПолеТекста.ЭлементФормы;
ФайлМодуля = Получить().ФайлМодуляИзИмениМодуля(ИмяМодуля);
Если ФайлМодуля.Существует() Тогда
ПолеТекстаМодуля.ПрочитатьТекстИзФайлаБезМетаданных(ФайлМодуля.ПолноеИмя);
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат ПолеТекстаМодуля;
КонецФункции
Функция КодыКлавишЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КодыКлавишЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Таблица = ирОбщий.ТаблицаЗначенийИзТабличногоДокументаЛкс(ирКэш.Получить().ПолучитьМакет("КодыКлавиш"));
Результат = Новый Соответствие();
Для Каждого Строка Из Таблица Цикл
Результат.Вставить(Строка.Ключ, Строка.Значение);
КонецЦикла;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолеТекстаПрограммы(Знач ЯзыкПрограммы = 0) Экспорт
Результат = ирКэш.Получить().ПолеТекстаПрограммы(ЯзыкПрограммы);
Возврат Результат;
КонецФункции
// Первым элементом всегда идет Неопределено, обозначающий саму конфигурацию.
Функция РасширенияКонфигурацииЛкс(ТолькоАктивные = Истина) Экспорт
Результат = Новый Соответствие;
Если ирКэш.НомерРежимаСовместимостиЛкс() >= 803010 Тогда
РасширенияКонфигурацииМои = Вычислить("РасширенияКонфигурации");
#Если Сервер И Не Сервер Тогда
РасширенияКонфигурацииМои = РасширенияКонфигурации;
#КонецЕсли
Для Каждого РасширениеКонфигурации Из РасширенияКонфигурацииМои.Получить() Цикл
#Если Сервер И Не Сервер Тогда
РасширениеКонфигурации = РасширенияКонфигурации.Создать();
#КонецЕсли
Активность = Истина;
Если ТолькоАктивные И ирКэш.НомерРежимаСовместимостиЛкс() >= 803012 Тогда
Активность = РасширениеКонфигурации.Активно;
КонецЕсли;
Результат.Вставить(РасширениеКонфигурации, Активность);
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЛиВКонфигурацииЕстьМеханизмЗаменыЗапросовПустышекЛкс() Экспорт
Результат = ирСервер.ЛиВКонфигурацииЕстьМеханизмЗаменыЗапросовПустышекЛкс();
Возврат Результат;
КонецФункции
#КонецЕсли
#КонецЕсли
Функция СоединениеЭтойСУБД() Экспорт
Результат = ирОбщий.СоединениеЭтойСУБД();
Если Результат = Неопределено Тогда
ВызватьИсключение "Ошибка соединения с СУБД";
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЛиПортативныйРежимЛкс() Экспорт
//Попытка
// Пустышка = ирПортативный.мВнешниеМодули;
// Результат = Истина;
//Исключение
// Результат = Ложь;
//КонецПопытки;
Результат = ТипЗнч(ирПортативный) <> Тип("ОбщийМодуль");
Возврат Результат;
КонецФункции
Функция ЛиСеансТолстогоКлиентаЛкс() Экспорт
#Если ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
Результат = Истина;
#ИначеЕсли Сервер Тогда
ТекущийСеанс = ирКэш.ТекущийСеансЛкс();
Результат = ирОбщий.СтрокиРавныЛкс(ТекущийСеанс.ИмяПриложения, "1CV8");
#Иначе
Результат = Ложь;
#КонецЕсли
Возврат Результат;
КонецФункции
Функция ЛиСеансТонкогоКлиентаЛкс() Экспорт
#Если ТонкийКлиент Тогда
Результат = Истина;
#ИначеЕсли Сервер Тогда
ТекущийСеанс = ирКэш.ТекущийСеансЛкс();
Результат = ирОбщий.СтрокиРавныЛкс(ТекущийСеанс.ИмяПриложения, "1CV8C");
#Иначе
Результат = Ложь;
#КонецЕсли
Возврат Результат;
КонецФункции
// В параметрах конфигуратора "Модули/Проверка" отсутствует флажок "Толстый клиент (УП)". Поэтому проверка компиляции не выполняется.
// Поэтому вместо инструкций препроцессора по возможности надо использовать это проверку.
// https://partners.v8.1c.ru/forum/topic/1996623
Функция ЛиСеансТолстогоКлиентаУПЛкс() Экспорт
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Результат = Истина;
#Иначе
Результат = Ложь;
#КонецЕсли
Возврат Результат;
КонецФункции
Функция ЛиПлатформаLinuxЛкс() Экспорт
//Возврат Истина; // Для отладки
СисИнфо = Новый СистемнаяИнформация;
Результат = Ложь
Или СисИнфо.ТипПлатформы = ТипПлатформы.Linux_x86
Или СисИнфо.ТипПлатформы = ТипПлатформы.Linux_x86_64;
Возврат Результат;
КонецФункции
Функция ЛиПлатформаWindowsЛкс() Экспорт
//Возврат Ложь; // Для отладки
СисИнфо = Новый СистемнаяИнформация;
Результат = Ложь
Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86
Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64;
Возврат Результат;
КонецФункции
Функция ДоступныРегВыраженияЛкс() Экспорт
Результат = Ложь
Или ирКэш.НомерВерсииПлатформыЛкс() >= 803006
#Если Клиент Тогда
Или ирКэш.ЛиПлатформаWindowsЛкс()
#КонецЕсли
;
Возврат Результат;
КонецФункции
Функция ДоступенJSONЛкс() Экспорт
Результат = ирКэш.НомерВерсииПлатформыЛкс() >= 803006;
Возврат Результат;
КонецФункции
Функция ДоступноСхемаЗапросаЛкс(Знач РасширенныеФункции = Ложь) Экспорт
Результат = Истина
И ирКэш.НомерВерсииПлатформыЛкс() >= 803005
И (Ложь
Или Не РасширенныеФункции
Или ирКэш.НомерРежимаСовместимостиЛкс() > 803010 // Антибаг схемы запроса https://www.hostedredmine.com/issues/959039
);
Возврат Результат;
КонецФункции
Функция ДоступныТаблицыКонстантЛкс() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Результат = ирКэш.НомерРежимаСовместимостиЛкс() >= 802016; // Здесь точно минимальная версия уже. Не трогать!
Возврат Результат;
КонецФункции
// Метка_9в6676вап6438о
Функция Это64битныйПроцессЛкс() Экспорт
СисИнфо = Новый СистемнаяИнформация;
Результат = Ложь
Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64
Или СисИнфо.ТипПлатформы = ТипПлатформы.Linux_x86_64
Или ирКэш.НомерВерсииПлатформыЛкс() > 803001 И СисИнфо.ТипПлатформы = ТипПлатформы.MacOS_x86_64; // Появилось в 8.3
Возврат Результат;
КонецФункции
Функция ИмяКолонкиНомерСтрокиЛкс() Экспорт
ИмяКолонкиНомерСтроки = "НомерСтроки" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
Возврат ИмяКолонкиНомерСтроки;
КонецФункции
Функция ЛиФайловаяБазаЛкс(СтрокаСоединенияБазы = "") Экспорт
Если Не ЗначениеЗаполнено(СтрокаСоединенияБазы) Тогда
СтрокаСоединенияБазы = СтрокаСоединенияИнформационнойБазы();
КонецЕсли;
ФайловыйКаталог = НСтр(СтрокаСоединенияБазы, "File");
ЭтоФайловаяБаза = Не ПустаяСтрока(ФайловыйКаталог);
Возврат ЭтоФайловаяБаза;
КонецФункции
Функция СтрокаСоединенияСервераЛкс() Экспорт
Результат = ирСервер.СтрокаСоединенияСервераЛкс();
Возврат Результат;
КонецФункции
Функция КартинкаПоИмениЛкс(Имя) Экспорт
#Если Сервер И Не Сервер Тогда
ирПортативный = Обработки.ирПортативный.Создать();
#КонецЕсли
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КартинкаПоИмениЛкс");
КлючНаборПараметров = "" + Имя;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый Картинка;
Если Не ЗначениеЗаполнено(Имя) Тогда
// Антибаг платформы 8.3.21 https://www.hostedredmine.com/issues/947012
Иначе
Попытка
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
Результат = ирПортативный.КартинкаПоИмениЛкс(Имя);
Иначе
Результат = БиблиотекаКартинок[Имя];
КонецЕсли;
Исключение
ОписаниеОшибки = ОписаниеОшибки(); // Для отладки
КонецПопытки;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЭтоТолстыйКлиентЛкс() Экспорт
#Если ТонкийКлиент Или ВебКлиент Или МобильныйКлиент Тогда
Результат = Ложь;
#Иначе
Результат = Истина;
#КонецЕсли
Возврат Результат;
КонецФункции
Функция ДоступенБраузерWebKitЛкс() Экспорт
Возврат ирКэш.НомерВерсииПлатформыЛкс() >= 803014;
КонецФункции
Функция ДоступенРежимИспользованияСинхронныхВызововЛкс() Экспорт
Возврат ирКэш.НомерВерсииПлатформыЛкс() >= 803008;
КонецФункции
Функция ЛиОтладкаРазрешенаЛкс() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
#Если Клиент Тогда
//ОтладкаРазрешена = мПлатформа.ИдентификаторыПроцессовОтладчиков().Количество() > 0;
ОтладкаРазрешена = ЗначениеЗаполнено(мПлатформа.ПортДляПодключенияОтладчика());
#Иначе
ОтладкаРазрешена = Не ирОбщий.СтрокиРавныЛкс(ирОбщий.РежимОтладкиСервераИзКоманднойСтрокиЛкс(), "нет");
#КонецЕсли
Возврат ОтладкаРазрешена;
КонецФункции
#Если Сервер И Не Сервер Тогда
ирПортативный = Обработки.ирПортативный.Создать();
#КонецЕсли