Имя: Пароль:
1C
1С v8
Создаю XML, а он парсится сторонней программой
0 DES
 
09.06.16
15:23
Подозреваю потому что 1С8.3.7 генерирует  такую конструкцию
<DUMMY/>
Вместо
<DUMMY></DUMMY>

Можно ли заставить 1с8 не сокращать конструкции XML ?
1 mehfk
 
09.06.16
15:23
Новый ЗаписьТекста;
2 Зая Бусечка
 
09.06.16
15:23
Это совершенно корректная запись.
Вправляй мозги сторонней программе.
3 DES
 
09.06.16
15:51
или писать анализатор текста с корректировкой ?
4 Fragster
 
гуру
09.06.16
16:23
то-ли через параметрызаписиXML, то ли через параметрыDOM когда-то давно это делал. почему-то не могу найти.
Но вообще (2) прав
5 DES
 
09.06.16
22:28
(4) я не могу дизассемблировать сайт госслужбы.
6 DES
 
09.06.16
22:29
сделал, примочку

Процедура КоррекцияXML(ИмяФайла) Экспорт
    Перем Текст, Номер, Стр, Сч;
    
    Текст  = Новый ТекстовыйДокумент;
    Текст.Прочитать(ИмяФайла, КодировкаТекста.UTF8);
    Для Номер=1 По Текст.КоличествоСтрок() Цикл
        Стр = Текст.ПолучитьСтроку(Номер);
        Если СтрЧислоВхождений(Стр, "/>")>0 Тогда
            Стр = СтрЗаменить(Стр,"/>", "¤");
            МассивТэгов = СтрРазделить(Стр, "¤", Ложь);
            Для Сч=0 по МассивТэгов.ВГраница() Цикл
                Если СтрНайти(МассивТэгов[Сч], """")=0 Тогда
                    Тэг = Сред(МассивТэгов[Сч], СтрНайти(МассивТэгов[Сч], "<", НаправлениеПоиска.СКонца)+1);
                    Если НЕ СтрНачинаетсяС(Тэг, "/") Тогда
                        МассивТэгов[Сч] = МассивТэгов[Сч] + "></" + Тэг + ">";
                    КонецЕсли;
                Иначе
                    МассивТэгов[Сч] = МассивТэгов[Сч] + "/>";
                КонецЕсли;
            КонецЦикла;
            Стр = СтрСоединить(МассивТэгов, "");
            Текст.ЗаменитьСтроку(Номер, Стр);
        КонецЕсли;
    КонецЦикла;    
    Текст.Записать(ИмяФайла, КодировкаТекста.UTF8);
    
КонецПроцедуры
7 Cyberhawk
 
09.06.16
22:31
Это валидная запись и вшита в платформу. Только пост-обработкой текстового документа
8 Cyberhawk
 
09.06.16
22:32
9 Armando
 
09.06.16
23:01
Вместо объекта ЗаписьXML используй КаноническаяЗаписьXML
10 Armando
 
09.06.16
23:02
ЗаписьXML = Новый КаноническаяЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ЗаписьXML.ЗаписатьНачалоЭлемента("Тест");
ЗаписьXML.ЗаписатьКонецЭлемента();
ТекстXML = ЗаписьXML.Закрыть();
Сообщить(ТекстXML);

Покажет
<Тест></Тест>
11 Armando
 
09.06.16
23:17
Кстати здесь https://www.w3.org/TR/xml-c14n#Terminology так и написано:
Empty elements are converted to start-end tag pairs
12 DES
 
10.06.16
12:13
Оказывается не в этом дело было, а в том что
если пишу
ЗаписьXML.ОткрытьФайл(ИмяФайла);
то 1С8 лепит в начало файла 3 байта каких то символов , которых даже в Notepad++ не видно. Из-за этого файл и не загружается.
А если пишу
ЗаписьXML.ОткрытьФайл(ИмяФайла,"windows-1251");
то все нормально, но коды символов текста преобразуются в не читаемые, но и файл загружается.
И 1с8 не лепит 3 непонятных символа в начало файла.
13 Зая Бусечка
 
10.06.16
12:14
(12) Эти три байта - признак уникода.
14 mehfk
 
10.06.16
12:16
15 Fragster
 
гуру
10.06.16
12:20
есть мнение, что внешняя программа - ацтой
16 Fragster
 
гуру
10.06.16
12:21
ну пиши в строку, а затем через запись текста (правда, емнип, там BOM все равное будет, если кодировка utf)
17 Pistol
 
10.06.16
12:24
(16) Для кириллицы UTF-8 без BOM называется CESU-8

Ну или старый, добрый трюк - дописать к пустому файлу
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.