RDT1C/CommonModules/ирСервер/Ext/Module.bsl
Администратор 1f8f6575bc .
2021-09-15 20:09:07 +03:00

1472 lines
106 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.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
// Поместить строку соединения во временное хранилище
Функция ПоместитьСтрокуСоединенияВХранилищеЛкс(Адрес) Экспорт
ПоместитьВоВременноеХранилище(СтрокаСоединенияИнформационнойБазы(), Адрес);
КонецФункции
// Получить строку соединения сервера
Функция СтрокаСоединенияСервераЛкс() Экспорт
Если ирКэш.ЛиФайловаяБазаЛкс() Тогда
Результат = СтрокаСоединенияИнформационнойБазы();
Иначе
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
Результат = СтрокаСоединенияИнформационнойБазы();
Иначе
// Антибаг https://partners.v8.1c.ru/forum/t/1361906/m/1361906
//Если МонопольныйРежим() Тогда
// ВызватьИсключение "Невозможно определить строку соединения сервера в монопольном режиме";
//КонецЕсли;
АдресХранилища = ПоместитьВоВременноеХранилище("");
Параметры = Новый Массив();
Параметры.Добавить(АдресХранилища);
ФоновоеЗадание = ФоновыеЗадания.Выполнить("ирСервер.ПоместитьСтрокуСоединенияВХранилищеЛкс", Параметры,, "Получение строки соединения сервера (ИР)");
Попытка
ФоновоеЗадание.ОжидатьЗавершения(3);
Исключение
// http://www.hostedredmine.com/issues/851201
ВызватьИсключение "Превышено время ожидания служебного фонового задания ИР. Выключите автоподключение фоновых заданий в отладчике и повторите попытку.";
КонецПопытки;
Результат = ПолучитьИзВременногоХранилища(АдресХранилища);
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
/////////////////////////////////////////////
// БСП. Отладка внешних обработок
Процедура ПриПодключенииВнешнейОбработки(Ссылка, СтандартнаяОбработка, Результат) Экспорт
#Если Сервер И Не Сервер Тогда
Ссылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка();
#КонецЕсли
СтандартнаяОбработка = Истина;
ОтладкаВключена = ХранилищеСистемныхНастроек.Загрузить("ирОтладкаВнешнихОбработок", "СозданиеВнешнихОбработокЧерезФайл");
Если ОтладкаВключена = Истина Тогда
ПутьКФайлу = ПолноеИмяФайлаВнешнейОбработкиВФайловомКэшеЛкс(Ссылка);
Иначе
Результат = "";
Возврат;
КонецЕсли;
Если Ложь
Или Ссылка = Вычислить("Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка()")
Или ТипЗнч(Ссылка) <> Вычислить("Тип(""СправочникСсылка.ДополнительныеОтчетыИОбработки"")")
Тогда
Результат = Неопределено;
Возврат;
КонецЕсли;
Если Ложь
Или Ссылка.Вид = Вычислить("Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет")
Или Ссылка.Вид = Вычислить("Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет")
Тогда
Менеджер = ВнешниеОтчеты;
Иначе
Менеджер = ВнешниеОбработки;
КонецЕсли;
ФайлВнешнейОбработки = Новый Файл(ПутьКФайлу);
Если Не ФайлВнешнейОбработки.Существует() Тогда
Ссылка.ХранилищеОбработки.Получить().Записать(ФайлВнешнейОбработки.ПолноеИмя);
КонецЕсли;
ВнешнийОбъект = Менеджер.Создать(ПутьКФайлу, Ложь);
ИмяОбработки = ВнешнийОбъект.Метаданные().Имя;
Результат = ИмяОбработки;
СтандартнаяОбработка = Ложь;
Возврат;
КонецПроцедуры
Функция ПолноеИмяФайлаВнешнейОбработкиВФайловомКэшеЛкс(Ссылка, КаталогФайловогоКэша = "") Экспорт
#Если Сервер И Не Сервер Тогда
Ссылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка();
#КонецЕсли
Если Не ЗначениеЗаполнено(КаталогФайловогоКэша) Тогда
Обработчик = НайтиПерехватВнешнихОбработокБСПЛкс();
Если Обработчик = Неопределено Тогда
ВызватьИсключение "Перехват внеших обработок не включен";
КонецЕсли;
КаталогФайловогоКэша = Обработчик.КаталогФайловогоКэша;
КонецЕсли;
ИмяФайла = Ссылка.ИмяФайла;
Если Не ЗначениеЗаполнено(ИмяФайла) Тогда
ИмяФайла = "" + Ссылка.УникальныйИдентификатор() + ".epf";
КонецЕсли;
ПутьКФайлу = КаталогФайловогоКэша + "\" + ИмяФайла;
Возврат ПутьКФайлу;
КонецФункции
Процедура ВключитьПерехватВнешнихОбработокБСПЛкс(Знач КаталогФайловогоКэша) Экспорт
Если ирКэш.НомерВерсииБСПЛкс() < 204 Тогда
Обработчики = ПолучитьОбработчикиПриПодключенииВнешнейОбработки();
СтруктураОбработчика = Новый Структура("Модуль, Версия, Подсистема, КаталогФайловогоКэша", "ирСервер", "", "tormozit", КаталогФайловогоКэша);
Обработчики.Добавить(СтруктураОбработчика);
УстановитьОбработчикиПриПодключенииВнешнейОбработки(Обработчики);
Иначе
ХранилищеСистемныхНастроек.Сохранить("ирОтладкаВнешнихОбработок", "КаталогФайловогоКэша", КаталогФайловогоКэша);
КонецЕсли;
КонецПроцедуры
Функция ПолучитьОбработчикиПриПодключенииВнешнейОбработки()
КонстантаПараметрыСлужебныхСобытий = Вычислить("Константы.ПараметрыСлужебныхСобытий");
ИмяОбработчика = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПодключенииВнешнейОбработки";
СтруктруаПараметрыСлужебныхСобытий = КонстантаПараметрыСлужебныхСобытий.Получить().Получить();
ОбработчикиНаСервере = СтруктруаПараметрыСлужебныхСобытий.ОбработчикиСобытий.НаСервере;
ОбработчикиСлужебныхСобытий = ОбработчикиНаСервере.ОбработчикиСлужебныхСобытий;
Обработчики = ОбработчикиСлужебныхСобытий[ИмяОбработчика];
Обработчики = Новый Массив(Обработчики);
Возврат Обработчики;
КонецФункции
Процедура УстановитьОбработчикиПриПодключенииВнешнейОбработки(Обработчики)
ИмяОбработчика = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки\ПриПодключенииВнешнейОбработки";
КонстантаПараметрыСлужебныхСобытий = Вычислить("Константы.ПараметрыСлужебныхСобытий");
СтруктураПараметрыСлужебныхСобытий = КонстантаПараметрыСлужебныхСобытий.Получить().Получить();
ОбработчикиНаСервере = СтруктураПараметрыСлужебныхСобытий.ОбработчикиСобытий.НаСервере;
ОбработчикиСлужебныхСобытий = Вычислить("Новый Соответствие(ОбработчикиНаСервере.ОбработчикиСлужебныхСобытий)");
ОбработчикиСлужебныхСобытий[ИмяОбработчика] = Новый ФиксированныйМассив(Обработчики);
ОбработчикиНаСервере.ОбработчикиСлужебныхСобытий = Новый ФиксированноеСоответствие(ОбработчикиСлужебныхСобытий);
КонстантаПараметрыСлужебныхСобытий.Установить(Новый ХранилищеЗначения(СтруктураПараметрыСлужебныхСобытий));
ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры
Функция НайтиПерехватВнешнихОбработокБСПЛкс(Выключить = Ложь) Экспорт
Если ирКэш.НомерВерсииБСПЛкс() < 204 Тогда
Обработчики = ПолучитьОбработчикиПриПодключенииВнешнейОбработки();
ОбновитьЗначениеКонстанты = Ложь;
Для СчетчикОбработчики = - Обработчики.Количество() + 1 По 0 Цикл
Индекс = -СчетчикОбработчики;
Обработчик = Обработчики[Индекс];
Если Обработчик.Модуль = "ирСервер" Тогда
Если Не Выключить Тогда
Возврат Обработчик;
КонецЕсли;
Обработчики.Удалить(Индекс);
ОбновитьЗначениеКонстанты = Истина;
КонецЕсли;
КонецЦикла;
Если ОбновитьЗначениеКонстанты Тогда
УстановитьОбработчикиПриПодключенииВнешнейОбработки(Обработчики);
КонецЕсли;
Иначе
КаталогФайловогоКэша = ХранилищеСистемныхНастроек.Загрузить("ирОтладкаВнешнихОбработок", "КаталогФайловогоКэша");
Обработчик = Новый Структура("КаталогФайловогоКэша", КаталогФайловогоКэша);
Возврат Обработчик;
КонецЕсли;
Возврат Неопределено;
КонецФункции
/////////////////////////////////////////////
// Перенаправление
Функция ПолучитьКаталогНастроекПриложения1СЛкс(ВариантРасположенияФайлаНастроек = Истина, СоздатьЕслиОтсутствует = Ложь) Экспорт
Результат = ирОбщий.КаталогНастроекПриложения1СЛкс(ВариантРасположенияФайлаНастроек, СоздатьЕслиОтсутствует);
Возврат Результат;
КонецФункции
Функция ПолучитьПолноеИмяФайлаНастройкиПриложения1СЛкс(КраткоеИмяФайла, НаСервере = Ложь, выхВариантРасположенияФайлаНастроек = Неопределено, выхДатаИзменения = Неопределено) Экспорт
Результат = ирОбщий.ПолноеИмяФайлаНастройкиПриложения1СЛкс(КраткоеИмяФайла, НаСервере, выхВариантРасположенияФайлаНастроек, выхДатаИзменения);
Возврат Результат;
КонецФункции
Функция ПолучитьИмяФайлаАктивнойНастройкиТехноЖурналаЛкс() Экспорт
Результат = ирОбщий.ИмяФайлаАктивнойНастройкиТехноЖурналаЛкс();
Возврат Результат;
КонецФункции
Функция ЛиКаталогТехножурналаНедоступенЛкс(КаталогЖурнала) Экспорт
Результат = ирОбщий.ЛиКаталогТехножурналаНедоступенЛкс(КаталогЖурнала);
Возврат Результат;
КонецФункции
Функция ЗаписатьТекстВФайлЛкс(ПолноеИмяФайла, Текст, Кодировка = Неопределено) Экспорт
Результат = ирОбщий.ЗаписатьТекстВФайлЛкс(ПолноеИмяФайла, Текст, Кодировка);
Возврат Результат;
КонецФункции
Функция ПрочитатьТекстИзФайлаЛкс(ПолноеИмяФайла, Кодировка = Неопределено) Экспорт
Результат = ирОбщий.ПрочитатьТекстИзФайлаЛкс(ПолноеИмяФайла, Кодировка);
Возврат Результат;
КонецФункции
Функция НайтиИменаФайловЛкс(Путь, Маска = Неопределено, ИскатьВПодкаталогах = Истина) Экспорт
Результат = ирОбщий.НайтиИменаФайловЛкс(Путь, Маска, ИскатьВПодкаталогах);
Возврат Результат;
КонецФункции
Функция ВычислитьРазмерКаталогаЛкс(Каталог, ВключаяПодкаталоги = Истина) Экспорт
Результат = ирОбщий.ВычислитьРазмерКаталогаЛкс(Каталог, ВключаяПодкаталоги);
Возврат Результат;
КонецФункции
Функция ТекущаяДатаЛкс() Экспорт
Результат = ТекущаяДата();
Возврат Результат;
КонецФункции
Процедура ОчиститьКаталогТехножурналаЛкс(КаталогЖурнала, ВыводитьПредупрежденияИСообщения = Истина) Экспорт
ирОбщий.ОчиститьКаталогТехножурналаЛкс(КаталогЖурнала, , ВыводитьПредупрежденияИСообщения);
КонецПроцедуры // ОчиститьКаталогТехножурналаЛкс()
Функция АдаптироватьРасширениеЛкс() Экспорт
Результат = ирОбщий.АдаптироватьРасширениеЛкс();
Возврат Результат;
КонецФункции
Функция ВосстановитьЗначениеЛкс(Знач КлючНастроек) Экспорт
Возврат ирОбщий.ВосстановитьЗначениеЛкс(КлючНастроек);
КонецФункции
Функция СохранитьЗначениеЛкс(Знач КлючНастроек, Знач Значение) Экспорт
ирОбщий.СохранитьЗначениеЛкс(КлючНастроек, Значение);
КонецФункции
Функция УдалитьХранимуюНастройкуЛкс(Знач КлючНастроек) Экспорт
ирОбщий.УдалитьХранимуюНастройкуЛкс(КлючНастроек);
КонецФункции
Функция ПроверитьСоединениеADOЭтойБДЛкс(Знач ИмяСервера, Знач ИмяБД, Знач ИмяПользователя, Знач Пароль, Знач Асинхронно) Экспорт
Результат = ирОбщий.ПроверитьСоединениеADOЭтойБДЛкс(ИмяСервера, ИмяБД, ИмяПользователя, Пароль, Ложь, Ложь, Асинхронно);
Возврат Результат;
КонецФункции
Функция ВыполнитьЗапросКЭтойБазеЧерезADOЛкс(Знач ТекстЗапроса, Знач СмещениеГода, Знач ИспользованиеGWF) Экспорт
Результат = ирОбщий.ВыполнитьЗапросКЭтойБазеЧерезADOЛкс(ТекстЗапроса,,, СмещениеГода, ИспользованиеGWF, Ложь);
Возврат Результат;
КонецФункции
Функция СкомпоноватьОтчетВКонсолиЛкс(Знач АдресКоллекцииВывода, Знач АдресМакетаКомпоновки, ВнешниеНаборыДанных, Автофиксация, МодальныйРежим, ЛиОтладка, АдресДанныхРасшифровки,
ВыполнятьПредварительныйЗапрос) Экспорт
КоллекцияВывода = ПолучитьИзВременногоХранилища(АдресКоллекцииВывода);
МакетКомпоновкиДанных = ПолучитьИзВременногоХранилища(АдресМакетаКомпоновки);
Результат = ирОбщий.СкомпоноватьОтчетВКонсолиЛкс(КоллекцияВывода, МакетКомпоновкиДанных, ВнешниеНаборыДанных, Автофиксация, МодальныйРежим, ЛиОтладка, АдресДанныхРасшифровки,
ВыполнятьПредварительныйЗапрос);
ПоместитьВоВременноеХранилище(КоллекцияВывода, АдресКоллекцииВывода);
Возврат Результат;
КонецФункции
Функция ОбработатьПорциюСтрокТаблицыЛкс(Знач АдресТаблицыЗначений, Знач НачальныйНомерСтроки, Знач РазмерПорции, Знач МодальныйРежим = Ложь, Знач ПропускатьОшибки = Ложь, Знач ТекстАлгоритма,
Знач ПараметраАлгоритмы = Неопределено) Экспорт
ирОбщий.ОбработатьПорциюСтрокТаблицыЛкс(АдресТаблицыЗначений, НачальныйНомерСтроки, РазмерПорции, МодальныйРежим, ПропускатьОшибки, ТекстАлгоритма, ПараметраАлгоритмы);
КонецФункции
Функция НеблокирующиеМетаданныеБСПЛкс() Экспорт
Результат = ирОбщий.НеблокирующиеМетаданныеБСПЛкс();
Возврат Результат;
КонецФункции
Процедура ВычислитьВыраженияПараметровЛкс(Знач ТаблицаВычисляемыхПараметров, СтруктураПараметровXML) Экспорт
СтруктураПараметров = ирОбщий.ОбъектИзСтрокиXMLЛкс(СтруктураПараметровXML);
ирОбщий.ВычислитьВыраженияПараметровЛкс(ТаблицаВычисляемыхПараметров, СтруктураПараметров);
СтруктураПараметровXML = ирОбщий.ОбъектВСтрокуXMLЛкс(СтруктураПараметров);
КонецПроцедуры
Процедура ПроверитьСхемуКомпоновкиЛкс(Знач ПроверочнаяСхемаXML, Знач НастройкаКомпоновкиXML, Знач ПроверятьДоступностьПолей, Знач ВнешниеФункцииРазрешены) Экспорт
ирОбщий.ПроверитьСхемуКомпоновкиЛкс(ирОбщий.ОбъектИзСтрокиXMLЛксроверочнаяСхемаXML), ирОбщий.ОбъектИзСтрокиXMLЛкс(НастройкаКомпоновкиXML), ПроверятьДоступностьПолей,
ВнешниеФункцииРазрешены);
КонецПроцедуры
Процедура УстановитьИспользованиеИсторииДанныхЛкс(Знач ИменаМД, Знач НовоеИспользование, Знач НовоеИспользованиеПолей) Экспорт
ирОбщий.УстановитьИспользованиеИсторииДанныхЛкс(ИменаМД, НовоеИспользование, НовоеИспользованиеПолей);
КонецПроцедуры
Функция ОбработатьСобытиеЛкс(ТаблицаСобытий, ИмяСобытия, выхОписаниеОшибки, П0 = null, П1 = null, П2 = null, П3 = null, П4 = null, П5 = null, П6 = null, П7 = null) Экспорт
Результат = ирОбщий.ОбработатьСобытиеЛкс(ТаблицаСобытий, ИмяСобытия, выхОписаниеОшибки,, П0, П1, П2, П3, П4, П5, П6, П7);
Возврат Результат
КонецФункции
Функция КонсольКомпоновки_ПередВыполнениемЛкс(Знач ТаблицаСобытий, ИмяСобытия, ОписаниеОшибки, ВременнаяСхемаКомпоновки, ВременныеНастройкиКомпоновки, СтруктураВнешниеНаборыДанных) Экспорт
Результат = ирОбщий.КонсольКомпоновки_ПередВыполнениемЛкс(ТаблицаСобытий, ИмяСобытия, ОписаниеОшибки,, ВременнаяСхемаКомпоновки, ВременныеНастройкиКомпоновки, СтруктураВнешниеНаборыДанных);
Возврат Результат
КонецФункции
////////
Процедура ПодключитьСистемнуюФормуЛкс(Знач ИмяВыбраннойФормы) Экспорт
ВнешниеОбработки.Подключить("v8res://mngbase/" + ИмяВыбраннойФормы + ".epf");
КонецПроцедуры
Процедура ПереместитьФайлЛкс(ИмяИсточника, ИмяПриемника) Экспорт
ПереместитьФайл(ИмяИсточника, ИмяПриемника);
КонецПроцедуры // ПереместитьФайл()
Функция ЛиФайлСуществуетЛкс(ПолноеИмяФайла, выхДатаИзменения = Неопределено) Экспорт
Файл1 = Новый Файл(ПолноеИмяФайла);
ФайлНайден = Файл1.Существует();
Если ФайлНайден Тогда
выхДатаИзменения = Файл1.ПолучитьВремяИзменения() + ирКэш.ПолучитьСмещениеВремениЛкс();
КонецЕсли;
Возврат ФайлНайден;
КонецФункции // ЛиФайлСуществует()
// Выполняет текст алгоритма.
//
// Параметры:
// ТекстДляВыполнения Строка;
// _АлгоритмОбъект - СправочникОбъект
// *СтруктураПараметров - Структура, *Неопределено.
//
Функция ВыполнитьАлгоритм(_ТекстДляВыполнения, _АлгоритмОбъект = Null, _Режим = Null,
_П0 = Null, _П1 = Null, _П2 = Null, _П3 = Null, _П4 = Null, _П5 = Null, _П6 = Null, _П7 = Null, _П8 = Null, _П9 = Null) Экспорт
Перем Результат;
Если Истина
И ирКэш.ЛиПортативныйРежимЛкс()
И ирПортативный.ЛиСерверныйМодульДоступенЛкс(Ложь)
Тогда
ПараметрыКоманды = Новый Структура("_ТекстДляВыполнения, _АлгоритмОбъект", _ТекстДляВыполнения, _АлгоритмОбъект);
#Если Сервер И Не Сервер Тогда
Обработки.ирПортативныйСервер.Создать().ВыполнитьАлгоритм();
#КонецЕсли
ирПортативный.ВыполнитьСерверныйМетодЛкс("ВыполнитьАлгоритм", ПараметрыКоманды);
Иначе
Результат = ирОбщий.ВыполнитьАлгоритм(_ТекстДляВыполнения, _АлгоритмОбъект, _Режим, _П0, _П1, _П2, _П3, _П4, _П5, _П6, _П7, _П8, _П9);
КонецЕсли;
Результат = Неопределено; // Защита от возвращения на клиент мутабельного значения в консоли кода http://www.hostedredmine.com/issues/871627
Возврат Результат;
КонецФункции
Процедура ВыполнитьАлгоритмБезРезультата(_ТекстДляВыполнения) Экспорт
Выполнить(_ТекстДляВыполнения);
КонецПроцедуры
Функция ВычислитьВыражение(Выражение, Параметры = Неопределено) Экспорт
Возврат Вычислить(Выражение);
КонецФункции
Функция ВыполнитьАлгоритмЧерезВнешнююОбработкуЛкс(ИмяФайлаВнешнейОбработки, СтруктураПараметров, выхВремяНачала = Неопределено, ВерсияАлгоритма = Неопределено) Экспорт
Перем Результат;
Если Истина
И ирКэш.ЛиПортативныйРежимЛкс()
И ирПортативный.ЛиСерверныйМодульДоступенЛкс(Ложь)
Тогда
ПараметрыКоманды = Новый Структура("ИмяФайлаВнешнейОбработки, СтруктураПараметров, выхВремяНачала, ВерсияАлгоритма", ИмяФайлаВнешнейОбработки, СтруктураПараметров, выхВремяНачала, ВерсияАлгоритма);
#Если Сервер И Не Сервер Тогда
Обработки.ирПортативныйСервер.Создать().ВыполнитьАлгоритмЧерезВнешнююОбработкуЛкс();
#КонецЕсли
ирПортативный.ВыполнитьСерверныйМетодЛкс("ВыполнитьАлгоритмЧерезВнешнююОбработкуЛкс", ПараметрыКоманды);
выхВремяНачала = ПараметрыКоманды.выхВремяНачала;
Иначе
Результат = ирОбщий.ВыполнитьАлгоритмЧерезВнешнююОбработкуЛкс(ИмяФайлаВнешнейОбработки, СтруктураПараметров, выхВремяНачала, ВерсияАлгоритма);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолучитьСнимокОбъектаБДПоКлючуЛкс(Знач ИмяОсновнойТаблицы, Знач КлючОбъекта, Знач СохранятьИдентификаторСсылки, Знач ЧитатьДанные, выхИдентификаторСсылки = Неопределено,
НомерВерсии = Неопределено) Экспорт
СтруктураОбъекта = ирОбщий.ОбъектБДПоКлючуЛкс(ИмяОсновнойТаблицы, КлючОбъекта, СохранятьИдентификаторСсылки, ЧитатьДанные, Истина, выхИдентификаторСсылки, Ложь, НомерВерсии);
Если СтруктураОбъекта <> Неопределено Тогда
СтруктураСнимка = Новый Структура;
СтруктураСнимка.Вставить("ТипОбъекта", ТипЗнч(СтруктураОбъекта.Методы));
СтруктураСнимка.Вставить("Снимок", СтруктураОбъекта.Методы.Снимок(, Ложь));
КонецЕсли;
Возврат СтруктураСнимка;
КонецФункции
Процедура ЗаписатьОбъектXMLЛкс(ОбъектXML, ДополнительныеСвойства = Неопределено, Знач РежимЗаписи = Неопределено, Знач РежимПроведения = Неопределено, Знач ОтключатьКонтрольЗаписи = Неопределено,
Знач БезАвторегистрацииИзменений = Неопределено, Знач ТипОбъекта = Неопределено, Знач ПривилегированныйРежим = Неопределено, Знач ОтключатьЗаписьВерсии = Неопределено) Экспорт
#Если Сервер И Не Сервер Тогда
ирПортативный = Обработки.ирПортативный.Создать();
#КонецЕсли
Если Истина
И ирКэш.ЛиПортативныйРежимЛкс()
И ирПортативный.ЛиСерверныйМодульДоступенЛкс()
Тогда
ПараметрыКоманды = Новый Структура("ОбъектXML, ДополнительныеСвойства, РежимЗаписи, РежимПроведения, ОтключатьКонтрольЗаписи, БезАвторегистрацииИзменений, ПривилегированныйРежим, ОтключатьЗаписьВерсии",
ОбъектXML, ДополнительныеСвойства, РежимЗаписи, РежимПроведения, ОтключатьКонтрольЗаписи, БезАвторегистрацииИзменений, ПривилегированныйРежим, ОтключатьЗаписьВерсии);
#Если Сервер И Не Сервер Тогда
Обработки.ирПортативныйСервер.Создать().ЗаписатьОбъектXMLЛкс();
#КонецЕсли
ирПортативный.ВыполнитьСерверныйМетодЛкс("ЗаписатьОбъектXMLЛкс", ПараметрыКоманды);
ДополнительныеСвойства = ПараметрыКоманды.ДополнительныеСвойства;
ОбъектXML = ПараметрыКоманды.ОбъектXML;
Иначе
ЭтоИмитатор = ирОбщий.ЛиТипИмитатораОбъектаЛкс(ТипОбъекта);
Если ЭтоИмитатор Тогда
Объект = Новый (ТипОбъекта);
#Если Сервер И Не Сервер Тогда
Объект = Обработки.ирИмитаторСсылочныйОбъект.Создать();
#КонецЕсли
Объект.ЗагрузитьСнимок(ОбъектXML);
Иначе
Объект = ирОбщий.ОбъектИзСтрокиXMLЛкс(ОбъектXML);
ирОбщий.ВосстановитьДополнительныеСвойстваОбъектаЛкс(Объект, ДополнительныеСвойства);
КонецЕсли;
ирОбщий.ЗаписатьОбъектЛкс(Объект, Ложь, РежимЗаписи, РежимПроведения, ОтключатьКонтрольЗаписи, БезАвторегистрацииИзменений, ПривилегированныйРежим, ОтключатьЗаписьВерсии);
Если ЭтоИмитатор Тогда
#Если Сервер И Не Сервер Тогда
Объект = Обработки.ирИмитаторСсылочныйОбъект.Создать();
#КонецЕсли
ОбъектXML = Объект.Снимок(, Ложь);
Иначе
ДополнительныеСвойства = ирОбщий.СериализоватьДополнительныеСвойстваОбъектаЛкс(Объект, Ложь);
ОбъектXML = ирОбщий.ОбъектВСтрокуXMLЛкс(Объект);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ИзменитьРегистрациюОбъектаДляУзлаЛкс(ОбъектXML, ТипОбъекта, Знач УзлыДляРегистрации, Знач НовоеЗначение, Знач ОдинУзелОбменаДляПроверки, Знач НомерВерсииПлатформы = "") Экспорт
Объект = Новый (ТипОбъекта);
#Если Сервер И Не Сервер Тогда
Объект = обработки.ирИмитаторСсылочныйОбъект.Создать();
#КонецЕсли
Объект.ЗагрузитьСнимок(ОбъектXML);
Объект = Объект.ОбъектБД();
ирОбщий.ИзменитьРегистрациюОбъектаДляУзлаЛкс(УзлыДляРегистрации, Объект, НовоеЗначение, ОдинУзелОбменаДляПроверки, НомерВерсииПлатформы);
КонецПроцедуры
Функция ОбъектБДИзИмитатораВСтрокуXMLЛкс(ОбъектXML, ТипОбъекта, Знач ИспользоватьXDTO = Истина, СообщатьОбОшибках = Истина, Знач Сериализатор = Неопределено) Экспорт
Объект = Новый (ТипОбъекта);
#Если Сервер И Не Сервер Тогда
Объект = Обработки.ирИмитаторСсылочныйОбъект.Создать();
#КонецЕсли
Объект.ЗагрузитьСнимок(ОбъектXML, Истина);
Результат = Объект.ДанныеВСтрокуXMLЧерезXDTO(ИспользоватьXDTO, СообщатьОбОшибках, Сериализатор);
Возврат Результат;
КонецФункции
Функция ОбъектБДВИмитаторИзСтрокиXML(ОбъектXML, ТипОбъекта, Знач ИспользоватьXDTO = Истина, СообщатьОбОшибках = Истина) Экспорт
ОбъектБД = ирОбщий.ОбъектИзСтрокиXMLЛкс(ОбъектXML,, ИспользоватьXDTO, СообщатьОбОшибках);
Объект = Новый (ТипОбъекта);
#Если Сервер И Не Сервер Тогда
Объект = Обработки.ирИмитаторСсылочныйОбъект.Создать();
#КонецЕсли
ОбъектБД = Объект.ДанныеИзСтрокиXMLЧерезXDTO(ИспользоватьXDTO, СообщатьОбОшибках);
Объект.Конструктор(ОбъектБД);
Снимок = Объект.Снимок(Истина);
Возврат Снимок;
КонецФункции
Процедура УдалитьОбъектXMLЛкс(Знач ОбъектXML, Знач ДополнительныеСвойства, Знач ОтключатьКонтрольЗаписи = Неопределено, Знач БезАвторегистрацииИзменений = Неопределено, Знач ТипОбъекта,
ПривилегированныйРежим = Неопределено, ОтключатьЗаписьВерсии = Неопределено) Экспорт
#Если Сервер И Не Сервер Тогда
ирПортативный = Обработки.ирПортативный.Создать();
#КонецЕсли
Если Истина
И ирКэш.ЛиПортативныйРежимЛкс()
И ирПортативный.ЛиСерверныйМодульДоступенЛкс()
Тогда
ПараметрыКоманды = Новый Структура("ОбъектXML, ДополнительныеСвойства, ОтключатьКонтрольЗаписи, БезАвторегистрацииИзменений, ПривилегированныйРежим, ОтключатьЗаписьВерсии",
ОбъектXML, ДополнительныеСвойства, ОтключатьКонтрольЗаписи, БезАвторегистрацииИзменений, ПривилегированныйРежим, ОтключатьЗаписьВерсии);
#Если Сервер И Не Сервер Тогда
Обработки.ирПортативныйСервер.Создать().УдалитьОбъектXMLЛкс();
#КонецЕсли
ирПортативный.ВыполнитьСерверныйМетодЛкс("УдалитьОбъектXMLЛкс", ПараметрыКоманды);
ДополнительныеСвойства = ПараметрыКоманды.ДополнительныеСвойства;
ОбъектXML = ПараметрыКоманды.ОбъектXML;
Иначе
ЭтоИмитатор = ирОбщий.ЛиТипИмитатораОбъектаЛкс(ТипОбъекта);
Если ЭтоИмитатор Тогда
Объект = Новый (ТипОбъекта);
#Если Сервер И Не Сервер Тогда
Объект = Обработки.ирИмитаторСсылочныйОбъект.Создать();
#КонецЕсли
Объект.ЗагрузитьСнимок(ОбъектXML);
Иначе
Объект = ирОбщий.ОбъектИзСтрокиXMLЛкс(ОбъектXML);
ирОбщий.ВосстановитьДополнительныеСвойстваОбъектаЛкс(Объект, ДополнительныеСвойства);
КонецЕсли;
Объект.Прочитать();
ирОбщий.УдалитьОбъектЛкс(Объект, Ложь, ОтключатьКонтрольЗаписи, БезАвторегистрацииИзменений, ПривилегированныйРежим, ОтключатьЗаписьВерсии);
//Если ЭтоИмитатор Тогда
// #Если Сервер И Не Сервер Тогда
// Объект = Обработки.ирИмитаторСсылочныйОбъект.Создать();
// #КонецЕсли
// ОбъектXML = Объект.Снимок(, Ложь);
//Иначе
// ДополнительныеСвойства = ирОбщий.СериализоватьДополнительныеСвойстваОбъектаЛкс(Объект, Ложь);
// ОбъектXML = ирОбщий.ОбъектВСтрокуXMLЛкс(Объект);
//КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура УстановитьНовыйКодXMLЛкс(ОбъектXML, ПрефиксКода, ТипОбъекта) Экспорт
Объект = Новый (ТипОбъекта);
Объект.ЗагрузитьСнимок(ОбъектXML);
Объект.УстановитьНовыйКод(ПрефиксКода);
ОбъектXML = Объект.Снимок();
КонецПроцедуры
Процедура УстановитьНовыйНомерXMLЛкс(ОбъектXML, ПрефиксНомера, ТипОбъекта) Экспорт
Объект = Новый (ТипОбъекта);
Объект.ЗагрузитьСнимок(ОбъектXML);
Объект.УстановитьНовыйНомер(ПрефиксНомера);
ОбъектXML = Объект.Снимок();
КонецПроцедуры
Функция СкопироватьОбъектЧерезИмитаторЛкс(Знач СнимокОбъекта, ТипОбъекта) Экспорт
Объект = Новый (ТипОбъекта);
Объект.ЗагрузитьСнимок(СнимокОбъекта);
Объект = Объект.Скопировать(Ложь);
СнимокОбъекта = Объект.Снимок();
Возврат СнимокОбъекта;
КонецФункции
Процедура ПрочитатьОбъектЧерезИмитаторЛкс(СнимокОбъекта, ТипОбъекта) Экспорт
Объект = Новый (ТипОбъекта);
#Если Сервер И Не Сервер Тогда
Объект = Обработки.ирИмитаторСсылочныйОбъект.Создать();
#КонецЕсли
Объект.ЗагрузитьСнимок(СнимокОбъекта, Истина);
Объект.Прочитать(Ложь);
СнимокОбъекта = Объект.Снимок(Истина);
КонецПроцедуры
Функция ПолучитьКартуМаршрутаЧерезИмитаторЛкс(СнимокОбъекта, ТипОбъекта) Экспорт
Объект = Новый (ТипОбъекта);
#Если Сервер И Не Сервер Тогда
Объект = Обработки.ирИмитаторСсылочныйОбъект.Создать();
#КонецЕсли
Объект.ЗагрузитьСнимок(СнимокОбъекта, Истина);
Результат = Объект.ПолучитьКартуМаршрута(Ложь);
Результат = Новый ХранилищеЗначения(Результат);
Возврат Результат;
КонецФункции
Процедура УстановитьПометкуУдаленияОбъектаЛкс(ОбъектXML, ДополнительныеСвойства, ЗначениеПометки = Истина, БезАвторегистрацииИзменений = Неопределено, Знач ТипОбъекта,
ПривилегированныйРежим = Неопределено, ОтключатьЗаписьВерсии = Неопределено) Экспорт
ЭтоИмитатор = ирОбщий.ЛиТипИмитатораОбъектаЛкс(ТипОбъекта);
Если ЭтоИмитатор Тогда
Объект = Новый (ТипОбъекта);
#Если Сервер И Не Сервер Тогда
Объект = Обработки.ирИмитаторСсылочныйОбъект.Создать();
#КонецЕсли
Объект.ЗагрузитьСнимок(ОбъектXML);
Иначе
Объект = ирОбщий.ОбъектИзСтрокиXMLЛкс(ОбъектXML);
ирОбщий.ВосстановитьДополнительныеСвойстваОбъектаЛкс(Объект, ДополнительныеСвойства);
КонецЕсли;
Объект.Прочитать(); // Иначе объект будет модифицирован и возникнет ошибка
ирОбщий.УстановитьПометкуУдаленияОбъектаЛкс(Объект, Ложь, ЗначениеПометки, БезАвторегистрацииИзменений, ПривилегированныйРежим, ОтключатьЗаписьВерсии);
Если ЭтоИмитатор Тогда
#Если Сервер И Не Сервер Тогда
Объект = Обработки.ирИмитаторСсылочныйОбъект.Создать();
#КонецЕсли
ОбъектXML = Объект.Снимок(, Ложь);
Иначе
ДополнительныеСвойства = ирОбщий.СериализоватьДополнительныеСвойстваОбъектаЛкс(Объект, Ложь);
ОбъектXML = ирОбщий.ОбъектВСтрокуXMLЛкс(Объект);
КонецЕсли;
КонецПроцедуры
Функция ИмяКомпьютераЛкс() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
Результат = НСтр(СтрокаСоединенияИнформационнойБазы(), "Srvr");
Иначе
Результат = ИмяКомпьютера();
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолучитьИспользованиеСобытияЖурналаРегистрацииКакСтруктуру(ИмяСобытия) Экспорт
Результат = Новый Структура("Использование, ОписаниеИспользования");
ИспользованиеСобытия = ПолучитьИспользованиеСобытияЖурналаРегистрации(ИмяСобытия);
Если ИспользованиеСобытия = Неопределено И ирКэш.ЛиПортативныйРежимЛкс() Тогда
// http://devtool1c.ucoz.ru/forum/2-941-1
ВызватьИсключение "Функция недоступна в портативном варианте на платформе 8.2 из-за ошибки платформы";
КонецЕсли;
Результат.Использование = ИспользованиеСобытия.Использование;
Если ТипЗнч(ИспользованиеСобытия.ОписаниеИспользования) = Тип("Массив") И ИспользованиеСобытия.ОписаниеИспользования.Количество() > 0 Тогда
ОписаниеИспользования = Новый Массив();
Если ТипЗнч(ИспользованиеСобытия.ОписаниеИспользования[0]) = Тип("ОписаниеИспользованияСобытияДоступЖурналаРегистрации") Тогда
СтрокаКлючей = "Объект, ПоляРегистрации, ПоляДоступа";
ИначеЕсли ТипЗнч(ИспользованиеСобытия.ОписаниеИспользования[0]) = Тип("ОписаниеИспользованияСобытияОтказВДоступеЖурналаРегистрации") Тогда
СтрокаКлючей = "Объект, ПоляРегистрации";
Иначе
//ВызватьИсключение "Неизвестный тип " + ТипЗнч(ИспользованиеСобытия.ОписаниеИспользования[0]);
КонецЕсли;
Для Каждого ЭлементОписания Из ИспользованиеСобытия.ОписаниеИспользования Цикл
ЭлементМассива = Новый Структура(СтрокаКлючей);
ЗаполнитьЗначенияСвойств(ЭлементМассива, ЭлементОписания);
ОписаниеИспользования.Добавить(ЭлементМассива);
КонецЦикла;
Результат.ОписаниеИспользования = ОписаниеИспользования;
Иначе
Результат.ОписаниеИспользования = Неопределено;
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура УстановитьИспользованиеСобытияЖурналаРегистрацииПоСтруктуре(ИмяСобытия, пИспользованиеСобытия) Экспорт
ИспользованиеСобытия = Новый ИспользованиеСобытияЖурналаРегистрации;
ИспользованиеСобытия.Использование = пИспользованиеСобытия.Использование;
пОписаниеИспользования = Неопределено;
пИспользованиеСобытия.Свойство("ОписаниеИспользования", пОписаниеИспользования);
Если Истина
И ТипЗнч(пОписаниеИспользования) = Тип("Массив")
И пОписаниеИспользования.Количество() > 0
И (Ложь
Или ИмяСобытия = "_$Access$_.Access"
Или ИмяСобытия = "_$Access$_.AccessDenied")
Тогда
ТипОписанияСтрокой = ?(ИмяСобытия = "_$Access$_.Access", "ОписаниеИспользованияСобытияДоступЖурналаРегистрации","ОписаниеИспользованияСобытияОтказВДоступеЖурналаРегистрации");
ОписаниеИспользования = Новый Массив();
Для Каждого пЭлементОписания Из пОписаниеИспользования Цикл
ЭлементОписания = Новый(ТипОписанияСтрокой);
ЗаполнитьЗначенияСвойств(ЭлементОписания, пЭлементОписания);
ОписаниеИспользования.Добавить(ЭлементОписания);
КонецЦикла;
ИспользованиеСобытия.ОписаниеИспользования = ОписаниеИспользования;
КонецЕсли;
УстановитьИспользованиеСобытияЖурналаРегистрации(ИмяСобытия, ИспользованиеСобытия)
КонецПроцедуры
Функция ПолучитьПараметрыПроцессаАгентаСервера(выхИдентификаторПроцесса = Неопределено, выхКомманднаяСтрока = Неопределено, выхИмяСлужбы = Неопределено) Экспорт
выхИмяСлужбы = Неопределено;
РабочийПроцесс = ирОбщий.ПолучитьПроцессОСЛкс("текущий",,, Ложь);
Если ТипЗнч(РабочийПроцесс) = Тип("Строка") Тогда
ирОбщий.СообщитьЛкс("Ошибка обращения к процессу ОС рабочего процесса: " + РабочийПроцесс);
Возврат Неопределено;
КонецЕсли;
КомпьютерКластера = ирОбщий.ИмяКомпьютераКластераЛкс();
Если Не ЗначениеЗаполнено(КомпьютерКластера) Тогда
Возврат Неопределено;
КонецЕсли;
Попытка
WMIЛокатор = ирКэш.ПолучитьCOMОбъектWMIЛкс(КомпьютерКластера);
Исключение
ирОбщий.СообщитьЛкс("У пользователя рабочего процесса нет прав на подключение к WMI кластера: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат Неопределено;
КонецПопытки;
выхИдентификаторПроцесса = РабочийПроцесс.ParentProcessId;
ПроцессАгента = ирОбщий.ПолучитьПроцессОСЛкс(выхИдентификаторПроцесса,, КомпьютерКластера);
Если ТипЗнч(ПроцессАгента) = Тип("COMОбъект") Тогда
выхКомманднаяСтрока = ПроцессАгента.CommandLine;
ТекстЗапросаWQL = "Select * from Win32_Service Where ProcessId = " + XMLСтрока(выхИдентификаторПроцесса);
ВыборкаСистемныхСлужб = WMIЛокатор.ExecQuery(ТекстЗапросаWQL);
Для Каждого лСистемнаяСлужба Из ВыборкаСистемныхСлужб Цикл
СистемнаяСлужба = лСистемнаяСлужба;
Прервать;
КонецЦикла;
КонецЕсли;
Если СистемнаяСлужба = Неопределено Тогда
//ирОбщий.СообщитьЛкс("Не удалось определить имя системной службы агента сервера приложений", СтатусСообщения.Внимание);
Возврат Неопределено;
КонецЕсли;
выхИмяСлужбы = СистемнаяСлужба.Name;
Возврат выхИдентификаторПроцесса;
КонецФункции
// Результат - Булево - надо ли перезапускать сеанс
Функция ПриНачалеРаботыСистемыРасширениеЛкс(ПараметрЗапуска) Экспорт
// Здесь не следует обращить к другим модулям в дежурной части, т.к. код должен очень быстро выполняться
Если Истина
И ПравоДоступа("Администрирование", Метаданные)
И ПравоДоступа("ТолстыйКлиент", Метаданные)
И Не ЛиЕстьИнтерактивныйДоступКИнструментамЛкс()
И ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() > 0
Тогда
НадоДобавлятьРоль = Ложь;
Если Найти(НРег(ПараметрЗапуска), НРег("ВключитьИР")) > 0 Тогда
НадоДобавлятьРоль = Истина;
ИначеЕсли Не РольДоступна("ирПользователь") Тогда
ДобавлятьРольИРВсемАдминистраторам = ирОбщий.ВосстановитьЗначениеЛкс("ДобавлятьРольИРВсемАдминистраторам", Истина);
Если ДобавлятьРольИРВсемАдминистраторам = Ложь Тогда
НадоДобавлятьРоль = Ложь;
ИначеЕсли ДобавлятьРольИРВсемАдминистраторам = Неопределено Тогда
ПользователиИБ = ПользователиИнформационнойБазы.ПолучитьПользователей();
РольРазработчик = Метаданные.Роли.ирРазработчик;
НадоДобавлятьРоль = Истина;
Для Каждого ПользовательИБ Из ПользователиИБ Цикл
#Если Сервер И Не Сервер Тогда
ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
#КонецЕсли
Если ПользовательИБ.Роли.Содержит(РольРазработчик) Тогда
НадоДобавлятьРоль = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Иначе
НадоДобавлятьРоль = Истина;
КонецЕсли;
КонецЕсли;
Если НадоДобавлятьРоль Тогда
ирОбщий.ДобавитьТекущемуПользователюРолиИРЛкс();
Возврат Истина;
КонецЕсли;
КонецЕсли;
Возврат Ложь;
КонецФункции
Функция ИнфоСервераПриложений() Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
Если ирПортативный.ЛиСерверныйМодульДоступенЛкс(Ложь) Тогда
ПараметрыМетода = Новый Структура("Результат");
#Если Сервер И Не Сервер Тогда
Обработки.ирПортативныйСервер.Создать().ИнфоСервераПриложений();
#КонецЕсли
ирПортативный.ВыполнитьСерверныйМетодЛкс("ИнфоСервераПриложений", ПараметрыМетода);
ИнфоСервера = ПараметрыМетода.Результат;
Иначе
ИнфоСервера = "";
КонецЕсли;
Иначе
ИнфоСервера =
"Сервер. ОС: " + ирОбщий.ОписаниеОСЛкс() + "
|Сервер. Процесс: " + ?(ирКэш.Это64битныйПроцессЛкс(), "64", "32") + "б";
Если ирКэш.ЛиПлатформаWindowsЛкс() Тогда
СтрокаЗапускаПроцесса = "";
ирСервер.ПолучитьПараметрыПроцессаАгентаСервера(, СтрокаЗапускаПроцесса);
ИнфоСервера = ИнфоСервера + Символы.ПС + "Сервер. Отладка: " + ирОбщий.РежимОтладкиИзКоманднойСтрокиЛкс(СтрокаЗапускаПроцесса);
КонецЕсли;
КонецЕсли;
Возврат ИнфоСервера;
КонецФункции
Функция ЗапуститьФоновоеЗаданиеЛкс(Знач ИмяМетода, Знач Параметры = Неопределено, Знач КлючЗадания = Неопределено, Знач НаименованиеЗадания = "") Экспорт
Если Истина
И ирКэш.ЛиПортативныйРежимЛкс()
И ирПортативный.ЛиСерверныйМодульДоступенЛкс(Ложь)
Тогда
ПараметрыМетода = Новый Структура("Результат");
ПараметрыМетода.Вставить("ИмяМетода", ИмяМетода);
ПараметрыМетода.Вставить("Параметры", Параметры);
ПараметрыМетода.Вставить("КлючЗадания", КлючЗадания);
ПараметрыМетода.Вставить("НаименованиеЗадания", НаименованиеЗадания);
#Если Сервер И Не Сервер Тогда
Обработки.ирПортативныйСервер.Создать().ЗапуститьФоновоеЗадание();
#КонецЕсли
ирПортативный.ВыполнитьСерверныйМетодЛкс("ЗапуститьФоновоеЗадание", ПараметрыМетода);
Результат = ПараметрыМетода.Результат;
Иначе
ирОбщий.ДобавитьТекущемуПользователюРолиИРЛкс();
ФоновоеЗадание = ФоновыеЗадания.Выполнить(ИмяМетода, Параметры, КлючЗадания, НаименованиеЗадания);
Результат = ФоновоеЗадание.УникальныйИдентификатор;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЗаписатьОжибкуЖР() Экспорт
ЗаписьЖурналаРегистрации("ошибка", УровеньЖурналаРегистрации.Ошибка);
КонецФункции
Функция СписокДопСвойствОбъектаБСПЛкс(СсылкаОбъекта) Экспорт
СписокСвойств = Новый Массив;
МодульУправлениеСвойствами = Вычислить("УправлениеСвойствами");
#Если Сервер И Не Сервер Тогда
МодульУправлениеСвойствами = УправлениеСвойствами;
#КонецЕсли
Если ирОбщий.МетодРеализованЛкс(МодульУправлениеСвойствами, "СвойстваОбъекта") Тогда
// БСП 2.4+
СписокСвойств = МодульУправлениеСвойствами.СвойстваОбъекта(СсылкаОбъекта);
//ИначеЕсли ирОбщий.МетодРеализованЛкс(МодульУправлениеСвойствами, "ПолучитьСписокСвойств") Тогда
// // БСП 2.3-
// // https://www.hostedredmine.com/issues/917471
// СписокСвойств = МодульУправлениеСвойствами.ПолучитьСписокСвойств(СсылкаОбъекта);
// Здесь полностью другие свойства свойств https://www.hostedredmine.com/issues/921992
КонецЕсли;
Возврат СписокСвойств;
КонецФункции
Функция СоздатьКаталогТрассыПоПользователюЛкс() Экспорт
Каталог = КаталогТрассыПоПользователюЛкс();
СоздатьКаталог(Каталог);
Возврат Каталог;
КонецФункции
Функция КаталогТрассыПоПользователюЛкс() Экспорт
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
Каталог = КаталогВременныхФайлов() + ирОбщий.ИдентификаторИзПредставленияЛкс(СтрокаСоединения) + "\" + ИмяПользователя();
Возврат Каталог;
КонецФункции
Функция ТаблицаВсехТаблицБДЛкс() Экспорт
Возврат ирКэш.ТаблицаВсехТаблицБДЛкс();
КонецФункции
Функция ВыполнитьЗапросСтатистикиПоТаблицамЛкс(БазыДанных, Параметры, ИмяКолонкиКоличества, АдресРезультата = "") Экспорт
Результат = ирОбщий.ВыполнитьЗапросСтатистикиПоТаблицамЛкс(БазыДанных, Параметры, ИмяКолонкиКоличества);
Если ЗначениеЗаполнено(АдресРезультата) Тогда
ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ВыполнитьЗапросЛкс(ТекстЗапроса, Параметры = Неопределено, АдресРезультата = "", выхТекущаяДата = Неопределено) Экспорт
Результат = ирОбщий.ВыполнитьЗапросЛкс(ТекстЗапроса, Параметры);
Если ЗначениеЗаполнено(АдресРезультата) Тогда
ПоместитьВоВременноеХранилище(Результат, АдресРезультата);
КонецЕсли;
выхТекущаяДата = ТекущаяДата();
Возврат Результат;
КонецФункции
///////////////////////////////////////////////////
// Управляемые формы
// РежимИмяСиноним - Булево - Истина - Имя
Функция НастроитьАвтоТаблицуФормыДинамическогоСпискаЛкс(ЭтаФорма, ОсновнойЭУ, ПолноеИмяТаблицыБД, РежимИмяСиноним = Ложь, ПредельноеКоличествоВидимыхКолонок = 10, СоединенныеРегистры = Неопределено) Экспорт
#Если Сервер И Не Сервер Тогда
ОсновнойЭУ = Элементы.ДинамическийСписок;
СоединенныеРегистры = Новый Массив;
#КонецЕсли
ДинамическийСписок = ирОбщий.ДанныеЭлементаФормыЛкс(ОсновнойЭУ);
ДинамическийСписок.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ИмяТаблицы", ПолноеИмяТаблицыБД);
ОбъектМД = ирОбщий.ОбъектМДПоПолномуИмениТаблицыБДЛкс(ПолноеИмяТаблицыБД, Истина);
Если ОбъектМД = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
ПолноеИмяМД = ОбъектМД.ПолноеИмя();
ТипТаблицы = ирОбщий.ТипТаблицыБДЛкс(ПолноеИмяТаблицыБД);
КорневойТип = ирОбщий.ПервыйФрагментЛкс(ПолноеИмяМД);
////СтруктураХраненияПолей = ирКэш.СтруктураХраненияБДЛкс().НайтиСтроки(Новый Структура("Назначение, Метаданные", "Основная", ПолноеИмяМД))[0].Поля;
//ФильтрМетаданных = Новый Массив;
//ФильтрМетаданных.Добавить(ПолноеИмяМД);
//СтруктураХраненияТаблицы = ПолучитьСтруктуруХраненияБазыДанных(ФильтрМетаданных).НайтиСтроки(Новый Структура("Назначение, Метаданные", "Основная", ПолноеИмяМД))[0];
//СтруктураХраненияПолей = СтруктураХраненияТаблицы.Поля;
КолонкиТП = ОсновнойЭУ.ПодчиненныеЭлементы;
ПутьКДаннымСписка = ОсновнойЭУ.ПутьКДанным;
ДинамическийСписок.ПроизвольныйЗапрос = Истина;
ДинамическийСписок.ДинамическоеСчитываниеДанных = Истина;
ТекстДопПоля = "";
Если ирОбщий.ЛиМетаданныеСсылочногоОбъектаЛкс(ОбъектМД) Тогда
ТекстДопПоля = ТекстДопПоля + ", """" КАК ИдентификаторСсылкиЛкс";
КонецЕсли;
ИсточникиДанных = Новый Структура;
ПсевдонимОсновнойТаблицы = "_Т";
ТекстИсточников = " ИЗ " + ПолноеИмяТаблицыБД + " КАК " + ПсевдонимОсновнойТаблицы;
ИсточникиДанных.Вставить(ПсевдонимОсновнойТаблицы, ПолноеИмяТаблицыБД);
Для Каждого СоединенныйРегистр Из СоединенныеРегистры Цикл
ТекстИсточников = ТекстИсточников + "
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений." + СоединенныйРегистр + " КАК " + СоединенныйРегистр + "
|ПО _Т.Ссылка = " + СоединенныйРегистр + "." + Метаданные.РегистрыСведений[СоединенныйРегистр].Измерения[0].Имя;
ИсточникиДанных.Вставить(СоединенныйРегистр, "РегистрСведений." + СоединенныйРегистр);
КонецЦикла;
СкрытыеПоля = Новый Массив;
Для Каждого КлючИЗначение Из ИсточникиДанных Цикл
ПоляТаблицыБД = ирКэш.ПоляТаблицыБДЛкс(КлючИЗначение.Значение);
ПутьКПолю = КлючИЗначение.Ключ + ".";
Если ирОбщий.ЛиМетаданныеВнешнегоИсточникаДанныхЛкс(ОбъектМД) Тогда
// Антибаг платформы 8.3.18 теряются значения NULL https://www.hostedredmine.com/issues/925439
#Если Сервер И Не Сервер Тогда
ОбъектМД = Метаданные.ВнешниеИсточникиДанных.Tropic.Таблицы.dbo_Dorem;
#КонецЕсли
Для Каждого ПолеМД Из ОбъектМД.Поля Цикл
Если ПолеМД.РазрешитьNULL Тогда
ИмяПоля = ПолеМД.Имя + "_ЭтоNULL_";
СкрытыеПоля.Добавить(ИмяПоля);
ТекстДопПоля = ТекстДопПоля + ",
|" + ПутьКПолю + ПолеМД.Имя + " ЕСТЬ NULL КАК " + ИмяПоля;
ДинамическийСписок.УстановитьОбязательноеИспользование(ИмяПоля, Истина);
КонецЕсли;
КонецЦикла;
Продолжить;
КонецЕсли;
#Если Сервер И Не Сервер Тогда
ОбъектМД = Метаданные.Справочники.Валюты;
#КонецЕсли
Для Каждого ПолеТаблицы Из ПоляТаблицыБД Цикл
Если Истина
И ПолеТаблицы.ТипЗначения.Типы().Количество() > 1
И НЕ (Истина
// Антибаг платформы http://www.hostedredmine.com/issues/882688, http://www.hostedredmine.com/issues/882690
И ПолеТаблицы.Имя = "ВедущаяЗадача"
И ирОбщий.ЛиКорневойТипБизнесПроцессаЛкс(ТипТаблицы)
И Метаданные.Задачи.Количество() > 1)
Тогда
ТекстДопПоля = ТекстДопПоля + ",
|ТИПЗНАЧЕНИЯ(" + ПутьКПолю + ПолеТаблицы.Имя + ") КАК " + ПолеТаблицы.Имя + "_ТипЗначения_";
КонецЕсли;
Если Истина
И КлючИЗначение.Значение = ПолноеИмяТаблицыБД
И ПолеТаблицы.РежимПароля
И ирКэш.НомерВерсииПлатформыЛкс() >= 803010 // Иначе мы не сможем маскировать текст при выводе
Тогда
ТекстДопПоля = ТекстДопПоля + ", """"+" + ПутьКПолю + ПолеТаблицы.Имя + " КАК " + ПолеТаблицы.Имя; // Запароленные поля по умолчанию игнорируются
КонецЕсли;
КонецЦикла;
КонецЦикла;
ТекстЗапроса = "ВЫБРАТЬ *" + ТекстДопПоля + ТекстИсточников;
ДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
ПоляСписка = ЭтаФорма.ПолучитьРеквизиты(ПутьКДаннымСписка);
Пока ОсновнойЭУ.ПодчиненныеЭлементы.Количество() > 0 Цикл
Попытка
ЭтаФорма.Элементы.Удалить(ОсновнойЭУ.ПодчиненныеЭлементы[0]);
Исключение
Пустышка = 0; // Для отладки
КонецПопытки;
КонецЦикла;
КоличествоВидимыхКолонок = 0;
Для Каждого ПолеСписка Из ПоляСписка Цикл
#Если Сервер И Не Сервер Тогда
ПолеСписка = Новый РеквизитФормы;
#КонецЕсли
Если Ложь
Или ПолеСписка.ТипЗначения.СодержитТип(Тип("Картинка"))
Или ПолеСписка.ТипЗначения.СодержитТип(Тип("КомпоновщикНастроекКомпоновкиДанных"))
Или ПолеСписка.ТипЗначения.СодержитТип(Тип("ПорядокКомпоновкиДанных"))
Или ПолеСписка.ТипЗначения.СодержитТип(Тип("ОтборКомпоновкиДанных"))
Или ПолеСписка.ТипЗначения.СодержитТип(Тип("ПоляГруппировкиКомпоновкиДанных"))
Или ПолеСписка.ТипЗначения.СодержитТип(Тип("ЗначенияПараметровДанныхКомпоновкиДанных"))
Или ПолеСписка.ТипЗначения.СодержитТип(Тип("УсловноеОформлениеКомпоновкиДанных"))
Или СкрытыеПоля.Найти(ПолеСписка.Имя) <> Неопределено // Так ячейка данных не будет попадать в коллекцию строки
Тогда
Продолжить;
КонецЕсли;
ИмяКолонки = ПолеСписка.Имя;
ИмяПоля = ОсновнойЭУ.Имя + ИмяКолонки;
Колонка = КолонкиТП.Найти(ИмяПоля);
Если Колонка = Неопределено Тогда
СуществующийЭлемент = ЭтаФорма.Элементы.Найти(ИмяПоля);
Если СуществующийЭлемент <> Неопределено Тогда
// https://www.hostedredmine.com/issues/917823
// Удалить или переименовать его нельзя
ИмяПоля = "_" + ИмяПоля;
КонецЕсли;
Колонка = ЭтаФорма.Элементы.Добавить(ИмяПоля, Тип("ПолеФормы"), ОсновнойЭУ);
Колонка.Вид = ВидПоляФормы.ПолеНадписи;
ПутьКДаннымПоля = ПутьКДаннымСписка + "." + ИмяКолонки;
Попытка
Колонка.ПутьКДанным = ПутьКДаннымПоля;
Исключение
// Например при ИмяКолонки = "ВерсияДанных"
КонецПопытки;
Если ИмяКолонки = "Ссылка" Тогда
ДинамическийСписок.УстановитьОбязательноеИспользование("Ссылка", Истина);
КонецЕсли;
КонецЕсли;
//Колонка.ТекстШапки = ЭлементОтбора.Представление;
//Если ТипТаблицы <> "Перечисление" Тогда
// ДанныеПодключены = Ложь;
// Если Истина
// И ЭлементОтбора.ТипЗначения.СодержитТип(Тип("Булево"))
// И ЭлементОтбора.ТипЗначения.Типы().Количество() = 1
// Тогда
// Колонка.УстановитьЭлементУправления(Тип("Флажок"));
// Попытка
// Колонка.ДанныеФлажка = ИмяКолонки;
// ДанныеПодключены = Истина;
// Исключение
// ОписаниеОшибки = ОписаниеОшибки(); // Для отладки
// КонецПопытки;
// Иначе
// Колонка.УстановитьЭлементУправления(Тип("ПолеВвода"));
// Попытка
// Колонка.Данные = ИмяКолонки;
// ДанныеПодключены = Истина;
// Исключение
// ОписаниеОшибки = ОписаниеОшибки(); // Для отладки
// КонецПопытки;
// КонецЕсли;
// Если Не ДанныеПодключены Тогда
// Колонка.Видимость = Ложь;
// КонецЕсли;
//КонецЕсли;
//// Закомментировал 13.02.2011
////Если ЗначениеЗаполнено(Колонка.Данные) Тогда
//// Колонка.Имя = Колонка.Данные;
////КонецЕсли;
//МетаданныеПоля = ЭлементОтбора.Метаданные;
//Если МетаданныеПоля <> Неопределено Тогда
// Попытка
// Колонка.ПодсказкаВШапке = МетаданныеПоля.Подсказка;
// Исключение
// // У графы журнала нет подсказки
// КонецПопытки;
//КонецЕсли;
//// Антибаг платформы 8.2-8.3.6 https://partners.v8.1c.ru/forum/t/1337995/m/1337995
//Если Истина
// И ирКэш.НомерВерсииПлатформыЛкс() < 803008
// И ЭлементОтбора.ТипЗначения.СодержитТип(Тип("УникальныйИдентификатор"))
//Тогда
// ирОбщий.СообщитьЛкс("Колонка """ + ИмяКолонки + """ типа УникальныйИдентификатор не будет отображаться из-за ошибки платформы");
// КолонкиТП.Удалить(Колонка);
// Продолжить;
//КонецЕсли;
Если КоличествоВидимыхКолонок > ПредельноеКоличествоВидимыхКолонок Тогда
//Колонка.ПользовательскаяВидимость = Ложь; // Не нашел способа скрыть колонку, чтобы пользователь через "Изменить форму" смог ее включить
Иначе
КоличествоВидимыхКолонок = КоличествоВидимыхКолонок + 1;
КонецЕсли;
КонецЦикла;
//НовыйПорядок = ирОбщий.ВыражениеПорядкаКомпоновкиНаЯзыкеЗапросовЛкс(ДинамическийСписок.КомпоновщикНастроек.ПользовательскиеНастройки.Порядок);
//Если Не ЗначениеЗаполнено(НовыйПорядок) Тогда
// // Обязательную установку делаем, чтобы в шапках появились индикаторы сортировки и чтобы он стал виден другим механизмам
// ирОбщий.СкопироватьПорядокЛюбойЛкс(ДинамическийСписок.КомпоновщикНастроек.ПользовательскиеНастройки.Порядок, ДинамическийСписок.Порядок);
//КонецЕсли;
// Порядок по возрастанию важности
ИменаВажныхКолонок = Новый Массив;
ИменаВажныхКолонок.Добавить("Ссылка");
ИменаВажныхКолонок.Добавить("Дата");
ИменаВажныхКолонок.Добавить("Период");
ИменаВажныхКолонок.Добавить("Код");
ИменаВажныхКолонок.Добавить("Наименование");
ИменаВажныхКолонок.Добавить("НомерСтроки");
ИменаВажныхКолонок.Добавить("Регистратор");
Для Каждого ИмяВажнойКолонки Из ИменаВажныхКолонок Цикл
ПолеФормы = ОсновнойЭУ.ПодчиненныеЭлементы.Найти(ОсновнойЭУ.Имя + ИмяВажнойКолонки);
Если ПолеФормы <> Неопределено Тогда
ЭтаФорма.Элементы.Переместить(ПолеФормы, ОсновнойЭУ, ОсновнойЭУ.ПодчиненныеЭлементы[0]);
КонецЕсли;
КонецЦикла;
ирОбщий.НастроитьЗаголовкиАвтоТаблицыФормыДинамическогоСпискаЛкс(ОсновнойЭУ, ПолноеИмяТаблицыБД, РежимИмяСиноним);
ПолеФормы = ОсновнойЭУ.ПодчиненныеЭлементы.Найти(ОсновнойЭУ.Имя + "Предопределенный");
Если ПолеФормы <> Неопределено Тогда
ПолеФормы.КартинкаШапки = ирКэш.КартинкаПоИмениЛкс("ирПредопределенный");
ПолеФормы.Ширина = 1;
ПолеФормы.АвтоМаксимальнаяШирина = Ложь;
ПолеФормы.РастягиватьПоГоризонтали = Ложь;
КонецЕсли;
ПолеФормы = ОсновнойЭУ.ПодчиненныеЭлементы.Найти(ОсновнойЭУ.Имя + "ПометкаУдаления");
Если ПолеФормы <> Неопределено Тогда
ПолеФормы.КартинкаШапки = ирКэш.КартинкаПоИмениЛкс("ПометитьНаУдаление");
ПолеФормы.Ширина = 1;
ПолеФормы.АвтоМаксимальнаяШирина = Ложь;
ПолеФормы.РастягиватьПоГоризонтали = Ложь;
КонецЕсли;
ПолеФормы = ОсновнойЭУ.ПодчиненныеЭлементы.Найти(ОсновнойЭУ.Имя + "ЭтоГруппа");
Если ПолеФормы <> Неопределено Тогда
ПолеФормы.КартинкаШапки = ирКэш.КартинкаПоИмениЛкс("ирПапка");
ПолеФормы.Ширина = 1;
ПолеФормы.АвтоМаксимальнаяШирина = Ложь;
ПолеФормы.РастягиватьПоГоризонтали = Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Процедура УправляемаяФормариСозданииЛкс(Знач ЭтаФорма, Отказ, СтандартнаяОбработка, Знач ПоляДляЗапоминанияТипов = Неопределено, Знач ПоляФормыСИсториейВыбора = Неопределено) Экспорт
Если ирКэш.ЛиПортативныйРежимЛкс() Тогда
ирОбщий.СообщитьЛкс("Управляемые формы инструментов не поддерживают работу в портативном режиме");
Отказ = Истина;
Возврат;
КонецЕсли;
Если ПоляФормыСИсториейВыбора <> Неопределено Тогда
Если ТипЗнч(ПоляФормыСИсториейВыбора) = Тип("Массив") Тогда
МассивПолей = ПоляФормыСИсториейВыбора;
Иначе
МассивПолей = Новый Массив;
МассивПолей.Добавить(ПоляФормыСИсториейВыбора);
КонецЕсли;
ПоляФормыСИсториейВыбора = МассивПолей;
Для Каждого ПолеФормыСИсториейВыбора Из ПоляФормыСИсториейВыбора Цикл
ирСервер.ПолеФормыСИсториейВыбора_ЗаполнитьСписокВыбораЛкс(ПолеФормыСИсториейВыбора, ЭтаФорма.ИмяФормы);
КонецЦикла;
КонецЕсли;
ИмяКорневогоРеквизита = "мСлужебныеДанные";
ДобавляемыеРеквизиты = Новый Массив();
КорневойРеквизитФормы = Новый РеквизитФормы(ИмяКорневогоРеквизита, Новый ОписаниеТипов);
ДобавляемыеРеквизиты.Добавить(КорневойРеквизитФормы);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
УправляемаяФорма_ОбновитьСлужебныеДанныеЛкс(ЭтаФорма, ПоляДляЗапоминанияТипов, ПоляФормыСИсториейВыбора);
КонецПроцедуры
Процедура УправляемаяФорма_ОбновитьСлужебныеДанныеЛкс(Знач ЭтаФорма, Знач ПоляДляЗапоминанияТипов = Неопределено, Знач ПоляСИсториейВыбора = Неопределено) Экспорт
СтруктураПутиКДанным = Новый Структура();
ЗаполнитьСоответствиеПутиКДаннымПодчиненныхЭлементовФормыЛкс(ЭтаФорма, СтруктураПутиКДанным);
ФиксированнаяСтруктураПутиКДанным = Новый ФиксированнаяСтруктура(СтруктураПутиКДанным);
СтруктураТипыЗначений = Новый Структура;
МассивПолей = Новый Массив();
Если ПоляДляЗапоминанияТипов <> Неопределено Тогда
Если ТипЗнч(ПоляДляЗапоминанияТипов) = Тип("Массив") Тогда
ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(ПоляДляЗапоминанияТипов, МассивПолей);
Иначе
МассивПолей.Добавить(ПоляДляЗапоминанияТипов);
КонецЕсли;
КонецЕсли;
Если ТипЗнч(ПоляСИсториейВыбора) = Тип("Массив") Тогда
ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(ПоляСИсториейВыбора, МассивПолей);
Иначе
МассивПолей.Добавить(ПоляСИсториейВыбора);
КонецЕсли;
ПоляДляЗапоминанияТипов = МассивПолей;
Для Каждого Поле Из ПоляДляЗапоминанияТипов Цикл
СтруктураТипыЗначений.Вставить(Поле.Имя, ПолучитьТипЗначенияПоляФормыЛкс(Поле, ЭтаФорма));
КонецЦикла;
КорневыеРеквизиты = ЭтаФорма.ПолучитьРеквизиты();
СтруктураСохраняемыеДанные = Новый Структура();
ДинамическиеСписки = Новый Структура();
Для Каждого КорневойРеквизит Из КорневыеРеквизиты Цикл
Если КорневойРеквизит.СохраняемыеДанные Тогда
СтруктураСохраняемыеДанные.Вставить(КорневойРеквизит.Имя);
КонецЕсли;
Если КорневойРеквизит.ТипЗначения.СодержитТип(Тип("ДинамическийСписок")) Тогда
ОписаниеСписка = Новый Структура;
ОписаниеСписка.Вставить("ОсновнаяТаблица", ЭтаФорма[КорневойРеквизит.Имя].ОсновнаяТаблица);
ОписаниеСписка.Вставить("ТекстЗапроса", ЭтаФорма[КорневойРеквизит.Имя].ТекстЗапроса);
ДинамическиеСписки.Вставить(КорневойРеквизит.Имя, ОписаниеСписка);
КонецЕсли;
КонецЦикла;
СтруктураСохраняемыеДанные = Новый ФиксированнаяСтруктура(СтруктураСохраняемыеДанные);
ДинамическиеСписки = Новый ФиксированнаяСтруктура(ДинамическиеСписки);
Попытка
НеготовыеСтраницы = ЭтаФорма.мСлужебныеДанные.НеготовыеСтраницы;
Исключение
НеготовыеСтраницы = Новый СписокЗначений;
КонецПопытки;
Для Каждого Элемент Из ЭтаФорма.Элементы Цикл
//Если Истина
// И ТипЗнч(Элемент) = Тип("ГруппаФормы")
// И Элемент.Вид = ВидГруппыФормы.Страница
// И Найти(Элемент.Имя, "Страница") = 1
//Тогда
// НеготовыеСтраницы.Добавить(Элемент.Имя);
//КонецЕсли;
Если Истина
И ТипЗнч(Элемент) = Тип("ПолеФормы")
И Не Элемент.ТолькоПросмотр
И Элемент.Доступность
Тогда
ТипЗначения = ПолучитьТипЗначенияПоляФормыЛкс(Элемент, ЭтаФорма);
#Если Сервер И Не Сервер Тогда
ТипЗначения = Новый ОписаниеТипов;
#КонецЕсли
Если ТипЗначения <> Неопределено Тогда
Типы = ТипЗначения.Типы();
Если Ложь
Или Типы.Количество() > 1
Или Типы.Количество() = 0
Тогда
СтруктураТипыЗначений.Вставить(Элемент.Имя, ТипЗначения);
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Истина
И ТипЗнч(Элемент) = Тип("ТаблицаФормы")
Тогда
ТипЗначения = ПолучитьТипЗначенияПоляФормыЛкс(Элемент, ЭтаФорма);
#Если Сервер И Не Сервер Тогда
ТипЗначения = Новый ОписаниеТипов;
#КонецЕсли
СтруктураТипыЗначений.Вставить(Элемент.Имя, ТипЗначения);
КонецЕсли;
КонецЦикла;
ФиксированнаяСтруктураТипыЗначений = Новый ФиксированнаяСтруктура(СтруктураТипыЗначений);
СтруктураКорневогоРеквизита = Новый Структура();
СтруктураКорневогоРеквизита.Вставить("ПутиКДанным", ФиксированнаяСтруктураПутиКДанным);
СтруктураКорневогоРеквизита.Вставить("СохраняемыеДанные", СтруктураСохраняемыеДанные);
СтруктураКорневогоРеквизита.Вставить("ТипыЗначений", ФиксированнаяСтруктураТипыЗначений);
СтруктураКорневогоРеквизита.Вставить("ДинамическиеСписки", ДинамическиеСписки);
СтруктураКорневогоРеквизита.Вставить("НеготовыеСтраницы", НеготовыеСтраницы);
ЭтаФорма.мСлужебныеДанные = Новый ФиксированнаяСтруктура(СтруктураКорневогоРеквизита);
Возврат;
// Очень долго на формах с больших количеством реквизитов
// Преобразуем автозаголовки в статические заголовки для возможности поиска https://partners.v8.1c.ru/forum/topic/1074579
СоответствиеРеквизитов = СоответствиеРеквизитовФормы(ЭтаФорма);
Для Каждого ЭлементФормы Из ЭтаФорма.Элементы Цикл
СтруктураСвойств = Новый Структура("ПутьКДанным, Заголовок");
ЗаполнитьЗначенияСвойств(СтруктураСвойств, ЭлементФормы);
Если Истина
И ЗначениеЗаполнено(СтруктураСвойств.ПутьКДанным)
И Не ЗначениеЗаполнено(СтруктураСвойств.Заголовок)
Тогда
ЭлементФормы.Заголовок = СоответствиеРеквизитов[ЭлементФормы.ПутьКДанным].Заголовок;
КонецЕсли;
Если Истина
И Типзнч(ЭлементФормы) = Тип("КнопкаФормы")
И ЗначениеЗаполнено(ЭлементФормы.ИмяКоманды)
И Не ЗначениеЗаполнено(ЭлементФормы.Заголовок)
Тогда
КомандаФормы = ЭтаФорма.Команды.Найти(ЭлементФормы.Имя);
Если КомандаФормы <> Неопределено Тогда
ЭлементФормы.Заголовок = КомандаФормы.Заголовок;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция СоответствиеРеквизитовФормы(ЭтаФорма, Знач ПутьКРодителю = "", Знач СоответствиеРеквизитов = Неопределено) Экспорт
Если СоответствиеРеквизитов = Неопределено Тогда
СоответствиеРеквизитов = Новый Соответствие;
КонецЕсли;
Попытка
РеквизитыФормы = ЭтаФорма.ПолучитьРеквизиты(ПутьКРодителю);
Исключение
Возврат СоответствиеРеквизитов;
КонецПопытки;
Для Каждого РеквизитФормы Из РеквизитыФормы Цикл
ПолноеИмяРеквизита = РеквизитФормы.Имя;
Если ЗначениеЗаполнено(РеквизитФормы.Путь) Тогда
ПолноеИмяРеквизита = РеквизитФормы.Путь + "." + ПолноеИмяРеквизита;
КонецЕсли;
СоответствиеРеквизитов.Вставить(ПолноеИмяРеквизита, РеквизитФормы);
СоответствиеРеквизитовФормы(ЭтаФорма, ПолноеИмяРеквизита, СоответствиеРеквизитов);
КонецЦикла;
Возврат СоответствиеРеквизитов;
КонецФункции
// Заполнить соответствие пути К данным подчиненных элементов формы иис
//
// Параметры:
// НачальныйЭлемент - <тип> -
// СтруктураПутиКДанным - <тип> -
//
Процедура ЗаполнитьСоответствиеПутиКДаннымПодчиненныхЭлементовФормыЛкс(НачальныйЭлемент, СтруктураПутиКДанным, Знач ЭтаФорма = Неопределено) Экспорт
Если ТипЗнч(НачальныйЭлемент) = Тип("УправляемаяФорма") Тогда
ЭтаФорма = НачальныйЭлемент;
КонецЕсли;
Для Каждого Поле Из НачальныйЭлемент.ПодчиненныеЭлементы Цикл
Если ТипЗнч(Поле) = Тип("ПолеФормы") Тогда
Если Поле.ПутьКДанным <> "" Тогда
ТаблицаФормы = ирОбщий.РодительЭлементаУправляемойФормыЛкс(Поле, Тип("ТаблицаФормы"));
Если ТаблицаФормы <> Неопределено Тогда
СтруктураПутиКДанным.Вставить(Поле.Имя, "Элементы." + ТаблицаФормы.Имя + ".ТекущиеДанные." + ирОбщий.ПоследнийФрагментЛкс(Поле.ПутьКДанным));
Иначе
СтруктураПутиКДанным.Вставить(Поле.Имя, Поле.ПутьКДанным);
КонецЕсли;
КонецЕсли;
ИначеЕсли ТипЗнч(Поле) = Тип("ТаблицаФормы") Тогда
ТаблицаФормы = Поле;
Если ТаблицаФормы.ПутьКДанным <> "" Тогда
СтруктураПутиКДанным.Вставить(ТаблицаФормы.Имя, ТаблицаФормы.ПутьКДанным);
ТипЗначения = ПолучитьТипЗначенияПоляФормыЛкс(ТаблицаФормы, ЭтаФорма);
// Антибаг платформы http://www.hostedredmine.com/issues/850204
Если Истина
И ТипЗначения <> Неопределено
И ТипЗначения.СодержитТип(Тип("ДинамическийСписок"))
Тогда
НастройкаКомпоновки = ТаблицаФормы.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
#Если Сервер И Не Сервер Тогда
НастройкаКомпоновки = Новый НастройкиКомпоновкиДанных;
#КонецЕсли
Для Каждого ВыбранноеПоле Из НастройкаКомпоновки.Структура[0].Выбор.Элементы Цикл
ИмяКолонки = СтрЗаменить(ВыбранноеПоле.Поле, ".", "_");
ИмяПоля = ТаблицаФормы.Имя + ИмяКолонки;
Если ТаблицаФормы.ПодчиненныеЭлементы.Найти(ИмяПоля) = Неопределено Тогда
ИмяПоля = ирОбщий.АвтоУникальноеИмяВКоллекцииЛкс(СтруктураПутиКДанным, ИмяПоля,,,, 0);
СтруктураПутиКДанным.Вставить(ИмяПоля, "Элементы." + ТаблицаФормы.Имя + ".ТекущиеДанные." + ИмяКолонки);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Ложь
Или ТипЗнч(Поле) = Тип("ГруппаФормы")
Или ТипЗнч(Поле) = Тип("ТаблицаФормы")
Тогда
ЗаполнитьСоответствиеПутиКДаннымПодчиненныхЭлементовФормыЛкс(Поле, СтруктураПутиКДанным, ЭтаФорма);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПолеФормыСИсториейВыбора_ЗаполнитьСписокВыбораЛкс(ПолеФормы, КлючИстории) Экспорт
// Запоминать последние
КлючНастройки = КлючИстории + "." + ПолеФормы.Имя + ".ПоследниеЗначения";
ПоследниеЗначения = ирОбщий.ВосстановитьЗначениеЛкс(КлючНастройки);
Если ТипЗнч(ПоследниеЗначения) = Тип("Массив") Тогда
ПолеФормы.СписокВыбора.Очистить();
Для Каждого Значение Из ПоследниеЗначения Цикл
НовыйЭлемент = ПолеФормы.СписокВыбора.Добавить(Значение);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
// Получить тип значения поля формы иис
//
// Параметры:
// ПолеФормы - <тип> -
//
// Возвращаемое значение: Тип
//
Функция ПолучитьТипЗначенияПоляФормыЛкс(ПолеФормы, ЭтаФорма = Неопределено, ВернутьОписаниеТипов = Истина) Экспорт
Если ЭтаФорма = Неопределено Тогда
ЭтаФорма = ирОбщий.РодительЭлементаУправляемойФормыЛкс(ПолеФормы);
КонецЕсли;
//Типы = ПолеФормы.ДоступныеТипы.Типы();
ИмяРеквизита = ирОбщий.ПоследнийФрагментЛкс(ПолеФормы.ПутьКДанным);
ПутьКРодителю = ирОбщий.СтрокаБезКонцаЛкс(ПолеФормы.ПутьКДанным, СтрДлина(ИмяРеквизита + 1));
Попытка
Реквизиты = ЭтаФорма.ПолучитьРеквизиты(ПутьКРодителю); // затратная операция, а нужен всего лишь тип
Исключение
// Если ПутьКРодителю содержит "ПользовательскиеНастройки.ТекущиеДанные", то может возникатьошибка "Недопустимое значение параметра (параметр номер '1')"
Возврат Неопределено;
КонецПопытки;
Реквизит = ирОбщий.НайтиЭлементКоллекцииПоЗначениюСвойстваЛкс(Реквизиты, "Имя", ИмяРеквизита);
Если Реквизит <> Неопределено Тогда
ТипЗначения = Реквизит.ТипЗначения;
Если Не ВернутьОписаниеТипов Тогда
Типы = ТипЗначения.Типы();
Если Типы.Количество() <> 1 Тогда
Если ЗначениеЗаполнено(ПолеФормы.СвязьПоТипу.ПутьКДанным) Тогда
ТаблицаРодитель = ирОбщий.РодительЭлементаУправляемойФормыЛкс(ПолеФормы, Тип("ТаблицаФормы"));
Если ТаблицаРодитель = Неопределено Тогда
Попытка
ТипЗначения = Вычислить("ЭтаФорма." + ПолеФормы.СвязьПоТипу.ПутьКДанным);
Исключение
ВызватьИсключение "Ошибка вычисления влияющего типа поля: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецЕсли;
Попытка
ТипЗначения = ТипЗначения.Типы()[0]
Исключение
КонецПопытки;
Если ТипЗнч(ТипЗначения) <> Тип("Тип") Тогда
ТипЗначения = Неопределено;
КонецЕсли;
Иначе
ТипЗначения = Типы[0];
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат ТипЗначения;
КонецФункции
Функция ПолучитьТаблицуДочернихРеквизитовЛкс(ЭлементФормы, РезультатВВидеСтруктуры = Ложь) Экспорт
ЭтаФОрма = ирОбщий.РодительЭлементаУправляемойФормыЛкс(ЭлементФормы);
ПутьКДанным = ирОбщий.ПутьКДаннымЭлементаУправляемойФормыЛкс(ЭлементФормы,, ЭтаФОрма);
ТаблицаРеквизитов = Новый ТаблицаЗначений;
ТаблицаРеквизитов.Колонки.Добавить("Заголовок");
ТаблицаРеквизитов.Колонки.Добавить("Имя");
ТаблицаРеквизитов.Колонки.Добавить("Путь");
ТаблицаРеквизитов.Колонки.Добавить("ТипЗначения");
ТаблицаРеквизитов.Колонки.Добавить("СохраняемыеДанные");
Структура = Новый Структура;
Для Каждого Реквизит Из ЭтаФОрма.ПолучитьРеквизиты(ПутьКДанным) Цикл
СтрокаРеквизита = ТаблицаРеквизитов.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаРеквизита, Реквизит);
Структура.Вставить(СтрокаРеквизита.Имя, СтрокаРеквизита);
КонецЦикла;
Если РезультатВВидеСтруктуры Тогда
Результат = Структура;
Иначе
Результат = ТаблицаРеквизитов;
КонецЕсли;
Возврат Результат;
КонецФункции
// Не вызывается в портативном режиме
Функция ЛиЕстьИнтерактивныйДоступКИнструментамЛкс() Экспорт
//Результат = ирОбщий.ЛиЕстьИнтерактивныйДоступКИнструментамЛкс(); // Не используем этот способ, чтобы не компилировать огромный модуль
Возврат ПравоДоступа("Просмотр", Метаданные.Подсистемы.ИнструментыРазработчикаTormozit);
КонецФункции