Имя: Пароль:
1C
 
Формирование SVG файла через фабрику XDTO
0 tan76
 
19.09.24
20:25
Надумал я генерить svg из под 1С. Загрузил в конфу XSD схемы и через фабрику формирую элементы картинки.


   ГлавныйКонтейнер = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg    ,"svgType");
   ГлавныйКонтейнер.id = Строка(Новый УникальныйИдентификатор);
   ГлавныйКонтейнер.width=720;
   ГлавныйКонтейнер.height=576;
  
   Прямоугольник = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg    ,"rectType");
  
   Прямоугольник.x="0";
   Прямоугольник.y="0";
   Прямоугольник.width="400";
   Прямоугольник.height="400";
  
   Прямоугольник.fill="#dfdc49";
   Прямоугольник.stroke="black";
   Прямоугольник.stroke_width="5px";
   Прямоугольник.stroke_opacity="0.5";
  
   ГлавныйКонтейнер.rect.Добавить(Прямоугольник);
  
   Текст = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg    ,"textType");
   Текст.x="20";
   Текст.y="35";
  
   ГлавныйКонтейнер.text.Добавить(Текст);
  
  
   ЗаписьXML = Новый ЗаписьXML;
  
   //ЗаписьXML.ОткрытьФайл("r:\test.svg");
   ЗаписьXML.УстановитьСтроку();

   ЗаписьXML.ЗаписатьОбъявлениеXML();
   ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ГлавныйКонтейнер,"svg","http://www.w3.org/2000/svg
  
   Сообщить(ЗаписьXML.Закрыть());


Результат получается такой:


<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg xmlns:xs="http://www.w3.org/2001/XMLSchema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance id="8039b82d-e9e4-4c3e-bb99-364eb187b1fe" width="720" height="576">
    <rect fill="#dfdc49" stroke="black" stroke-opacity="0.5" stroke-width="5px" x="0" y="0" width="400" height="400"/>
    <text x="20" y="35"/>
</svg>


проблема в том что строка <text x="20" y="35"/> не имеет собственно значения и я не знаю способа его установить.

результат должен быть <text x="20" y="35">Мой текст</text>, подскажите, как его достичь, как объекту Текст присвоить содержимое.

демка здесь https://disk.yandex.ru/d/WHbtft91PEapzA  на 8.3.17.1851 работает точно, остальные релизы как повезет.
1 RomanYS
 
19.09.24
19:15
на 25й платформе демка не работает
2 tan76
 
19.09.24
19:19
на 25й не пробовал, работаю на 8.3.17.1851
3 Garykom
 
19.09.24
20:30
4 tan76
 
19.09.24
21:10
(3) что то я не разобрался как у них там все заработало

берем пример:

об = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema"  , "anyType"));
    ЗначениеАтрибута=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema"  , "string"), "840");
    об.Добавить(ФормаXML.Атрибут, "http://www.w3.org/2001/XMLSchema"  , "id",ЗначениеАтрибута);
    
    ГлавныйКонтейнер.text.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema"  , "currency",об);
5 tan76
 
19.09.24
21:14
получаем ошибку:

{ОбщаяКоманда.П33Т1.МодульКоманды(62)}: Слишком много фактических параметров
    ГлавныйКонтейнер.text.Добавить(ФормаXML.Элемент, "http://www.w3.org/2001/XMLSchema   , "currency",об);

метод "Добавить" с тремя параметрам видимо применим к объектуxdto у меня же ГлавныйКонтейнер.text это списокxdto, я туда готовый объект со значением добавить должен


но у ФабрикаXDTO.Создать тоже только два параметра, куда подсунуть нужный текст?
6 tan76
 
19.09.24
21:21
попробовал добавить значениеXDTO

     НужныйМнеТекст=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2000/svg" , "textType"), "Проверочка");
     ГлавныйКонтейнер.text.Добавить(НужныйМнеТекст);

падает с ошибкой:

{ОбщаяКоманда.П33Т1.МодульКоманды(55)}: Ошибка при вызове метода контекста (Создать)
     НужныйМнеТекст=ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2000/svg" , "textType"), "Проверочка");
по причине:
Несоответствие типов (параметр номер '2')
7 tan76
 
20.09.24
09:10
Помощь все ещё нужна, я в тупике.
переформулирую проблему, код

Текст = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg" ,"textType");

создает объектXDTO со всеми нужными атрибутами, осталось только при создании или после установить само текстовое значение объекта. Как это сделать?
8 Asmody
 
20.09.24
09:34
(7) У свойства типа объекта есть свойство Форма.




Тебе нужно то, у которого Форма = Текст
9 Dzenn
 
20.09.24
09:41
(0) в (8) нужный ответ. Просто объяви ещё одно свойство типа текст. Хотя не очень понимаю твою необходимость генерить свг через иксдто )
10 tan76
 
20.09.24
10:13
(8) у "textType" свойства с такой формой нет. Добавить не удалось  так как схема перестает быть валидной.

Ошибка проверки модели XDTO: xdto-objectType-3.5.5    тип: textType    пакет: http://www.w3.org/2000/svg
Недопустимая форма XML представления 'Text' свойства 'Свойство1'
11 tan76
 
20.09.24
10:05
(9) первоначально казалось что это удобней чем поэлементная запись xml. + я не силен в svg а схема дает шаблон в котором есть все нужное для дальнейшей работы.
12 Dzenn
 
20.09.24
10:36
(11) можешь ссылку на первоисточник xsd скниуть? посмотрю тоже, интересная затея
13 tan76
 
20.09.24
11:02
(12) поищу, я их несколько пробовал и не вчера, давно это было. В 1С загрузилась лишь одна, та что в демке
14 tan76
 
20.09.24
11:37
15 Asmody
 
20.09.24
14:03
Вообще-то, никто не обещал, что Пакет XDTO будет совместим с любым XSD.
16 tan76
 
20.09.24
16:53
не решаемая задача?
17 big
 
20.09.24
19:16
XML-файл можно формировать разными способами. Зачем зацикливаться на средствах 1С:8.хх ?

з.ы. вообще то xml - это просто текстовый файл. Можно крутить как хочешь ;)
18 Garykom
 
20.09.24
20:58
(16) Не тупи
Текст.Добавить("тут string")
19 tan76
 
20.09.24
23:45
(18) к сожалению так просто не работает
20 tan76
 
20.09.24
23:58
(18) если добавлять по СП

Текст.Добавить(<Форма>, <URIПространстваИмен>, <ЛокальноеИмя>, <ЭлементДанных>)

то проблема уже в первом параметре так как СП прямо говорит  что

<Форма> (обязательный)
Тип: ФормаXML.
Форма XML представления произвольного свойства.
Может принимать значения Элемент или Атрибут.


а мне насколько я понимаю нужно ФормаXML.Текст

ежели добавлять как ФормаXML.Элемент то результат шляпа

    <text x="20" y="35">
        <text xmlns="">Проверочка</text>
    </text>
21 DiMel_77
 
21.09.24
10:17
Круто завернули (через XDTO формировать пакеты). Отпишитесь если выйдет. У меня в свое время получилось только через ДокументDOM сделать.
Как то так было сделано:

    ТекстФигуры = ДокументDOM.СоздатьЭлемент("text");
    
    ТекстФигуры.УстановитьАтрибут("x", КоординатаX);
    ТекстФигуры.УстановитьАтрибут("y", КоординатаY);
    ТекстФигуры.УстановитьАтрибут("text-anchor", "middle");
    
    ТекстовыйУзел = ДокументDOM.СоздатьТекстовыйУзел(Текст);
    ТекстФигуры.ДобавитьДочерний(ТекстовыйУзел);

Я бы не связывался с XDTO в данном вопросе...
22 tan76
 
21.09.24
10:40
(17)(21) Тут вся выгода в именно в схеме, так сказать инструмент и инструкция в одном флаконе. Для прямоугольника и круга можно и в блокнотике набросать в ручную. Но есть необходимость создавать сложные рисунки, и всё работает шикарно, кроме текста. Не хочу эту идею забрасывать, надеюсь довести до результата.
23 DiMel_77
 
22.09.24
10:09
(22) Посмотрел я схему, там прикол в том. что в свойствах типа объекта "textType" установлен смешанный тип. Это означает, что текстовое содержимое блока может содержать вложенные теги. Например так:

<text x="10" y="30">
    You are
    <tspan>not</tspan>
    a banana!
</text>

А это означает, что необходимо использовать ПоследовательностьXDTO. В результате добавление текстового элемента осуществляется так:
Текст = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg" ,"textType");
    Текст.x="20";
    Текст.y="35";
    
    ПоследовательностьXDTO = Текст.Последовательность();
    ПоследовательностьXDTO.Добавить("Текст для проверки");
    
    ГлавныйКонтейнер.text.Добавить(Текст);

Не за что :)
24 tan76
 
22.09.24
20:11
(23) Да как же не за что, очень даже есть за что!!! Спасибо! сам я бы до такого не додумался.
25 oleg_km
 
23.09.24
00:03
(23) А я-то думал, почему текст приходится читать через ПоследовательностьXDTO. А оказывается возможны еще вложенные теги