RDT1C/CommonModules/ирКэш/Ext/Module.bsl
Администратор 8319aac19b .
2021-09-04 16:05:11 +03:00

1816 lines
110 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//ирПортативный Перем ирПлатформа Экспорт; // Эта переменная нужна только здесь
//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
#Если Не ТонкийКлиент И Не ВебКлиент И Не МобильныйКлиент Тогда
Функция Получить() Экспорт
// Не следует использовать для хранения таких данных, переинициализация которых автоматически невозможна или приведет к ошибкам
Попытка
ирПлатформа = Вычислить("ирПлатформа");
Исключение
КонецПопытки;
Если ирПлатформа = Неопределено Тогда
//ирСервер.СтрокаСоединенияСервераЛкс(); // http://www.hostedredmine.com/issues/851201
ирПлатформа = ирОбщий.СоздатьОбъектПоПолномуИмениМетаданныхЛкс("Обработка.ирПлатформа");
#Если Сервер И Не Сервер Тогда
ирПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
КонецЕсли;
Возврат ирПлатформа;
КонецФункции
Функция ИмяПродукта() Экспорт
Возврат "ИнструментыРазработчикаTormozit";
КонецФункции
Функция КомпоновщикТаблицыМетаданныхЛкс(Знач ПолноеИмяМД, ВызыватьИсключениеПриОтсутствииПрав = Истина, ИндексПараметраПериодичность = Неопределено,
ВыражениеПараметраПериодичность = "", ИменаВместоПредставлений = Ложь) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КомпоновщикТаблицыМетаданныхЛкс");
КлючНаборПараметров = "" + ПолноеИмяМД + ";" + ВызыватьИсключениеПриОтсутствииПрав + ";" + ИндексПараметраПериодичность + ";" + ВыражениеПараметраПериодичность
+ ";" + ИменаВместоПредставлений;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
КомпоновщикНастроек = ирОбщий.КомпоновщикТаблицыМетаданныхЛкс(ПолноеИмяМД, ВызыватьИсключениеПриОтсутствииПрав, ИндексПараметраПериодичность, ВыражениеПараметраПериодичность, ИменаВместоПредставлений);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = КомпоновщикНастроек;
КонецЕсли;
Возврат КомпоновщикНастроек;
КонецФункции
Функция ПоляТаблицыБДЛкс(ПолноеИмяТаблицыБД, _ВызыватьИсключениеПриОтсутствииПрав = Истина, ИндексПараметраПериодичность = Неопределено, ВыражениеПараметраПериодичность = "") Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПоляТаблицыБДЛкс");
КлючНаборПараметров = "" + ПолноеИмяТаблицыБД + ";" + _ВызыватьИсключениеПриОтсутствииПрав + ";" + ИндексПараметраПериодичность + ";" + ВыражениеПараметраПериодичность;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = ирОбщий.ПоляТаблицыБДЛкс(ПолноеИмяТаблицыБД, _ВызыватьИсключениеПриОтсутствииПрав, ИндексПараметраПериодичность, ВыражениеПараметраПериодичность);
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ИндивидуальныеТаблицыКонстантДоступныЛкс() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Результат = ирКэш.НомерРежимаСовместимостиЛкс() >= 802016; // Здесь точно минимальная версия уже. Не трогать!
Возврат Результат;
КонецФункции
Функция ПараметрыСеансаЛкс() Экспорт
Результат = Новый Структура("ПереданныйКэш");
Возврат Результат;
КонецФункции
Функция ТаблицаВсехТаблицБДЛкс() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ТаблицаВсехТаблицБД = мПлатформа.ТаблицаВсехТаблицБД();
Возврат ТаблицаВсехТаблицБД;
КонецФункции
Функция ДеревоОбъектовМДЛкс() Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ТаблицаВсехТаблицБД = мПлатформа.ДеревоОбъектовМД();
Возврат ТаблицаВсехТаблицБД;
КонецФункции
Функция ЛиЭтоРасширениеКонфигурацииЛкс() Экспорт
Расширение = ирКэш.ЭтотРасширениеКонфигурацииЛкс();
#Если Сервер И Не Сервер Тогда
Расширение = РасширенияКонфигурации.Создать();
#КонецЕсли
Результат = Истина
И Расширение <> Неопределено
И (Ложь
Или ирКэш.НомерВерсииПлатформыЛкс() < 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.5+
Функция ДоступныВидыСравненияПодобноШаблонЛкс() Экспорт
Результат = ирКэш.НомерВерсииПлатформыЛкс() >= 803005;
Возврат Результат;
КонецФункции
Функция НомерРежимаСовместимостиЛкс() Экспорт
ТекущийРежимСовместимости = Метаданные.РежимСовместимости;
Если ТекущийРежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
СисИнфо = Новый СистемнаяИнформация;
Фрагменты = ирОбщий.СтрРазделитьЛкс(СисИнфо.ВерсияПриложения,,, Ложь); // Защита от рекурсии!
Иначе
// Пример значения СтрокаВерсии = Версия8_3_1
ТекущийРежимСовместимости = СтрЗаменить(ТекущийРежимСовместимости, "Версия", "");
ТекущийРежимСовместимости = СтрЗаменить(ТекущийРежимСовместимости, "Version", ""); // Вариант встроенного языка Английский
Фрагменты = ирОбщий.СтрРазделитьЛкс(ТекущийРежимСовместимости, "_",, Ложь); // Защита от рекурсии!
КонецЕсли;
Результат = Число(Фрагменты[0]) * 100 * 1000 + Число(Фрагменты[1]) * 1000;
Если Фрагменты.Количество() > 2 Тогда
Результат = Результат + Число(Фрагменты[2]);
КонецЕсли;
Возврат Результат;
КонецФункции
// Например 8.2, 8.3
Функция НомерИзданияПлатформыЛкс() Экспорт
СисИнфо = Новый СистемнаяИнформация;
Фрагменты = ирОбщий.СтрРазделитьЛкс(СисИнфо.ВерсияПриложения);
Результат = Фрагменты[0] + Фрагменты[1];
Возврат Результат;
КонецФункции
Функция НомерВерсииПлатформыЛкс(ВключаяНомерСборки = Ложь) Экспорт
СисИнфо = Новый СистемнаяИнформация;
СтрокаВерсии = СисИнфо.ВерсияПриложения;
Результат = ирОбщий.НомерВерсииПлатформыЛкс(СтрокаВерсии, ВключаяНомерСборки);
Возврат Результат;
КонецФункции
Функция НомерВерсииPowerShellЛкс() Экспорт
ТекстСкрипта = Новый ТекстовыйДокумент;
ТекстСкрипта.УстановитьТекст("$PSVersionTable.PSVersion.major");
ФайлСкрипта = Новый Файл(ПолучитьИмяВременногоФайла("ps1"));
ТекстСкрипта.Записать(ФайлСкрипта.ПолноеИмя);
СтрокаЗапуска = ирОбщий.КомандаСистемыЗапускаСкриптаPowerShellЛкс(ФайлСкрипта.Имя);
РезультатКоманды = ирОбщий.ВыполнитьКомандуОСЛкс(СтрокаЗапуска);
Результат = Число(РезультатКоманды);
Возврат Результат;
КонецФункции
Функция ВерсияБСПЛкс() Экспорт
УстановитьПривилегированныйРежим(Истина);
Если Истина
И Метаданные.РегистрыСведений.Найти("ВерсииПодсистем") <> Неопределено
И ПравоДоступа("Чтение", Метаданные.РегистрыСведений.ВерсииПодсистем)
Тогда
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| ВерсииПодсистем.Версия КАК Версия
|ИЗ
| РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем
|ГДЕ
| ВерсииПодсистем.ИмяПодсистемы = &ИмяПодсистемы
|";
Запрос.УстановитьПараметр("ИмяПодсистемы", "СтандартныеПодсистемы");
Таблица = Запрос.Выполнить().Выгрузить();
Если Таблица.Количество() > 0 Тогда
ВерсияБСП = Таблица[0].Версия;
КонецЕсли;
КонецЕсли;
Возврат ВерсияБСП;
КонецФункции
Функция НомерВерсииБСПЛкс() Экспорт
ВерсияБСП = ирКэш.ВерсияБСПЛкс();
Если ЗначениеЗаполнено(ВерсияБСП) Тогда
Фрагменты = ирОбщий.СтрРазделитьЛкс(ВерсияБСП);
Результат = Число(Фрагменты[0]) * 100 + Число(Фрагменты[1]);
Иначе
Результат = 0;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЭталонныйНаборЗаписейЛкс(Знач ПолноеИмяТаблицыБД) Экспорт
#Если Сервер И Не Клиент Тогда
ОбъектыНаСервере = Ложь;
#Иначе
ОбъектыНаСервере = "Обязательно";
#КонецЕсли
НаборЗаписей = ирОбщий.СоздатьНаборЗаписейПоИмениТаблицыБДЛкс(ПолноеИмяТаблицыБД, ОбъектыНаСервере).Методы;
Возврат НаборЗаписей;
КонецФункции
// Параметры:
// Локальный - Булево - При Истина будет Local, иначе - Roaming
Функция КаталогИзданияПлатформыВПрофилеЛкс(Локальный = Истина, Знач ИзданиеПлатформы = "") Экспорт
КаталогДанныхПриложения = КаталогПлатформыВПрофилеЛкс(Локальный);
Если Не ЗначениеЗаполнено(ИзданиеПлатформы) Тогда
ИзданиеПлатформы = ирКэш.НомерИзданияПлатформыЛкс();
КонецЕсли;
Если ИзданиеПлатформы > "82" Тогда
Суффикс = Лев(ИзданиеПлатформы, 1);
Иначе
Суффикс = ИзданиеПлатформы;
КонецЕсли;
Разделитель = ирОбщий.РазделительПутиКФайлуЛкс();
КаталогДанныхПриложения = КаталогДанныхПриложения + Разделитель + "1cv" + Суффикс;
ФайлПеренаправления = Новый Файл(КаталогДанныхПриложения + Разделитель + "location.cfg");
Если ФайлПеренаправления.Существует() Тогда
ЧтениеТекста = Новый ЧтениеТекста;
ЧтениеТекста.Открыть(ФайлПеренаправления.ПолноеИмя);
СтрокаФайла = ЧтениеТекста.ПрочитатьСтроку();
НовыйКаталог = НСтр(СтрокаФайла, "location");
Если ЗначениеЗаполнено(НовыйКаталог) Тогда
Если Разделитель = "\" Тогда
КаталогДанныхПриложения = СтрЗаменить(НовыйКаталог, "/", Разделитель);
Иначе
КаталогДанныхПриложения = СтрЗаменить(НовыйКаталог, "\", Разделитель);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат КаталогДанныхПриложения;
КонецФункции
Функция КаталогПлатформыВПрофилеЛкс(Знач Локальный = Ложь) Экспорт
Если Не ирКэш.ЛиПлатформаWindowsЛкс() Тогда
//КаталогДанныхПриложения = "~/.1cv8"; // Похоже так можно только в bash. Ошибка доступа к файлу '~'. 13(0x0000000D): Permission denied
#Если Клиент Тогда
Если Локальный Тогда
Подкаталог = ".1cv8" + ирОбщий.РазделительПутиКФайлуЛкс() + "1C";
Иначе
Подкаталог = ".1C";
КонецЕсли;
КаталогДанныхПриложения = "/home/" + ирКэш.ТекущийПользовательОСЛкс(Ложь) + "/" + Подкаталог;
#Иначе
КаталогДанныхПриложения = КаталогВременныхФайлов();
#КонецЕсли
Иначе
Если Локальный Тогда
Подкаталог = 28;
Иначе
Подкаталог = 26;
КонецЕсли;
ПриложениеОболочкиОС = Новый COMobject("Shell.Application");
КаталогДанныхПриложения = ПриложениеОболочкиОС.NameSpace(Подкаталог).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");
Возврат ПеременныеОкружения;
КонецФункции
Функция ПараметрыЗаписиОбъектовЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ПараметрыЗаписиОбъектовЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый Структура("БезАвторегистрацииИзменений, ОбъектыНаСервере, ДополнительныеСвойства, ОтключатьКонтрольЗаписи, НеИспользоватьИмитаторыОбъектовДанных, ПривилегированныйРежим, ОтключатьЗаписьВерсии");
Результат.БезАвторегистрацииИзменений = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.БезАвторегистрацииИзменений");
Результат.ОбъектыНаСервере = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ОбъектыНаСервере");
Если Результат.ОбъектыНаСервере = Неопределено Тогда
Результат.ОбъектыНаСервере = ирОбщий.ПолучитьРежимОбъектыНаСервереПоУмолчаниюЛкс();
КонецЕсли;
Результат.НеИспользоватьИмитаторыОбъектовДанных = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.НеИспользоватьИмитаторыОбъектовДанных");
Если Результат.НеИспользоватьИмитаторыОбъектовДанных = Неопределено Тогда
Результат.НеИспользоватьИмитаторыОбъектовДанных = ирОбщий.ВосстановитьЗначениеЛкс("НеИспользоватьИмитаторыОбъектовДанных");
Если Результат.НеИспользоватьИмитаторыОбъектовДанных = Неопределено Тогда
Результат.НеИспользоватьИмитаторыОбъектовДанных = Ложь;
КонецЕсли;
КонецЕсли;
Результат.ДополнительныеСвойства = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ДополнительныеСвойства");
Если Результат.ДополнительныеСвойства = Неопределено Тогда
Результат.ДополнительныеСвойства = Новый ТаблицаЗначений;
КонецЕсли;
Результат.ОтключатьКонтрольЗаписи = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ОтключатьКонтрольЗаписи");
Если Результат.ОтключатьКонтрольЗаписи = Неопределено Тогда
Результат.ОтключатьКонтрольЗаписи = Ложь;
КонецЕсли;
Результат.ОтключатьЗаписьВерсии = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ОтключатьЗаписьВерсии");
Если Результат.ОтключатьЗаписьВерсии = Неопределено Тогда
Результат.ОтключатьЗаписьВерсии = Ложь;
КонецЕсли;
Результат.ПривилегированныйРежим = ирОбщий.ВосстановитьЗначениеЛкс("ирПараметрыЗаписиОбъектов.ПривилегированныйРежим");
Если Результат.ПривилегированныйРежим = Неопределено Тогда
Результат.ПривилегированныйРежим = Ложь;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПервыйПроизводныйТипРегистраЛкс(Знач Подтип) Экспорт
ТипОбразец = Неопределено;
КоллекцииМетаданных = Новый Массив;
КоллекцииМетаданных.Добавить(Метаданные.РегистрыСведений);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыНакопления);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыБухгалтерии);
КоллекцииМетаданных.Добавить(Метаданные.РегистрыРасчета);
КоллекцииМетаданных.Добавить(Метаданные.Последовательности);
Для Каждого КоллекцияМетаданных Из КоллекцииМетаданных Цикл
Для Каждого МетаРегистр Из КоллекцияМетаданных Цикл
ИмяТипа = СтрЗаменить(МетаРегистр.ПолноеИмя(), ".", Подтип + ".");
Попытка
ТипОбразец = Тип(ИмяТипа);
Исключение
Продолжить;
КонецПопытки;
Прервать;
КонецЦикла;
Если ТипОбразец <> Неопределено Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ТипОбразец;
КонецФункции // ЛиМенеджерЗаписиРегистраЛкс()
Функция КлючБазыВСпискеПользователяИзКоманднойСтрокиЛкс() Экспорт
Если ирОбщий.ЛиИдентификацияБазыВСпискеПоНаименованиюЛкс() Тогда
Если Не ирКэш.ЛиДоступныРегВыраженияЛкс() Тогда
Результат = Неопределено;
Иначе
КоманднаяСтрокаПроцесса = ирКэш.КоманднаяСтрокаТекущегоПроцессаОСЛкс();
ВычислительРегВыражений = ирОбщий.НовыйВычислительРегВыражений();
ВычислительРегВыражений.IgnoreCase = Истина;
ВычислительРегВыражений.Global = Истина;
ВычислительРегВыражений.Pattern = "(?:/IBName\s*(""((.|"""")+?)""|(((.)+?))))\s*( /|$)";
Вхождения = ВычислительРегВыражений.НайтиВхождения(КоманднаяСтрокаПроцесса);
Если Вхождения.Количество() > 0 Тогда
Результат = Вхождения[0].SubMatches(0);
Если Лев(Результат, 1) = """" Тогда
Результат = Вычислить(Результат);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
Результат = СтрокаСоединенияИнформационнойБазы();
КонецЕсли;
Возврат Результат;
КонецФункции
Функция НастройкиБазыНаКлиентеЛкс() Экспорт
ТаблицаБазКлиента = ирОбщий.ПолучитьСписокБазПользователяОСЛкс();
#Если Сервер И Не Сервер Тогда
ТаблицаБазКлиента = Обработки.ирПлатформа.Создать().СписокБазПользователя;
#КонецЕсли
КлючомЯвляетсяСтрокаСоединения = Ложь;
КлючБазыВСпискеПользователя = ирОбщий.КлючБазыВСпискеПользователяЛкс(КлючомЯвляетсяСтрокаСоединения);
Если КлючомЯвляетсяСтрокаСоединения Тогда
ИмяКлюча = "НСтрокаСоединения";
Иначе
ИмяКлюча = "КлючСтроки";
КонецЕсли;
СтрокаТекущейБазы = ТаблицаБазКлиента.Найти(НРег(КлючБазыВСпискеПользователя), ИмяКлюча);
Возврат СтрокаТекущейБазы;
КонецФункции
Функция АбсолютныйЦветЛкс(Знач ИсходныйЦвет) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("АбсолютныйЦветЛкс");
КлючНаборПараметров = "" + ИсходныйЦвет;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
#Если Сервер И Не Сервер Тогда
ИсходныйЦвет = Новый Цвет;
#КонецЕсли
ИсходныйЦвет = ЗначениеИзСтрокиВнутр(ИсходныйЦвет);
Если ИсходныйЦвет.Вид = ВидЦвета.Абсолютный Тогда
Возврат ИсходныйЦвет;
КонецЕсли;
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803001 Тогда
// Способ без операций вывода https://infostart.ru/public/1278131/
ФорматДок = Новый ФорматированныйДокумент;
ФорматДок.УстановитьФорматированнуюСтроку(Вычислить("Новый ФорматированнаяСтрока("" "", , ИсходныйЦвет)")); // На 8.2 нет типа ФорматированнаяСтрока
ТекстHTML = "";
ФорматДок.ПолучитьHTML(ТекстHTML, Неопределено);
ПозицияЧислаHEX = Найти(ТекстHTML, "#") + 1;
ЧислоHEX = Сред(ТекстHTML, ПозицияЧислаHEX, 6);
Результат = ирОбщий.ЧислоHEXВЦветЛкс(ЧислоHEX);
Иначе
Если ирКэш.ЭтоУчебнаяПлатформаЛкс() Тогда
Результат = ИсходныйЦвет;
Иначе
ВременныйФайл = ПолучитьИмяВременногоФайла("mxl");
ТабДок = Новый ТабличныйДокумент;
ТабДок.Область("R1C1").ЦветФона = ИсходныйЦвет;
ТабДок.Записать(ВременныйФайл, ТипФайлаТабличногоДокумента.MXL7); // В учебной версии платформы это запрещено https://www.hostedredmine.com/issues/923942
ТабДок.Прочитать(ВременныйФайл);
Результат = ТабДок.Область("R1C1").ЦветФона;
КонецЕсли;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция КартинкаИнструментаЛкс(ПолноеИмя) Экспорт
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
мПлатформа.ЗаполнитьСписокИнструментов();
СтрокаИнструмента = мПлатформа.СписокИнструментов.Найти(ПолноеИмя, "ПолноеИмя");
Если СтрокаИнструмента <> Неопределено Тогда
Результат = ирКэш.КартинкаПоИмениЛкс(СтрокаИнструмента.ИмяКартинки);
Иначе
Результат = Новый Картинка;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ТипыРасширенийКонфигурацииЛкс(Знач ИмяКлассаМетаданных = Неопределено) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ТипыРасширенийКонфигурацииЛкс");
КлючНаборПараметров = "" + ИмяКлассаМетаданных;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
РасширенияКонфигурацииЛ = Вычислить("РасширенияКонфигурации");
#Если Сервер И Не Сервер Тогда
РасширенияКонфигурацииЛ = РасширенияКонфигурации;
#КонецЕсли
ВсеРасширения = РасширенияКонфигурацииЛ.Получить();
Если Ложь
Или ВсеРасширения.Количество() > 1
Или (Не ирКэш.ЛиЭтоРасширениеКонфигурацииЛкс() И ВсеРасширения.Количество() > 0)
Тогда
//// Медленный способ. Необходимость обусловлена отсутствием типов расширений конфигурации в супертипе ЛюбаяСсылка https://partners.v8.1c.ru/forum/t/1823711/m/1823711
//ТаблицаВсехТаблицБД = ирКэш.ТаблицаВсехТаблицБДЛкс();
//#Если Сервер И Не Сервер Тогда
// РасширенияКонфигурацииЛ = РасширенияКонфигурации;
// ТаблицаВсехТаблицБД = Новый ТаблицаЗначений;
//#КонецЕсли
//ВсеТипыСсылок = ТаблицаВсехТаблицБД.ВыгрузитьКолонку("ТипСсылки");
//Результат = Новый ОписаниеТипов(ВсеТипыСсылок);
Результат = Новый Массив;
ТаблицаТиповМетаОбъектов = ирКэш.ТипыМетаОбъектов(Ложь, Ложь, Ложь);
Для Каждого СтрокаМетаТипа Из ТаблицаТиповМетаОбъектов Цикл
Если Ложь
Или (Истина
И ЗначениеЗаполнено(ИмяКлассаМетаданных)
И СтрокаМетаТипа.Единственное <> ИмяКлассаМетаданных)
Или Не ирОбщий.ЛиКорневойТипСсылкиЛкс(СтрокаМетаТипа.Единственное)
Тогда
Продолжить;
КонецЕсли;
Для Каждого МетаОбъект Из Метаданные[СтрокаМетаТипа.Множественное] Цикл
Если МетаОбъект.РасширениеКонфигурации() <> Неопределено Тогда
Результат.Добавить(Тип(ирОбщий.ИмяТипаИзПолногоИмениМДЛкс(МетаОбъект)));
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция СостояниеПодготовкиКэшМДСеансаЛкс() Экспорт
Если Ложь
#Если Не Клиент И Сервер Тогда
Или Истина
#КонецЕсли
Или ЭтоФоновоеЗаданиеЛкс()
//Или Не ирОбщий.ЛиАсинхронностьДоступнаЛкс() // Этот способ более жесткий, а в этом фоновом задании права на объекты подсистемы пока не нужны. Поэтому пока не будет его применять
//
Или ирКэш.ЛиПортативныйРежимЛкс()
Или ирКэш.ЛиФайловаяБазаЛкс()
Тогда
Возврат Неопределено;
КонецЕсли;
// Антибаг 8.3.16- В обычном приложении в клиент-серверном режиме из временного хранилища иногда возвращается Неопределено https://partners.v8.1c.ru/forum/t/1768363/m/1768363, http://www.hostedredmine.com/issues/884756
ФормаРезультата = ирОбщий.НоваяФормаРезультатаФоновогоЗаданияЛкс();
АдресРезультата = ПоместитьВоВременноеХранилище(Неопределено, ФормаРезультата.УникальныйИдентификатор);
ПараметраЗадания = Новый Массив(1);
ПараметраЗадания[0] = АдресРезультата;
ирОбщий.ДобавитьТекущемуПользователюРолиИРЛкс();
#Если Сервер И Не Сервер Тогда
ирОбщий.КэшМДСеансаВФонеЛкс();
#КонецЕсли
ФоновоеЗадание = ФоновыеЗадания.Выполнить("ирОбщий.КэшМДСеансаВФонеЛкс", ПараметраЗадания,, "Подготовка кэша метаданных сеанса (ИР)");
Результат = Новый Структура;
Результат.Вставить("ИдентификаторЗадания", ФоновоеЗадание.УникальныйИдентификатор);
Результат.Вставить("АдресРезультата", АдресРезультата);
Результат.Вставить("ФормаРезультата", ФормаРезультата);
Возврат Результат;
КонецФункции
// Кэширование в 100 раз ускоряет повторный поиск
Функция ОбъектМДПоПолномуИмениЛкс(ПолноеИмяМД) Экспорт
Если Найти(ПолноеИмяМД, ".") = 0 Тогда
// https://www.hostedredmine.com/issues/890489
Возврат Неопределено;
КонецЕсли;
Возврат Метаданные.НайтиПоПолномуИмени(ПолноеИмяМД);
КонецФункции
Функция ИмяТаблицыИзМетаданныхЛкс(Знач ОбъектИлиИмяМД, ЛиТаблицаИзменений = Ложь, ЛиДвиженияССубконтоДляРегистраБухгалтерии = Истина, ТолькоРазрешенные = Ложь) Экспорт
//Если ТипЗнч(ОбъектИлиИмяМД) <> Тип("Строка") Тогда
// ПолноеИмя = ОбъектИлиИмяМД.ПолноеИмя();
//Иначе
ПолноеИмя = ОбъектИлиИмяМД;
//КонецЕсли;
Фрагменты = ирОбщий.СтрРазделитьЛкс(ПолноеИмя);
Если ТолькоРазрешенные Тогда
Если ТипЗнч(ОбъектИлиИмяМД) = Тип("Строка") Тогда
Если Фрагменты.Количество() > 1 Тогда
ОбъектМД = ирКэш.ОбъектМДПоПолномуИмениЛкс(Фрагменты[0] + "." + Фрагменты[1]); // очень долгая операция, поэтому лучше не устанавливать флаг ТолькоРазрешенные
Иначе
//ОбъектМД = Метаданные[Фрагменты[0]];
ОбъектМД = Неопределено;
КонецЕсли;
Иначе
ОбъектМД = ОбъектИлиИмяМД;
КонецЕсли;
Если Истина
И ОбъектМД <> Неопределено
И Не ПравоДоступа("Чтение", ОбъектМД)
Тогда
Возврат Неопределено;
КонецЕсли;
КонецЕсли;
Если Истина
И Фрагменты.Количество() = 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, "Подсистема", , "Подсистемы", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "РегламентноеЗадание", , "РегламентныеЗадания", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Роль", , "Роли", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Стиль", , "Стили", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ФункциональнаяОпция", ,"ФункциональныеОпции", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ХранилищеНастроек", , "ХранилищаНастроек", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "ЭлементСтиля", , "ЭлементыСтиля", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 1, "Язык", , "Языки", );
КонецЕсли;
Если ирКэш.ДоступныВнешниеИсточникДанныхЛкс() Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ВнешнийИсточникДанных", 59, "ВнешниеИсточникиДанных", 58);
КонецЕсли;
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланОбмена", 52, "ПланыОбмена", 51);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Константа", 0, "Константы", 1);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Справочник", 3, "Справочники", 2);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Последовательность", 30, "Последовательности", 29);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Документ", 13, "Документы", 12);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Перечисление", 10, "Перечисления", 9);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланВидовХарактеристик", 38, "ПланыВидовХарактеристик", 37);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланСчетов", 40, "ПланыСчетов",39 );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ПланВидовРасчета", 48, "ПланыВидовРасчета", 47);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрСведений", 34, "РегистрыСведений", 33);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрНакопления", 32, "РегистрыНакопления", 31);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрБухгалтерии", 42, "РегистрыБухгалтерии", 41);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "РегистрРасчета", 50, "РегистрыРасчета", 49);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "БизнесПроцесс", 44, "БизнесПроцессы", 43);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Задача", 46, "Задачи", 45);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "Перерасчет", 57, "Перерасчеты", 57);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "КритерийОтбора", , "КритерииОтбора", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 0, "ЖурналДокументов", 16, "ЖурналыДокументов", 15);
// Дочерние типы
Если ЛиВключатьДочерние Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Графа", , "Графы", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ЗначениеПеречисления", , "ЗначенияПеречисления", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Измерение", , "Измерения", );
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803017 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "КаналСервисаИнтеграции", , "Каналы", );
КонецЕсли;
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Команда", , "Команды", );
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803003 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Куб", , "Кубы", );
КонецЕсли;
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Макет", , "Макеты", );
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803005 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "МетодHTTPСервиса", , "Методы", );
КонецЕсли;
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Операция", , "Операции", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Параметр", , "Параметры", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Поле", , "Поля", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ПризнакУчетаПланаСчетов", , "ПризнакиУчета", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ПризнакУчетаСубконтоПланаСчетов", , "ПризнакиУчетаСубконто", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Реквизит", , "Реквизиты", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "РеквизитАдресации", , "РеквизитыАдресации", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Ресурс", , "Ресурсы", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Таблица", , "Таблицы", );
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803003 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ТаблицаИзмерения", , "ТаблицыИзмерений", );
КонецЕсли;
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ТабличнаяЧасть", 55, "ТабличныеЧасти", 54);
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Форма", , "Формы", );
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803004 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "Функция", , "Функции", );
КонецЕсли;
Если ирКэш.НомерВерсииПлатформыЛкс() >= 803005 Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 2, "ШаблонURLHTTPСервиса", , "ШаблоныURL", );
КонецЕсли;
КонецЕсли;
// Внешние типы
Если ЛиВключатьВнешние Тогда
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 3, "ВнешняяОбработка", , "ВнешниеОбработки", );
ДобавитьВТаблицуТиповМетаОбъектов(Таблица, 3, "ВнешнийОтчет", , "ВнешниеОтчеты", );
КонецЕсли;
Таблица.Индексы.Добавить("Единственное, Категория");
Таблица.Индексы.Добавить("НЕдинственное");
Таблица.Индексы.Добавить("Множественное, Категория");
Таблица.Индексы.Добавить("НМножественное");
Возврат Таблица;
КонецФункции
Функция ФормаПустышкаЛкс() Экспорт
ирПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
ирПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Форма = ирПлатформа.ФормаПустышка;
Если Форма = Неопределено Тогда
ирПлатформа.ФормаПустышка = ирПлатформа.ПолучитьФорму("Пустышка");
Форма = ирПлатформа.ФормаПустышка;
КонецЕсли;
Возврат Форма;
КонецФункции
Функция ЗначенияДляПроверкиИзмененияЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ЗначенияДляПроверкиИзмененияЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый Структура;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ФункциональныеОпцииОбъектовМДЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("ФункциональныеОпцииОбъектовМДЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый ТаблицаЗначений;
Результат.Колонки.Добавить("ИмяОбъектаМД");
Результат.Колонки.Добавить("ИмяОпции");
Для Каждого ФункциональнаяОпция Из Метаданные.ФункциональныеОпции Цикл
Для Каждого ЭлементСостава Из ФункциональнаяОпция.Состав Цикл
Если ЭлементСостава.Объект = Неопределено Тогда
// Битая ссылка
Продолжить;
КонецЕсли;
СтрокаТЗ = Результат.Добавить();
СтрокаТЗ.ИмяОбъектаМД = ЭлементСостава.Объект.ПолноеИмя();
СтрокаТЗ.ИмяОпции = ФункциональнаяОпция.Имя;
КонецЦикла;
КонецЦикла;
Результат.Индексы.Добавить("ИмяОбъектаМД");
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция СкриптМенеджерЛкс() Экспорт
СкриптМенеджер = Новый COMОбъект("MSScriptControl.ScriptControl");
Возврат СкриптМенеджер;
КонецФункции
Функция КоманднаяСтрокаТекущегоПроцессаОСЛкс() Экспорт
Если Не ирКэш.ЛиПлатформаWindowsЛкс() Тогда
КомандаЗапуска = Новый Массив;
КомандаЗапуска.Добавить("cat");
КомандаЗапуска.Добавить("/proc/$PPID/cmdline");
Результат = ирОбщий.ВыполнитьКомандуОСЛкс(КомандаЗапуска);
// Пример результата
// /opt/1cv8/x86_64/8.3.18.1363/rphost -range 1560:1591 -reghost ИмяХоста -regport 1541 -pid 466a359c-54bd-4d6c-9198-ea9f92a74fa2 -debug -tcp
Иначе
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
ИдентификаторПроцессаОС = мПлатформа.ИдентификаторПроцессаОС();
ТекущийПроцесс = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process.Handle='" + XMLСтрока(ИдентификаторПроцессаОС) + "'");
Результат = ТекущийПроцесс.CommandLine;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЭтоУчебнаяПлатформаЛкс() Экспорт
Если Не ирКэш.ЛиФайловаяБазаЛкс() Тогда
Возврат Ложь;
КонецЕсли;
ВременныйФайл = ПолучитьИмяВременногоФайла("mxl");
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Записать(ВременныйФайл, ТипФайлаТабличногоДокумента.MXL7); // В учебной версии платформы это запрещено https://www.hostedredmine.com/issues/923942
Исключение
// Сработает при отсутствии права "Вывод" (портативный вариант) и в учебной платформе ("Ограничение используемой лицензии")
ОписаниеОшибки = ОписаниеОшибки();
Возврат Истина;
КонецПопытки;
УдалитьФайлы(ВременныйФайл);
Возврат Ложь;
КонецФункции
Функция СоставОбщегоРеквизитаЛкс(Знач Имя) Экспорт
Состав = Новый Соответствие;
Для Каждого ЭлементСостава Из Метаданные.ОбщиеРеквизиты[Имя].Состав Цикл
Состав.Вставить(ЭлементСостава.Метаданные.ПолноеИмя(), ЭлементСостава);
КонецЦикла;
Возврат Состав;
КонецФункции
Функция ЛиДоступныДопРеквизитыБСПЛкс() Экспорт
Результат = Истина
И Не ирКэш.ЛиПортативныйРежимЛкс()
И Метаданные.ОбщиеМодули.Найти("УправлениеСвойствами") <> Неопределено
И ирКэш.НомерВерсииБСПЛкс() >= 204;
Возврат Результат;
КонецФункции
#Если Клиент Тогда
Функция ОткрытыеФормыЛкс() Экспорт
ирПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
ирПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Результат = ирПлатформа.ОткрытыеФормы;
Если Результат = Неопределено Тогда
Результат = Новый Массив;
ирПлатформа.ОткрытыеФормы = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПерехватКлавиатурыЛкс() Экспорт
Если Не ирКэш.ЛиПортативныйРежимЛкс() Тогда
Попытка
Результат = Вычислить("ирПерехватКлавиатуры");
Исключение
КонецПопытки;
КонецЕсли;
Если Результат = Неопределено Тогда
Результат = ирКэш.Получить().ПодключитьПерехватКлавиатуры(); // Тут будет обращение к ирОбщий
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЛиМодальностьЗапрещенаЛкс() Экспорт
Результат = Ложь;
Список = Новый СписокЗначений;
Попытка
Список.ВыбратьЭлемент();
Исключение
Результат = Истина;
КонецПопытки;
Возврат Результат;
КонецФункции
// Кэшируем форму, т.к. иначе при повторных вызовах в одном потоке кода каждый раз будет возвращаться новый экземпляр
Функция ОкноСообщенийЛкс(МодальнаяГруппа = 0) Экспорт
Если МодальнаяГруппа = 0 Тогда
#Если ТолстыйКлиентУправляемоеПриложение Тогда
//Форма = ПолучитьФорму("Обработка.ирПлатформа.Форма.ВременноеОкноСообщенийУпр",,, МодальнаяГруппа); // Так будет ошибка компиляции в портативном варианте в файловой базе
Форма = ирОбщий.ПолучитьФормуЛкс("Обработка.ирПлатформа.Форма.ВременноеОкноСообщенийУпр",,, МодальнаяГруппа);
#КонецЕсли
Иначе
мПлатформа = ирКэш.Получить();
#Если Сервер И Не Сервер Тогда
мПлатформа = Обработки.ирПлатформа.Создать();
#КонецЕсли
Форма = мПлатформа.ПолучитьФорму("СообщенияМодальнойГруппы",, МодальнаяГруппа);
КонецЕсли;
Возврат Форма;
КонецФункции
Функция ФормаСравнителяТекстовЛкс() Экспорт
Результат = ирОбщий.НоваяФормаСравнителяТекстовЛкс();
Возврат Результат;
КонецФункции
Функция ИмяШрифтаРедактораМодуляКонфигуратораЛкс() Экспорт
НастройкиКонфигуратора = ирОбщий.ПрочитатьТекстИзФайлаЛкс(ирКэш.КаталогИзданияПлатформыВПрофилеЛкс(Ложь) + ирОбщий.РазделительПутиКФайлуЛкс() + "1Cv8cmn.pfl");
ИмяШрифта = ирОбщий.СтрокаМеждуМаркерамиЛкс(НастройкиКонфигуратора, "9cd510c8-abfc-11d4-9434-004095e12fc7", """SearchResultBackground""", Ложь);
ИмяШрифта = ирОбщий.СтрокаМеждуМаркерамиЛкс(ИмяШрифта, """", """", Ложь);
Возврат ИмяШрифта;
КонецФункции
#КонецЕсли
#КонецЕсли
Функция ЛиПортативныйРежимЛкс() Экспорт
//Попытка
// Пустышка = ирПортативный.мВнешниеМодули;
// Результат = Истина;
//Исключение
// Результат = Ложь;
//КонецПопытки;
Результат = ТипЗнч(ирПортативный) <> Тип("ОбщийМодуль");
Возврат Результат;
КонецФункции
Функция КодыКлавишЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КодыКлавишЛкс");
КлючНаборПараметров = "";
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Результат = Новый Соответствие();
// Порядок модифицкаторов CTRL+ALT+SHIFT
Результат.Вставить("ALT+SHIFT+V", "17494");
Результат.Вставить("CTRL+~", "04288");
Результат.Вставить("CTRL+A", "04161");
Результат.Вставить("CTRL+C", "04163");
Результат.Вставить("CTRL+V", "04182");
Результат.Вставить("Space", "00032");
Результат.Вставить("CTRL+SHIFT+Space", "20512");
Результат.Вставить("CTRL+ALT+Space", "05152");
Результат.Вставить("CTRL+Space", "20512");
Результат.Вставить("ALT+Up", "01318");
Результат.Вставить("ALT+Down", "01320");
Результат.Вставить("Esc", "00027");
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЛиСеансТолстогоКлиентаЛкс() Экспорт
#Если ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
Результат = Истина;
#ИначеЕсли Сервер Тогда
ТекущийСеанс = ирКэш.ТекущийСеансЛкс();
Результат = ирОбщий.СтрокиРавныЛкс(ТекущийСеанс.ИмяПриложения, "1CV8");
#Иначе
Результат = Ложь;
#КонецЕсли
Возврат Результат;
КонецФункции
Функция ЛиСеансТонкогоКлиентаЛкс() Экспорт
#Если ТонкийКлиент Тогда
Результат = Истина;
#ИначеЕсли Сервер Тогда
ТекущийСеанс = ирКэш.ТекущийСеансЛкс();
Результат = ирОбщий.СтрокиРавныЛкс(ТекущийСеанс.ИмяПриложения, "1CV8C");
#Иначе
Результат = Ложь;
#КонецЕсли
Возврат Результат;
КонецФункции
// В параметрах конфигуратора "Модули/Проверка" отсутствует флажок "Толстый клиент (УП)". Поэтому проверка компиляции не выполняется.
// Поэтому вместо инструкций препроцессора по возможности надо использовать это проверку.
// https://partners.v8.1c.ru/forum/topic/1996623
Функция ЛиСеансТолстогоКлиентаУПЛкс() Экспорт
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Результат = Истина;
#Иначе
Результат = Ложь;
#КонецЕсли
Возврат Результат;
КонецФункции
Функция ЛиПлатформаLinuxЛкс() Экспорт
//Возврат Истина; // Для отладки
СисИнфо = Новый СистемнаяИнформация;
Результат = Ложь
Или СисИнфо.ТипПлатформы = ТипПлатформы.Linux_x86
Или СисИнфо.ТипПлатформы = ТипПлатформы.Linux_x86_64;
Возврат Результат;
КонецФункции
Функция ЛиПлатформаWindowsЛкс() Экспорт
//Возврат Ложь; // Для отладки
СисИнфо = Новый СистемнаяИнформация;
Результат = Ложь
Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86
Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64;
Возврат Результат;
КонецФункции
Функция ЛиДоступныРегВыраженияЛкс() Экспорт
Результат = Ложь
Или ирКэш.НомерВерсииПлатформыЛкс() >= 803006
#Если Клиент Тогда
Или ирКэш.ЛиПлатформаWindowsЛкс()
#КонецЕсли
;
Возврат Результат;
КонецФункции
Функция ЛиДоступенРедакторМонакоЛкс() Экспорт
Возврат Истина
И ирКэш.ЛиПлатформаWindowsЛкс()
И (Ложь
Или ирКэш.НомерВерсииПлатформыЛкс() >= 803018
Или (Истина
И ирКэш.НомерВерсииПлатформыЛкс() >= 803015
И ирОбщий.ЛиПерехватКлавиатурногоВводаЛкс()))
;
КонецФункции
// Метка_9в6676вап6438о
Функция Это64битныйПроцессЛкс() Экспорт
СисИнфо = Новый СистемнаяИнформация;
Результат = Ложь
Или СисИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64
Или СисИнфо.ТипПлатформы = ТипПлатформы.Linux_x86_64
Или ирКэш.НомерВерсииПлатформыЛкс() > 803001 И СисИнфо.ТипПлатформы = ТипПлатформы.MacOS_x86_64; // Появилось в 8.3
Возврат Результат;
КонецФункции
Функция ИмяКолонкиНомерСтрокиЛкс() Экспорт
ИмяКолонкиНомерСтроки = "НомерСтроки" + ирОбщий.СуффиксСлужебногоСвойстваЛкс();
Возврат ИмяКолонкиНомерСтроки;
КонецФункции
Функция ЛиФайловаяБазаЛкс() Экспорт
ФайловыйКаталог = НСтр(СтрокаСоединенияИнформационнойБазы(), "File");
ЭтоФайловаяБаза = Не ПустаяСтрока(ФайловыйКаталог);
Возврат ЭтоФайловаяБаза;
КонецФункции
Функция СтрокаСоединенияСервераЛкс() Экспорт
Результат = ирСервер.СтрокаСоединенияСервераЛкс();
Возврат Результат;
КонецФункции
Функция КартинкаПоИмениЛкс(Имя) Экспорт
#Если Сервер И Не Сервер Тогда
ирПортативный = Обработки.ирПортативный.Создать();
#КонецЕсли
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции = ирПортативный.КэшФункцииЛкс("КартинкаПоИмениЛкс");
КлючНаборПараметров = "" + Имя;
Результат = КэшФункции[КлючНаборПараметров];
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;
КонецЕсли;
Попытка
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
Результат = ирПортативный.КартинкаПоИмениЛкс(Имя);
Иначе
Результат = БиблиотекаКартинок[Имя];
КонецЕсли;
Исключение
ОписаниеОшибки = ОписаниеОшибки(); // Для отладки
Результат = Новый Картинка;
КонецПопытки;
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
КэшФункции[КлючНаборПараметров] = Результат;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЭтоТолстыйКлиентЛкс() Экспорт
#Если ТонкийКлиент Или ВебКлиент Или МобильныйКлиент Тогда
Результат = Ложь;
#Иначе
Результат = Истина;
#КонецЕсли
Возврат Результат;
КонецФункции