Запись экранированных кодов маркировки в xml

1. pavel06 2 28.07.22 22:53 Сейчас в теме
Для создания электронного УПД по приказу ФНС надо записывать коды маркировки в файл xml
(У меня нестандартная УТ10.3, ОФ.)
Про записи кода по :
                              ЗаписьXML.ЗаписатьНачалоЭлемента("КИЗ");
				ЗаписьXML.ЗаписатьТекст(КМ);
				ЗаписьXML.ЗаписатьКонецЭлемента();


1С преобразует зачем-то символы > < & , а "(кавычку двойную) и '(кавычку одинарную) не преобразует.

Если же экранировать весь код маркировки по типу:
        Процедура Экранирование(КМ)
		КМ = "<![CDATA[" + КМ+ "]]>";
	КонецПроцедуры
        .......
                               Экранирование(КМ);
                                ЗаписьXML.ЗаписатьНачалоЭлемента("КИЗ");
				ЗаписьXML.ЗаписатьТекст(КМ);
				ЗаписьXML.ЗаписатьКонецЭлемента();

Показать


то ЗаписьXML сам КМ не преобразует, но пребразует знаки <" меньше" и >"больше" перед и после CDATA
т.е. получается в файле XML

<КИЗ>&-lt;-![CDATA[код_маркировки]]&-gt;-</КИЗ>

нормальных угловых скобок не выходит(минусы я доставил, чтобы движок форума не преобразовывал
&-l-t-; в знак <)

Можно ли отключить эти странные, вредные преобразования символов в 1C ?
Или есть какие-нибудь пути решения проблемы, обхода? (на других, не 1С языках писать долго)
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
2. gml 29.07.22 22:52 Сейчас в теме +2 $m
Можно весь текст xml собрать конкатенацией строк, не используя ЗаписьXML.
Непонятно только зачем. Если в значении элемента действительно должны присутствовать символы разметки (<,>, &), то они по правилам xml ДОЛЖНЫ быть экранированы.
Собственно, это и пытается сделать платформа. На приемной стороне экранирование будет снято, и значение элемента с символами разметки будет восстановлено.
Можно это проверить, прочитав получившийся файл методом ПрочитатьXML в 1С.

Если Вы хотите включить в документ секцию CDATA, делайте это с помощью метода ЗаписатьСекциюCDATA ()
user712340_lost-s0u1; pavel06; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. gml 29.07.22 22:52 Сейчас в теме +2 $m
Можно весь текст xml собрать конкатенацией строк, не используя ЗаписьXML.
Непонятно только зачем. Если в значении элемента действительно должны присутствовать символы разметки (<,>, &), то они по правилам xml ДОЛЖНЫ быть экранированы.
Собственно, это и пытается сделать платформа. На приемной стороне экранирование будет снято, и значение элемента с символами разметки будет восстановлено.
Можно это проверить, прочитав получившийся файл методом ПрочитатьXML в 1С.

Если Вы хотите включить в документ секцию CDATA, делайте это с помощью метода ЗаписатьСекциюCDATA ()
user712340_lost-s0u1; pavel06; +2 Ответить
3. pavel06 2 29.07.22 23:40 Сейчас в теме
(2) Да, спасибо что ответили.
Конкатенацией строк программировать очень долго и муторно, документ большой.
Действительно, экранирование с <![CDATA[ подходит к этому случаю.
Испорченные/подмененные 1С символы (<,>, &), действительно видны в Блокноте(файл xml) и портят картину,
но при загрузке файла в Честный знак, он их исправляет и показывает у себя неизмененными.
Я просто боялся загружать такой файл, а когда в отчаянии сегодня решился, обнаружилось, что все в порядке.
Что за правила xml про обязательность экранирования (<,>, &),внутри тегов? Где почитать?
Во многих местах пишут и про обязательность экранирования (" ') и всех <> в тегах, но 1С их почему-то не экранирует, как-то избирательно поступает.
4. gml 30.07.22 23:17 Сейчас в теме
(3) Стандартный источник информации об XML - w3c.org. (см., например, https://www.w3.org/TR/2008/REC-xml-20081126/)
Там очень много разных материалов на английском языке, найти нужную информацию порой бывает трудно. Можно поискать в Интернете по шаблону "XML escape characters" - найдёте множество статей на эту тему.
Можете посмотреть правила экранирования в материалах СМЭВ3(в описании алгоритма каноникализации), там разные правила для текста атрибутов, и элементов (а у элементов разные правила для коротких и длинных строк).
Как я понимаю, средства сериализации xml (а ЗаписьXML() - это средство сериализации, преобразовывающее набор компонентов объекта XML в файл) сами знают, в каком месте какие символы экранировать. Соответственно парсеры XML на другой стороне при разборе файла снимают экранирование.
По поводу секции CDATA и инструкций обработки - Вам надо убедиться, что "Честный знак" их принимает. Обычно эти вещи пишут в условиях обмена. Если в условиях обмена CDATA запрещены, но сейчас файлы с ними принимаются и проходят контроль, то никто не может гарантировать, что подобное поведение парсера "Честного знака" будет длиться вечно. Калитка может захлопнуться в любой момент.
Блокнот показывает файлы "как есть"(почти как есть, символы BOM не показывает 8-((), не делая отмены экранирования.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот