From 9be2295a4d3ba9a68b772438bbf33ffa054318dc Mon Sep 17 00:00:00 2001 From: Vladislav Permichev Date: Mon, 16 Aug 2021 16:55:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=BA=D0=BE=D0=BD=D1=87=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=B2=20=D1=81=D0=B5=D1=82=D0=BA=D1=83=20?= =?UTF-8?q?(#12),=20=D0=B2=20=D0=BE=D1=80=D0=B1=D0=B8=D1=82=D1=83=20(#13);?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=B2=D0=BE=D0=B4=20=D1=81=D0=B2=D1=8F=D0=B7=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=BC=D0=B5=D0=B6=D0=B4=D1=83=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D0=BC=D0=B8=20(#6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Ext/Form.xml" | 11 + .../Ext/Form/Module.bsl" | 447 ++++++++++++++++-- 2 files changed, 426 insertions(+), 32 deletions(-) diff --git "a/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" "b/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" index 05f6f41..9cd4632 100644 --- "a/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" +++ "b/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form.xml" @@ -577,6 +577,17 @@ ShowError + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Орбитальный вывод</v8:content> + </v8:item> + + + xs:boolean + + diff --git "a/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" "b/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" index 6c3a519..8a791f2 100644 --- "a/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" +++ "b/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/ER\320\224\320\270\320\260\320\263\321\200\320\260\320\274\320\274\320\260\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205DrawIO/Forms/\320\244\320\276\321\200\320\274\320\260/Ext/Form/Module.bsl" @@ -63,6 +63,7 @@ Процедура ПоказатьСвязиТолькоДляПриИзменении(Элемент) Элементы.ТипВыводимыхМетаданных.Доступность = ПоказатьСвязиТолькоДля; + ОрбитальныйВывод = ПоказатьСвязиТолькоДля; КонецПроцедуры @@ -234,6 +235,7 @@ СтрокаРеквизита.Наименование = ?(ПустаяСтрока(СтандартныйРеквизит.Синоним), СтандартныйРеквизит.Имя, СтандартныйРеквизит.Синоним); СтрокаРеквизита.Путь = "Справочник." + СтрокаОбъекта.Имя + "." + СтрокаРеквизита.Имя; СтрокаРеквизита.КлючевойРеквизит = Истина; + СтрокаРеквизита.ПримитивныйТип = ПроверитьЭтоПримитивныйТип(СтрокаРеквизита.ТипЗначения); КонецЕсли; @@ -267,6 +269,7 @@ СтрокаРеквизитаТабличнойЧасти.Имя = РеквизитТабличнойЧасти.Имя; СтрокаРеквизитаТабличнойЧасти.ТипЗначения = РеквизитТабличнойЧасти.Тип; СтрокаРеквизитаТабличнойЧасти.Наименование = ?(ПустаяСтрока(РеквизитТабличнойЧасти.Синоним), РеквизитТабличнойЧасти.Имя, РеквизитТабличнойЧасти.Синоним); + СтрокаРеквизитаТабличнойЧасти.Путь = РеквизитТабличнойЧасти.ПолноеИмя(); СтрокаРеквизитаТабличнойЧасти.ПримитивныйТип = ПроверитьЭтоПримитивныйТип(СтрокаРеквизитаТабличнойЧасти.ТипЗначения); СтрокаРеквизитаТабличнойЧасти.ПроверкаЗаполнения = ?(РеквизитТабличнойЧасти.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку, Истина, Ложь); @@ -344,6 +347,7 @@ СтрокаРеквизитаТабличнойЧасти.Имя = РеквизитТабличнойЧасти.Имя; СтрокаРеквизитаТабличнойЧасти.ТипЗначения = РеквизитТабличнойЧасти.Тип; СтрокаРеквизитаТабличнойЧасти.Наименование = ?(ПустаяСтрока(РеквизитТабличнойЧасти.Синоним), РеквизитТабличнойЧасти.Имя, РеквизитТабличнойЧасти.Синоним); + СтрокаРеквизитаТабличнойЧасти.Путь = РеквизитТабличнойЧасти.ПолноеИмя(); СтрокаРеквизитаТабличнойЧасти.ПримитивныйТип = ПроверитьЭтоПримитивныйТип(СтрокаРеквизитаТабличнойЧасти.ТипЗначения); СтрокаРеквизитаТабличнойЧасти.ПроверкаЗаполнения = ?(РеквизитТабличнойЧасти.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку, Истина, Ложь); @@ -353,27 +357,28 @@ КонецЦикла; - // Регистры сведений - Если Не ЗначениеЗаполнено(ТаблицаМетаданных) Тогда - РодительскаяСтрока = ДеревоФормы.Строки.Добавить(); - РодительскаяСтрока.Имя = "РегистрыСведений"; - - Для Каждого ОбъектМетаданных Из Метаданные.РегистрыСведений Цикл - СтрокаРегистра = РодительскаяСтрока.Строки.Добавить(); - СтрокаРегистра.Имя = ОбъектМетаданных.Имя; - КонецЦикла; - КонецЕсли; - - // Регистры накоплений - Если Не ЗначениеЗаполнено(ТаблицаМетаданных) Тогда - РодительскаяСтрока = ДеревоФормы.Строки.Добавить(); - РодительскаяСтрока.Имя = "РегистрыНакопления"; - - Для каждого ОбъектМетаданных Из Метаданные.РегистрыНакопления Цикл - СтрокаРегистра = РодительскаяСтрока.Строки.Добавить(); - СтрокаРегистра.Имя = ОбъектМетаданных.Имя; - КонецЦикла; - КонецЕсли; + //// Регистры сведений + //Если Не ЗначениеЗаполнено(ТаблицаМетаданных) Тогда + // РодительскаяСтрока = ДеревоФормы.Строки.Добавить(); + // РодительскаяСтрока.Имя = "РегистрыСведений"; + // + // Для Каждого ОбъектМетаданных Из Метаданные.РегистрыСведений Цикл + // СтрокаРегистра = РодительскаяСтрока.Строки.Добавить(); + // СтрокаРегистра.Имя = ОбъектМетаданных.Имя; + // СтрокаРегистра.Путь = ОбъектМетаданных.Имя; + // КонецЦикла; + //КонецЕсли; + // + //// Регистры накоплений + //Если Не ЗначениеЗаполнено(ТаблицаМетаданных) Тогда + // РодительскаяСтрока = ДеревоФормы.Строки.Добавить(); + // РодительскаяСтрока.Имя = "РегистрыНакопления"; + // + // Для каждого ОбъектМетаданных Из Метаданные.РегистрыНакопления Цикл + // СтрокаРегистра = РодительскаяСтрока.Строки.Добавить(); + // СтрокаРегистра.Имя = ОбъектМетаданных.Имя; + // КонецЦикла; + //КонецЕсли; // Перечисления РодительскаяСтрока = ДеревоФормы.Строки.Добавить(); @@ -519,7 +524,8 @@ ТаблицаЭлементов = Новый ТаблицаЗначений; ТаблицаЭлементов.Колонки.Добавить("id" , Новый ОписаниеТипов("Число")); // Идентификатор - Для всех элементов ТаблицаЭлементов.Колонки.Добавить("parent" , Новый ОписаниеТипов("Число")); // Родитель - Для всех элементов - ТаблицаЭлементов.Колонки.Добавить("incline" , Новый ОписаниеТипов("Число")); // Итератор строк сетки - Для таблиц - не выгружается! + ТаблицаЭлементов.Колонки.Добавить("inccol" , Новый ОписаниеТипов("Число")); // Итератор колонок / орбит - Для таблиц - не выгружается! + ТаблицаЭлементов.Колонки.Добавить("incline" , Новый ОписаниеТипов("Число")); // Итератор строк / таблиц - Для таблиц - не выгружается! ТаблицаЭлементов.Колонки.Добавить("container", Новый ОписаниеТипов("Число")); // Контейнер - Для таблиц ТаблицаЭлементов.Колонки.Добавить("shape" , Новый ОписаниеТипов("Строка")); // Фигура - Для таблиц - влияет на стиль ТаблицаЭлементов.Колонки.Добавить("path" , Новый ОписаниеТипов("Строка")); // Путь - Для таблиц - не выгружается! @@ -532,11 +538,53 @@ ТаблицаЭлементов.Колонки.Добавить("target" , Новый ОписаниеТипов("Строка")); // Приемник - Для связей ТаблицаЭлементов.Колонки.Добавить("points" , Новый ОписаниеТипов("Массив")); // Массив точек - Для связей - Для Каждого РодительскаяСтрока Из ВыбранныеСтроки Цикл + Если ОрбитальныйВывод Тогда - СформироватьСтрокиМетаданныхВXML(ЗаписьXML, ИдентификаторЭлемента, ТаблицаЭлементов, РодительскаяСтрока); + ИтераторТаблиц = 1; + ИтераторОрбиты = 1; - КонецЦикла; + СтруктураОтбора = Новый Структура; + СтруктураОтбора.Вставить("Выбран" , Истина); + СтруктураОтбора.Вставить("Путь" , ТипВыводимыхМетаданных); + Для Каждого РодительскаяСтрока Из ВыбранныеСтроки Цикл + ГоловнаяСтрокаПоиск = РодительскаяСтрока.Строки.НайтиСтроки(СтруктураОтбора); + + Если ГоловнаяСтрокаПоиск.Количество() Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + Если ГоловнаяСтрокаПоиск.Количество() Тогда + ГоловнаяСтрока = ГоловнаяСтрокаПоиск[0]; + Иначе + Сообщить("Не найден / не выбран головной элемент в дереве метаданных, для которого назначен вывод"); + Возврат ""; + КонецЕсли; + + СформироватьГоловнуюТаблицуПоОрбитеВXML(ЗаписьXML, ИдентификаторЭлемента, ТаблицаЭлементов, ГоловнаяСтрока); + + Для Каждого РодительскаяСтрока Из ВыбранныеСтроки Цикл + + СформироватьСтрокиМетаданныхПоОрбитеВXML(ЗаписьXML, ИдентификаторЭлемента, + ТаблицаЭлементов, РодительскаяСтрока, ИтераторТаблиц, ИтераторОрбиты); + + КонецЦикла; + + Иначе + + СеткаРазметки = СформироватьГоризонтальнуюСеткуРазметкиТаблиц(); + КоличествоТаблицВСтрокеСетки = СеткаРазметки.Количество(); + ИтераторТаблицТекущейСтроки = 1; + ИтераторСтрокВСетке = 1; + + Для Каждого РодительскаяСтрока Из ВыбранныеСтроки Цикл + + СформироватьСтрокиМетаданныхПоСеткеВXML(ЗаписьXML, ИдентификаторЭлемента, ТаблицаЭлементов, РодительскаяСтрока, + СеткаРазметки, КоличествоТаблицВСтрокеСетки, ИтераторТаблицТекущейСтроки, ИтераторСтрокВСетке); + + КонецЦикла; + + КонецЕсли; Для Каждого РодительскаяСтрока Из ВыбранныеСтроки Цикл @@ -556,19 +604,157 @@ КонецФункции &НаСервере -Процедура СформироватьСтрокиМетаданныхВXML(ЗаписьXML, ИдентификаторЭлемента, ТаблицаЭлементов, РодительскаяСтрока) +Процедура СформироватьГоловнуюТаблицуПоОрбитеВXML(ЗаписьXML, ИдентификаторЭлемента, ТаблицаЭлементов, ГоловнаяСтрока) + + ВысотаТаблицы = ВысотаСтрок; // На заголовок + ВысотаТаблицы = ВысотаТаблицы + ВысотаСтрок + * ГоловнаяСтрока.Строки.НайтиСтроки(Новый Структура("Выбран", Истина)).Количество(); // На реквизиты + Для Каждого СтрокаРеквизитов Из ГоловнаяСтрока.Строки Цикл + // Находим табличную часть + Если СтрокаРеквизитов.ЭтоТЧ Тогда + ВысотаТаблицы = ВысотаТаблицы + ВысотаСтрок + * СтрокаРеквизитов.Строки.НайтиСтроки(Новый Структура("Выбран", Истина)).Количество(); // На реквизиты табличной части + КонецЕсли; + КонецЦикла; + + ИдентификаторЭлемента = ИдентификаторЭлемента + 1; + + ЦентрX = ШиринаСтраницы / 2; + ЦентрY = ВысотаСтраницы / 2; + + Координаты = Новый Структура; + Координаты.Вставить("X", ЦентрX - ШиринаТаблицы / 2); + Координаты.Вставить("Y", ЦентрY - ВысотаТаблицы / 2); + + ЗаписьXML.ЗаписатьНачалоЭлемента("mxCell"); + ЗаписьXML.ЗаписатьАтрибут("id" , Строка(ИдентификаторЭлемента)); + ЗаписьXML.ЗаписатьАтрибут("value" , ГоловнаяСтрока.Путь); + ЗаписьXML.ЗаписатьАтрибут("style" , ПолучитьСтильВЗависимостиОтФигурыЭлемента("table")); + ЗаписьXML.ЗаписатьАтрибут("vertex" , "1"); + ЗаписьXML.ЗаписатьАтрибут("parent" , "1"); + + ЗаписьXML.ЗаписатьНачалоЭлемента("mxGeometry"); + ЗаписьXML.ЗаписатьАтрибут("x" , Формат(Координаты.X, "ЧН=0; ЧГ=")); + ЗаписьXML.ЗаписатьАтрибут("y" , Формат(Координаты.Y, "ЧН=0; ЧГ=")); + ЗаписьXML.ЗаписатьАтрибут("width" , Формат(ШиринаТаблицы, "ЧН=0; ЧГ=")); + ЗаписьXML.ЗаписатьАтрибут("height" , Формат(ВысотаТаблицы, "ЧН=0; ЧГ=")); + ЗаписьXML.ЗаписатьАтрибут("as" , "geometry"); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ЗаписьXML.ЗаписатьКонецЭлемента(); // mxCell + + НовыйЭлемент = ТаблицаЭлементов.Добавить(); + НовыйЭлемент.id = ИдентификаторЭлемента; + НовыйЭлемент.inccol = 0; + НовыйЭлемент.incline = 0; + НовыйЭлемент.parent = 1; + НовыйЭлемент.shape = "table"; + НовыйЭлемент.path = ГоловнаяСтрока.Путь; + НовыйЭлемент.type = ГоловнаяСтрока.ТипЗначения; + НовыйЭлемент.x = Координаты.X; + НовыйЭлемент.y = Координаты.Y; + НовыйЭлемент.width = ШиринаТаблицы; + НовыйЭлемент.height = ВысотаТаблицы; + + СформироватьСтрокиРеквизитовВXML(ЗаписьXML, + ИдентификаторЭлемента, ТаблицаЭлементов, ГоловнаяСтрока, Координаты.X); + +КонецПроцедуры + +&НаСервере +Процедура СформироватьСтрокиМетаданныхПоОрбитеВXML(ЗаписьXML, ИдентификаторЭлемента, + ТаблицаЭлементов, РодительскаяСтрока, ИтераторТаблиц, ИтераторОрбиты) ИмяТипа = РодительскаяСтрока.Имя; - СеткаРазметки = СформироватьГоризонтальнуюСеткуРазметкиТаблиц(); - КоличествоТаблицВСтрокеСетки = СеткаРазметки.Количество(); - ИтераторТаблицТекущейСтроки = 1; - ИтераторСтрокВСетке = 1; + ВыбранныеСтроки = РодительскаяСтрока.Строки.НайтиСтроки(Новый Структура("Выбран", Истина)); + + Для Каждого СтрокаМетаданных Из ВыбранныеСтроки Цикл + + ПоискДублей = ТаблицаЭлементов.Найти(СтрокаМетаданных.Путь, "path"); + + Если Не ПоискДублей = Неопределено Тогда + Продолжить; + КонецЕсли; + + ВысотаТаблицы = ВысотаСтрок; // На заголовок + ВысотаТаблицы = ВысотаТаблицы + ВысотаСтрок + * СтрокаМетаданных.Строки.НайтиСтроки(Новый Структура("Выбран", Истина)).Количество(); // На реквизиты + Для Каждого СтрокаРеквизитов Из СтрокаМетаданных.Строки Цикл + // Находим табличную часть + Если СтрокаРеквизитов.ЭтоТЧ Тогда + ВысотаТаблицы = ВысотаТаблицы + ВысотаСтрок + * СтрокаРеквизитов.Строки.НайтиСтроки(Новый Структура("Выбран", Истина)).Количество(); // На реквизиты табличной части + КонецЕсли; + КонецЦикла; + + ИдентификаторЭлемента = ИдентификаторЭлемента + 1; + + Координаты = ПолучитьНовыеКоординатыТаблицыПоОрбите( + ИдентификаторЭлемента, ТаблицаЭлементов, ИтераторТаблиц, ИтераторОрбиты, ВысотаТаблицы); + + ЗаписьXML.ЗаписатьНачалоЭлемента("mxCell"); + ЗаписьXML.ЗаписатьАтрибут("id" , Строка(ИдентификаторЭлемента)); + ЗаписьXML.ЗаписатьАтрибут("value" , СтрокаМетаданных.Путь); + ЗаписьXML.ЗаписатьАтрибут("style" , ПолучитьСтильВЗависимостиОтФигурыЭлемента("table")); + ЗаписьXML.ЗаписатьАтрибут("vertex" , "1"); + ЗаписьXML.ЗаписатьАтрибут("parent" , "1"); + + ЗаписьXML.ЗаписатьНачалоЭлемента("mxGeometry"); + ЗаписьXML.ЗаписатьАтрибут("x" , Формат(Координаты.X, "ЧН=0; ЧГ=")); + ЗаписьXML.ЗаписатьАтрибут("y" , Формат(Координаты.Y, "ЧН=0; ЧГ=")); + ЗаписьXML.ЗаписатьАтрибут("width" , Формат(ШиринаТаблицы, "ЧН=0; ЧГ=")); + ЗаписьXML.ЗаписатьАтрибут("height" , Формат(ВысотаТаблицы, "ЧН=0; ЧГ=")); + ЗаписьXML.ЗаписатьАтрибут("as" , "geometry"); + ЗаписьXML.ЗаписатьКонецЭлемента(); + + ЗаписьXML.ЗаписатьКонецЭлемента(); // mxCell + + НовыйЭлемент = ТаблицаЭлементов.Добавить(); + НовыйЭлемент.id = ИдентификаторЭлемента; + НовыйЭлемент.inccol = ИтераторОрбиты; + НовыйЭлемент.incline = ИтераторТаблиц; + НовыйЭлемент.parent = 1; + НовыйЭлемент.shape = "table"; + НовыйЭлемент.path = СтрокаМетаданных.Путь; + НовыйЭлемент.type = СтрокаМетаданных.ТипЗначения; + НовыйЭлемент.x = Координаты.X; + НовыйЭлемент.y = Координаты.Y; + НовыйЭлемент.width = ШиринаТаблицы; + НовыйЭлемент.height = ВысотаТаблицы; + + СформироватьСтрокиРеквизитовВXML(ЗаписьXML, + ИдентификаторЭлемента, ТаблицаЭлементов, СтрокаМетаданных, Координаты.X); + + ИтераторТаблиц = ИтераторТаблиц + 1; + + Если ИтераторТаблиц > 4 Тогда + + ИтераторТаблиц = 1; + ИтераторОрбиты = ИтераторОрбиты + 1; + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура СформироватьСтрокиМетаданныхПоСеткеВXML(ЗаписьXML, ИдентификаторЭлемента, ТаблицаЭлементов, + РодительскаяСтрока, СеткаРазметки, КоличествоТаблицВСтрокеСетки, ИтераторТаблицТекущейСтроки, ИтераторСтрокВСетке) + + ИмяТипа = РодительскаяСтрока.Имя; ВыбранныеСтроки = РодительскаяСтрока.Строки.НайтиСтроки(Новый Структура("Выбран", Истина)); Для Каждого СтрокаМетаданных Из ВыбранныеСтроки Цикл + ПоискДублей = ТаблицаЭлементов.Найти(СтрокаМетаданных.Путь, "path"); + + Если Не ПоискДублей = Неопределено Тогда + Продолжить; + КонецЕсли; + ВысотаТаблицы = ВысотаСтрок; // На заголовок ВысотаТаблицы = ВысотаТаблицы + ВысотаСтрок * СтрокаМетаданных.Строки.НайтиСтроки(Новый Структура("Выбран", Истина)).Количество(); // На реквизиты @@ -582,7 +768,7 @@ ИдентификаторЭлемента = ИдентификаторЭлемента + 1; - Координаты = ПолучитьНовыеКоординатыТаблицы(ИдентификаторЭлемента, + Координаты = ПолучитьНовыеКоординатыТаблицыПоСетке(ИдентификаторЭлемента, ТаблицаЭлементов, СеткаРазметки, ИтераторТаблицТекущейСтроки, ИтераторСтрокВСетке); ЗаписьXML.ЗаписатьНачалоЭлемента("mxCell"); @@ -604,6 +790,7 @@ НовыйЭлемент = ТаблицаЭлементов.Добавить(); НовыйЭлемент.id = ИдентификаторЭлемента; + НовыйЭлемент.inccol = ИтераторТаблицТекущейСтроки; НовыйЭлемент.incline = ИтераторСтрокВСетке; НовыйЭлемент.parent = 1; НовыйЭлемент.shape = "table"; @@ -962,7 +1149,140 @@ Для Каждого СтрокаМетаданных Из ВыбранныеСтроки Цикл + ВыбранныеСтрокиРеквизитов = СтрокаМетаданных.Строки.НайтиСтроки(Новый Структура("Выбран", Истина)); + Для Каждого СтрокаРеквизитов Из ВыбранныеСтрокиРеквизитов Цикл + + Если СтрокаМетаданных.ТипЗначения = СтрокаРеквизитов.ТипЗначения Тогда + Продолжить; + КонецЕсли; + + Если СтрокаРеквизитов.ПримитивныйТип Тогда + Продолжить; + КонецЕсли; + + Если СтрокаРеквизитов.ЭтоТЧ Тогда + + ВыбранныеСтрокиРеквизитовТЧ = СтрокаРеквизитов.Строки.НайтиСтроки(Новый Структура("Выбран", Истина)); + + Для Каждого РеквизитТабличнойЧасти Из ВыбранныеСтрокиРеквизитовТЧ Цикл + + Если РеквизитТабличнойЧасти.ПримитивныйТип Тогда + Продолжить; + КонецЕсли; + + ЗаписатьСвязьПоТипуОбъектаВXML(ЗаписьXML, + ИдентификаторЭлемента, ТаблицаЭлементов, РеквизитТабличнойЧасти, РеквизитТабличнойЧасти.Путь); + + КонецЦикла; + + Иначе + + ЗаписатьСвязьПоТипуОбъектаВXML(ЗаписьXML, + ИдентификаторЭлемента, ТаблицаЭлементов, СтрокаРеквизитов, СтрокаРеквизитов.Путь); + + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьСвязьПоТипуОбъектаВXML(ЗаписьXML, + ИдентификаторЭлемента, ТаблицаЭлементов, СтрокаРеквизитов, ПолныйПутьКРеквизиту) + + СтруктураОтбораКонтейнера = Новый Структура; + СтруктураОтбораКонтейнера.Вставить("path" , ПолныйПутьКРеквизиту); + СтруктураОтбораКонтейнера.Вставить("shape" , "partialRectangleContainer"); + ВыведенныйКонтейнерСтроки = ТаблицаЭлементов.НайтиСтроки(СтруктураОтбораКонтейнера); + + Если ВыведенныйКонтейнерСтроки.Количество() Тогда + ЭлементКонтейнер = ВыведенныйКонтейнерСтроки[0]; + Иначе + Возврат; + КонецЕсли; + + ТипыРеквизитов = СтрокаРеквизитов.ТипЗначения.Типы(); + + Для Каждого ТипПеречисление Из ТипыРеквизитов Цикл + + ИдентификаторЭлемента = ИдентификаторЭлемента + 1; + + СтруктураОтбораТаблицы = Новый Структура; + МассивТипов = Новый Массив; + МассивТипов.Добавить(ТипПеречисление); + СтруктураОтбораТаблицы.Вставить("type" , Новый ОписаниеТипов(МассивТипов)); + СтруктураОтбораТаблицы.Вставить("shape" , "table"); + ВыведенныйТаблицаСтроки = ТаблицаЭлементов.НайтиСтроки(СтруктураОтбораТаблицы); + + Если ВыведенныйТаблицаСтроки.Количество() Тогда + ЭлементТаблица = ВыведенныйТаблицаСтроки[0]; + Иначе + Возврат; + КонецЕсли; + + СтильСвязей = ПолучитьСтильВЗависимостиОтФигурыЭлемента("entityRelationEdgeStyle"); + + КоординатыИсточника = Новый Структура; + КоординатыПриемника = Новый Структура; + КоординатыТочек = Новый Массив; + КоординатыТочек.Добавить(Новый Структура); + КоординатыТочек.Добавить(Новый Структура); + + Если ЭлементКонтейнер.x = ЭлементТаблица.x Тогда + КоординатыИсточника.Вставить("x", ЭлементКонтейнер.x); + КоординатыПриемника.Вставить("x", ЭлементТаблица.x); + + СтильСвязей = СтрЗаменить(СтильСвязей, "exitX=1", "exitX=0"); + + ИначеЕсли ЭлементКонтейнер.x > ЭлементТаблица.x Тогда + КоординатыИсточника.Вставить("x", ЭлементКонтейнер.x); + КоординатыПриемника.Вставить("x", ЭлементТаблица.x + ШиринаТаблицы); + СтильСвязей = СтрЗаменить(СтильСвязей, "exitX=1", "exitX=0"); + + Иначе + КоординатыИсточника.Вставить("x", ЭлементКонтейнер.x + ШиринаТаблицы); + КоординатыПриемника.Вставить("x", ЭлементТаблица.x); + + КонецЕсли; + + YИсточникаСВысотойСтрок = ЭлементКонтейнер.y + (ВысотаСтрок / 2); + YПриемникаСВысотойСтрок = ЭлементТаблица.y + (ВысотаСтрок / 2); + КоординатыИсточника.Вставить("y", YИсточникаСВысотойСтрок); + КоординатыПриемника.Вставить("y", YПриемникаСВысотойСтрок); + + ЗаписьXML.ЗаписатьНачалоЭлемента("mxCell"); + ЗаписьXML.ЗаписатьАтрибут("id" , Строка(ИдентификаторЭлемента)); + ЗаписьXML.ЗаписатьАтрибут("value" , ""); + ЗаписьXML.ЗаписатьАтрибут("style" , СтильСвязей); + ЗаписьXML.ЗаписатьАтрибут("edge" , "1"); + ЗаписьXML.ЗаписатьАтрибут("parent" , "1"); + ЗаписьXML.ЗаписатьАтрибут("source" , Строка(ЭлементКонтейнер.id)); + ЗаписьXML.ЗаписатьАтрибут("target" , Строка(ЭлементТаблица.id)); + + ЗаписьXML.ЗаписатьНачалоЭлемента("mxGeometry"); + ЗаписьXML.ЗаписатьАтрибут("width" , "100"); + ЗаписьXML.ЗаписатьАтрибут("height" , "100"); + ЗаписьXML.ЗаписатьАтрибут("relative", "1"); + ЗаписьXML.ЗаписатьАтрибут("as" , "geometry"); + + ЗаписьXML.ЗаписатьНачалоЭлемента("mxPoint"); + ЗаписьXML.ЗаписатьАтрибут("x" , Строка(КоординатыИсточника.x)); + ЗаписьXML.ЗаписатьАтрибут("y" , Строка(КоординатыИсточника.y)); + ЗаписьXML.ЗаписатьАтрибут("as" , "sourcePoint"); + ЗаписьXML.ЗаписатьКонецЭлемента(); // mxPoint + + ЗаписьXML.ЗаписатьНачалоЭлемента("mxPoint"); + ЗаписьXML.ЗаписатьАтрибут("x" , Строка(КоординатыПриемника.x)); + ЗаписьXML.ЗаписатьАтрибут("y" , Строка(КоординатыПриемника.y)); + ЗаписьXML.ЗаписатьАтрибут("as" , "targetPoint"); + ЗаписьXML.ЗаписатьКонецЭлемента(); // mxPoint + + ЗаписьXML.ЗаписатьКонецЭлемента(); // mxGeometry + + ЗаписьXML.ЗаписатьКонецЭлемента(); // mxCell КонецЦикла; @@ -1085,6 +1405,10 @@ ЭтоПримитивныйТип = Истина; ИначеЕсли ОписаниеТипа.СодержитТип(Тип("Дата")) Тогда ЭтоПримитивныйТип = Истина; + ИначеЕсли ОписаниеТипа.СодержитТип(Тип("ХранилищеЗначения")) Тогда + ЭтоПримитивныйТип = Истина; + ИначеЕсли ОписаниеТипа.СодержитТип(Тип("УникальныйИдентификатор")) Тогда + ЭтоПримитивныйТип = Истина; Иначе ЭтоПримитивныйТип = Ложь; КонецЕсли; @@ -1167,6 +1491,9 @@ ИначеЕсли ФигураЭлемента = "partialRectangleDescUsual" Тогда СтильСтрокой = "shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;"; + ИначеЕсли ФигураЭлемента = "entityRelationEdgeStyle" Тогда + СтильСтрокой = "edgeStyle=orthogonalEdgeStyle;fontSize=12;html=1;endArrow=classic;endFill=1;shadow=0;targetPerimeterSpacing=0;strokeWidth=1;opacity=40;entryX=0;entryY=0.015;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;startArrow=oval;startFill=1;curved=1;"; + КонецЕсли; Возврат СтильСтрокой; @@ -1221,7 +1548,63 @@ КонецФункции &НаСервере -Функция ПолучитьНовыеКоординатыТаблицы(ИдентификаторЭлемента, +Функция ПолучитьНовыеКоординатыТаблицыПоОрбите(ИдентификаторЭлемента, + ТаблицаЭлементов, ИтераторТаблиц, ИтераторОрбиты, ВысотаТаблицы) + + СтруктураОтбора = Новый Структура; + + Если ИтераторОрбиты = 1 Тогда + + СтруктураОтбора.Вставить("inccol" , 0); + СтруктураОтбора.Вставить("incline" , 0); + + Иначе + + СтруктураОтбора.Вставить("inccol" , ИтераторОрбиты - 1); + СтруктураОтбора.Вставить("incline" , ИтераторТаблиц); + + КонецЕсли; + + ДанныеПрошлойТаблицыПоиск = ТаблицаЭлементов.НайтиСтроки(СтруктураОтбора); + + Если ДанныеПрошлойТаблицыПоиск.Количество() Тогда + ДанныеПрошлойТаблицы = ДанныеПрошлойТаблицыПоиск[0]; + Иначе + Возврат Неопределено; + КонецЕсли; + + Если ИтераторТаблиц = 1 Тогда + + КоординатаX = ДанныеПрошлойТаблицы.x - РасстояниеМеждуТаблицами - ШиринаТаблицы; + КоординатаY = ДанныеПрошлойТаблицы.y - РасстояниеМеждуТаблицами - ВысотаТаблицы; + + ИначеЕсли ИтераторТаблиц = 2 Тогда + + КоординатаX = ДанныеПрошлойТаблицы.x + ШиринаТаблицы + РасстояниеМеждуТаблицами; + КоординатаY = ДанныеПрошлойТаблицы.y - РасстояниеМеждуТаблицами - ВысотаТаблицы; + + ИначеЕсли ИтераторТаблиц = 3 Тогда + + КоординатаX = ДанныеПрошлойТаблицы.x - РасстояниеМеждуТаблицами - ШиринаТаблицы; + КоординатаY = ДанныеПрошлойТаблицы.y + ДанныеПрошлойТаблицы.height + РасстояниеМеждуТаблицами; + + ИначеЕсли ИтераторТаблиц = 4 Тогда + + КоординатаX = ДанныеПрошлойТаблицы.x + ШиринаТаблицы + РасстояниеМеждуТаблицами; + КоординатаY = ДанныеПрошлойТаблицы.y + ДанныеПрошлойТаблицы.height + РасстояниеМеждуТаблицами; + + КонецЕсли; + + Координаты = Новый Структура; + Координаты.Вставить("X", КоординатаX); + Координаты.Вставить("Y", КоординатаY); + + Возврат Координаты; + +КонецФункции + +&НаСервере +Функция ПолучитьНовыеКоординатыТаблицыПоСетке(ИдентификаторЭлемента, ТаблицаЭлементов, СеткаРазметки, ИтераторТаблицТекущейСтроки, ИтераторСтрокВСетке) СтрокаРазметки = СеткаРазметки.Найти(ИтераторТаблицТекущейСтроки, "НомерТаблицы");