Формирование векторной графики SVG напрямую из среды 1С — это мощный инструмент для создания динамических отчетов, дашбордов и визуализации данных. Одним из наиболее структурированных подходов является использование фабрики XDTO. Этот метод позволяет работать с элементами графики как с объектами, проверяя их на соответствие схеме XSD. Однако при работе с текстом разработчики часто сталкиваются с тем, что текстовое содержимое внутри тегов не отображается. В данной статье мы подробно разберем, как правильно генерировать SVG и как решить проблему "пустых" текстовых элементов.
Представим ситуацию: мы загрузили XSD-схему SVG в конфигурацию и пытаемся создать простой файл с прямоугольником и текстом. Рассмотрим типичный код, который на первый взгляд кажется правильным, но выдает неожиданный результат:
ГлавныйКонтейнер = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg", "svgType");
ГлавныйКонтейнер.width = 720;
ГлавныйКонтейнер.height = 576;
Прямоугольник = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg", "rectType");
Прямоугольник.x = "0";
Прямоугольник.y = "0";
Прямоугольник.width = "400";
Прямоугольник.height = "400";
Прямоугольник.fill = "#dfdc49";
ГлавныйКонтейнер.rect.Добавить(Прямоугольник);
ТекстОбъект = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg", "textType");
ТекстОбъект.x = "20";
ТекстОбъект.y = "35";
// Здесь возникает вопрос: как присвоить само текстовое значение "Мой текст"?
ГлавныйКонтейнер.text.Добавить(ТекстОбъект);
Проблема заключается в том, что при стандартной записи XML через ЗаписьXML и ФабрикаXDTO.ЗаписатьXML, элемент text выводится без содержимого: <text x="20" y="35"/>. Попытки простого присваивания значения объекту ТекстОбъект или использование метода Добавить с типом ФормаXML.Элемент приводят либо к ошибкам несоответствия типов, либо к некорректной вложенности тегов.
Проанализируем причину такого поведения. В спецификации SVG тип textType является так называемым смешанным типом данных (Mixed Content). Это означает, что внутри тега <text> может находиться как обычный текст, так и другие вложенные элементы (например, <tspan>). В 1С для работы с такими типами данных предусмотрен специальный механизм — ПоследовательностьXDTO.
Разберем по шагам, как добавить текст, используя этот механизм:
textType через фабрику.ПоследовательностьXDTO через метод Последовательность().Добавить() у последовательности для вставки текстовой строки.Посмотрим на исправленный пример кода:
ТекстОбъект = ФабрикаXDTO.Создать("http://www.w3.org/2000/svg", "textType");
ТекстОбъект.x = "20";
ТекстОбъект.y = "35";
// Получаем последовательность для работы со смешанным содержимым
Последовательность = ТекстОбъект.Последовательность();
// Добавляем текстовое значение напрямую в последовательность
Последовательность.Добавить("Привет, 1С и SVG!");
ГлавныйКонтейнер.text.Добавить(ТекстОбъект);
Этот метод гарантирует, что при сериализации объекта в XML текст окажется внутри тегов <text>...</text>, сохраняя валидность SVG-документа.
Если работа с XDTO кажется избыточной или используемая XSD-схема накладывает слишком строгие ограничения, рассмотрим альтернативный вариант — использование встроенных средств работы с DOM в 1С. Этот метод зачастую более гибкий при построении сложных графических структур.
Проанализируем ситуацию на примере создания того же текстового узла:
ДокументDOM = Новый ДокументDOM;
ЭлементSVG = ДокументDOM.СоздатьЭлемент("svg");
ЭлементSVG.УстановитьАтрибут("xmlns", "http://www.w3.org/2000/svg");
ЭлементТекст = ДокументDOM.СоздатьЭлемент("text");
ЭлементТекст.УстановитьАтрибут("x", "20");
ЭлементТекст.УстановитьАтрибут("y", "35");
// Создаем текстовый узел и добавляем его как дочерний элемент
ТекстовоеЗначение = ДокументDOM.СоздатьТекстовыйУзел("Текст через DOM");
ЭлементТекст.ДобавитьДочерний(ТекстовоеЗначение);
ЭлементSVG.ДобавитьДочерний(ЭлементТекст);
Метод СоздатьТекстовыйУзел() является прямым аналогом работы с последовательностью в XDTO. Выбор между XDTO и DOM зависит от ваших целей: XDTO удобен наличием подсказок свойств и строгой типизацией, в то время как DOM прощает отсутствие описания атрибутов в схеме.
Выясним причины возможных проблем при просмотре полученных файлов в браузерах или внутри 1С:
ЗаписатьXML фабрика XDTO может добавлять служебные атрибуты, такие как xmlns:xs или xsi:type. Для SVG критически важно, чтобы основное пространство имен было http://www.w3.org/2000/svg. Если сторонние просмотрщики не открывают файл, проверьте чистоту корневого тега.ПолеHTMLДокумента на форме 1С, обязательно добавляйте атрибут viewBox. Он определяет логические координаты холста, которые будут растягиваться под размер контейнера.После того как мы сформировали XML-структуру, ее необходимо отобразить. Рассмотрим, как это сделать без сохранения во временный файл, используя Base64:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ГлавныйКонтейнер);
ТекстSVG = ЗаписьXML.Закрыть();
// Формируем Data URI для отображения в ПолеHTMLДокумента
ПутьККартинке = "data:image/svg+xml;base64," + Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(ТекстSVG));
Элементы.ПолеКартинки.Документ.location.href = ПутьККартинке;
Таким образом, использование ПоследовательностьXDTO для текстовых данных позволяет полностью реализовать потенциал векторной графики в 1С, сохраняя все преимущества объектного подхода фабрики XDTO.