//ирПортативный Перем ирПортативный Экспорт; //ирПортативный Перем ирОбщий Экспорт; //ирПортативный Перем ирСервер Экспорт; //ирПортативный Перем ирКэш Экспорт; //ирПортативный Перем ирПривилегированный Экспорт; Перем РежимОтладки Экспорт; Перем мОбъекты; Перем мКолонкиРасширенногоПредставления; Перем СтарыйТипОбъектов; Перем СтарыйРасширенныеПредставления; Функция СхемаКомпоновки() Экспорт мПлатформа = ирКэш.Получить(); #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли Если ТипОбъектов <> СтарыйТипОбъектов Тогда мОбъекты = Новый ТаблицаЗначений; мКолонкиРасширенногоПредставления = Новый СписокЗначений; мОбъекты.Колонки.Добавить("ОбъектМД"); мОбъекты.Колонки.Добавить("ПолноеИмя"); мОбъекты.Колонки.Добавить("ПолноеИмяРодителя"); СтруктураТипаОбъекта = мПлатформа.НоваяСтруктураТипа(); СтруктураТипаОбъекта.ИмяОбщегоТипа = ТипОбъектов; СвойстваЦелевогоОбъекта = мПлатформа.ПолучитьТаблицуСловСтруктурыТипа(СтруктураТипаОбъекта,,,,,, "Свойство"); Для Каждого Свойство Из СвойстваЦелевогоОбъекта Цикл Если Ложь Или Свойство.Слово = "ПринадлежностьОбъекта" // Бесполезное свойство метаданных Или Свойство.ТипЗначения = "Неопределено" Или Свойство.ТипЗначения = "КоллекцияЗначенийСвойстваОбъектаМетаданных" Или Свойство.ТипЗначения = "ОписанияСтандартныхРеквизитов" Или Свойство.ТипЗначения = "ОписанияСтандартныхТабличныхЧастей" Или ирОбщий.ПервыйФрагментЛкс(Свойство.ТипЗначения, ":") = "КоллекцияОбъектовМетаданных" Тогда Продолжить; КонецЕсли; Если Ложь Или Свойство.ТипЗначения = "Булево" Или Свойство.ТипЗначения = "Число" Тогда ОписаниеТипов = Новый ОписаниеТипов("Строка," + Свойство.ТипЗначения); Иначе ОписаниеТипов = Новый ОписаниеТипов("Строка",,,, Новый КвалификаторыСтроки(300)); Если Свойство.ТипЗначения <> "Строка" Тогда мКолонкиРасширенногоПредставления.Добавить(Свойство.Слово); КонецЕсли; КонецЕсли; мОбъекты.Колонки.Добавить(Свойство.Слово, ОписаниеТипов); КонецЦикла; мКолонкиРасширенногоПредставления.СортироватьПоЗначению(); мКолонкиРасширенногоПредставления = мКолонкиРасширенногоПредставления.ВыгрузитьЗначения(); КонецЕсли; Схема = ирОбщий.СоздатьСхемуПоТаблицамЗначенийЛкс(Новый Структура("Объекты", мОбъекты)); Возврат Схема; КонецФункции Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) мПлатформа = ирКэш.Получить(); СхемаКомпоновкиДанных = СхемаКомпоновки(); #Если _ Тогда СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; КонечнаяНастройка = Новый НастройкиКомпоновкиДанных; ВнешниеНаборыДанных = Новый Структура; ДокументРезультат = Новый ТабличныйДокумент; мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли СтандартнаяОбработка = Ложь; Если Ложь Или ТипОбъектов <> СтарыйТипОбъектов Или РасширенныеПредставления <> СтарыйРасширенныеПредставления Тогда СтруктураТипа = мПлатформа.ПолучитьСтруктуруТипаИзЗначения(Метаданные); ЛиЦелевойТипКорневой = ЭтоКорневойТипМетаданных(ТипОбъектов); СобратьОбъектыМетаданных(СтруктураТипа, ЛиЦелевойТипКорневой); мОбъекты = ирОбщий.ПолучитьТаблицуСМинимальнымиТипамиКолонокЛкс(мОбъекты); СтарыйТипОбъектов = ТипОбъектов; СтарыйРасширенныеПредставления = РасширенныеПредставления; КонецЕсли; КонечнаяНастройка = КомпоновщикНастроек.ПолучитьНастройки(); ВнешниеНаборыДанных = Новый Структура("Объекты", мОбъекты); Если РежимОтладки = 2 Тогда ирОбщий.ОтладитьЛкс(СхемаКомпоновкиДанных, , КонечнаяНастройка, ВнешниеНаборыДанных); Возврат; КонецЕсли; ДокументРезультат.Очистить(); ирОбщий.СкомпоноватьВТабличныйДокументЛкс(СхемаКомпоновкиДанных, КонечнаяНастройка, ДокументРезультат, ВнешниеНаборыДанных, ДанныеРасшифровки); КонецПроцедуры // Параметры: // СтруктураТипа - Структура - // Результат - ТаблицаЗначений - // НачальноеКоличествоКолонок - Число - // Результат: // Булево - были ли подходящие коллекции Функция СобратьОбъектыМетаданных(СтруктураТипа, Знач ЛиЦелевойТипКорневой, Знач ПолноеИмяРодителя = Неопределено, Знач ЗащитаРекурсия = Неопределено, Знач СвойстваРекурсия = Неопределено) Экспорт мПлатформа = ирКэш.Получить(); #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); Результат = Новый ТаблицаЗначений; мОбъекты = Новый ТаблицаЗначений; #КонецЕсли ТаблицаОбщихТипов = мПлатформа.ТаблицаОбщихТипов; Если ЗащитаРекурсия = Неопределено Тогда ЗащитаРекурсия = Новый Соответствие; КонецЕсли; Если СвойстваРекурсия = Неопределено Тогда СвойстваРекурсия = Новый Соответствие; КонецЕсли; Свойства = СвойстваРекурсия[СтруктураТипа.ИмяОбщегоТипа]; Если Свойства = Неопределено Тогда СвойстваВсе = мПлатформа.ПолучитьТаблицуСловСтруктурыТипа(СтруктураТипа,,,, Ложь,, "Свойство"); Свойства = Новый Структура; Для Каждого Свойство Из СвойстваВсе Цикл Если Свойство.Слово = "Состав" Тогда Продолжить; КонецЕсли; СтрокаТипаЗначения = ТаблицаОбщихТипов.НайтиСтроки(Новый Структура("ЯзыкПрограммы, Слово", 0, Свойство.ТипЗначения)); Если СтрокаТипаЗначения.Количество() = 0 Тогда Продолжить; КонецЕсли; Свойства.Вставить(Свойство.Слово, СтрокаТипаЗначения[0].ТипЭлементаКоллекции); КонецЦикла; СвойстваРекурсия[СтруктураТипа.ИмяОбщегоТипа] = Свойства; КонецЕсли; Если ПолноеИмяРодителя = Неопределено Тогда ИндикаторСвойств = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Свойства.Количество()); КонецЕсли; Результат = Ложь; Для Каждого Свойство Из Свойства Цикл Если ИндикаторСвойств <> Неопределено Тогда ирОбщий.ОбработатьИндикаторЛкс(ИндикаторСвойств); КонецЕсли; ТипЭлементаКоллекции = Свойство.Значение; ИмяСвойства = Свойство.Ключ; Если Истина И ЗначениеЗаполнено(ТипЭлементаКоллекции) И Найти(ТипЭлементаКоллекции, ",") = 0 Тогда Если ТипЭлементаКоллекции = ТипОбъектов Тогда Результат = Истина; КонецЕсли; Попытка КоллекцияВСвойстве = СтруктураТипа.Метаданные[ИмяСвойства]; Исключение Продолжить; КонецПопытки; Если КоллекцияВСвойстве = Неопределено Тогда Продолжить; КонецЕсли; ИндикаторКоллекции = Неопределено; Если ПолноеИмяРодителя = Неопределено Тогда ИндикаторКоллекции = ирОбщий.ПолучитьИндикаторПроцессаЛкс(КоллекцияВСвойстве.Количество(), ИмяСвойства); КонецЕсли; СтруктураТипаОбъекта = Неопределено; Для Каждого ОбъектМД Из КоллекцияВСвойстве Цикл #Если Сервер И Не Сервер Тогда ОбъектМД = Метаданные.Справочники.ирАлгоритмы; #КонецЕсли Если ИндикаторКоллекции <> Неопределено Тогда ирОбщий.ОбработатьИндикаторЛкс(ИндикаторКоллекции); КонецЕсли; ПолноеИмяМД = ""; Попытка ПолноеИмяМД = ОбъектМД.ПолноеИмя(); Исключение // Пакет XDTO // Описание стандартного реквизита Попытка ИмяОбъекта = ОбъектМД.Имя; Исключение ИмяОбъекта = ""; КонецПопытки; Если ЗначениеЗаполнено(ИмяОбъекта) Тогда ПолноеИмяМД = ПолноеИмяРодителя + "." + ирОбщий.ПоследнийФрагментЛкс(ТипЭлементаКоллекции, " ") + "." + ОбъектМД.Имя; КонецЕсли; КонецПопытки; Если ТипЭлементаКоллекции = ТипОбъектов Тогда СтрокаНайденного = мОбъекты.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаНайденного, ОбъектМД); Если РасширенныеПредставления Тогда Для Каждого ИмяКолонкиРезультата Из мКолонкиРасширенногоПредставления Цикл Попытка ЗначениеСвойства = ОбъектМД[ИмяКолонкиРезультата]; Исключение // Измерение последовательности Продолжить; КонецПопытки; СтрокаНайденного[ИмяКолонкиРезультата] = ирОбщий.РасширенноеПредставлениеЗначенияЛкс(ЗначениеСвойства); КонецЦикла; КонецЕсли; СтрокаНайденного.ОбъектМД = ОбъектМД; СтрокаНайденного.ПолноеИмя = ПолноеИмяМД; СтрокаНайденного.ПолноеИмяРодителя = ПолноеИмяРодителя; КонецЕсли; Если ЗначениеЗаполнено(ПолноеИмяМД) Тогда Если ЗащитаРекурсия[ПолноеИмяМД ] = 1 Тогда Продолжить; КонецЕсли; ЗащитаРекурсия[ПолноеИмяМД] = 1; КонецЕсли; Если СтруктураТипаОбъекта = Неопределено Тогда СтруктураТипаОбъекта = мПлатформа.НоваяСтруктураТипа(); СтруктураТипаОбъекта.ИмяОбщегоТипа = ТипЭлементаКоллекции; КонецЕсли; СтруктураТипаОбъекта.Метаданные = ОбъектМД; Если Не ЛиЦелевойТипКорневой Тогда РезультатНовый = СобратьОбъектыМетаданных(СтруктураТипаОбъекта, ЛиЦелевойТипКорневой, ПолноеИмяМД, ЗащитаРекурсия, СвойстваРекурсия); Если РезультатНовый Тогда Результат = Истина; КонецЕсли; Если Не Результат Тогда Прервать; КонецЕсли; КонецЕсли; КонецЦикла; Если ИндикаторКоллекции <> Неопределено Тогда ирОбщий.ОсвободитьИндикаторПроцессаЛкс(); КонецЕсли; КонецЕсли; КонецЦикла; Если ИндикаторСвойств <> Неопределено Тогда ирОбщий.ОсвободитьИндикаторПроцессаЛкс(); КонецЕсли; Возврат Результат; КонецФункции Функция ЭтоКорневойТипМетаданных(ИмяОбщегоТипа) Экспорт мПлатформа = ирКэш.Получить(); #Если Сервер И Не Сервер Тогда мПлатформа = Обработки.ирПлатформа.Создать(); #КонецЕсли СтрокаТипаКоллекции = мПлатформа.ТаблицаОбщихТипов.НайтиСтроки(Новый Структура("ЯзыкПрограммы, ТипЭлементаКоллекции", 0, ИмяОбщегоТипа)); СтрокаТипаКоллекции = СтрокаТипаКоллекции[0]; Найденные = мПлатформа.ТаблицаКонтекстов.НайтиСтроки(Новый Структура("ЯзыкПрограммы, ТипЗначения, ТипСлова", 0, СтрокаТипаКоллекции.Слово, "Свойство")); Результат = Истина; Для Каждого СтрокаКонтекста Из Найденные Цикл Если СтрокаКонтекста.ТипКонтекста <> "ОбъектМетаданныхКонфигурация" Тогда Результат = Ложь; Прервать; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции //ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла); //ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf"; //ирПортативный #Если Клиент Тогда //ирПортативный Контейнер = Новый Структура(); //ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер); //ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда //ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля); //ирПортативный ирПортативный.Открыть(); //ирПортативный КонецЕсли; //ирПортативный #Иначе //ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта //ирПортативный #КонецЕсли //ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий"); //ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш"); //ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер"); //ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный"); РежимОтладки = 0; ТипОбъектов = "ОбъектМетаданных: Реквизит";