Вход | Регистрация
 

Выгрузка в XML (порядок следования элементов)

Выгрузка в XML (порядок следования элементов)
Я
   55reg
 
16.04.21 - 04:50
Нужна помощь! Уже и не знаю что делать!

Есть выгрузка в XML все работает замечательно, но есть одно НО! Порядок следования элементов не так как их записываю, а зеркально что ли.

Пример - это в xml получается!
<?xml version="1.0" encoding="WINDOWS-1251"?>
-<Файл НаимПрог="1С:Предприятие 8.2" ВерсФорм="4.4" ДатаДок="16.04.2021">
-<ФормаОтч НомФорм="38" ПризПериодОтч="3" ГодПериодОтч="2021">

а в коде я пишу
ХМЛФайлДанных.ЗаписатьНачалоЭлемента("Файл");
ХМЛФайлДанных.ЗаписатьАтрибут("ДатаДок",Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy"));     
ХМЛФайлДанных.ЗаписатьАтрибут("ВерсФорм","4.4");                                 
ХМЛФайлДанных.ЗаписатьАтрибут("НаимПрог","1С:Предприятие 8.2");                 
        
ХМЛФайлДанных.ЗаписатьНачалоЭлемента("ФормаОтч");  
ХМЛФайлДанных.ЗаписатьАтрибут("ГодПериодОтч",Формат(КонПериода, "ДФ=yyyy"));      
ХМЛФайлДанных.ЗаписатьАтрибут("ПризПериодОтч",ПризПериодОтч(КонПериода));          
ХМЛФайлДанных.ЗаписатьАтрибут("НомФорм","38");

Что бы я не делал он мне в итоге выстраивает в порядке "наоборот" причем даже если в коде менять местами порядок записи - это никак не влияет!
А мне важно в одном месте соблюсти порядок следования этих записей иначе не верно парсит (((

Ткните носом что я делаю не так, спасибо!
   МимохожийОднако
 
1 - 16.04.21 - 06:45
ну переставь местами строки и посмотри
   youalex
 
2 - 16.04.21 - 06:53
может не тот файл смотришь?
Напиши Сообщить(ХМЛФайлДанных.Закрыть()) после твоего фрагмента
   Chameleon1980
 
3 - 16.04.21 - 07:00
А чем смотришь?
Может это просмотрщик сотрирует
   55reg
 
4 - 16.04.21 - 07:04
(1) пробовал бесполезно, все параметры в обратном порядке...
   55reg
 
5 - 16.04.21 - 07:04
(3) Да нет ))) если открыть в блокноте так и будет. Ну и парсер выдает ошибку
   55reg
 
6 - 16.04.21 - 07:07
(2) ну там цикл - это сложно сделать ...
   55reg
 
7 - 16.04.21 - 07:10
(2) это вообще не работает! Ничего не происходит
   55reg
 
8 - 16.04.21 - 07:11
Такое ощущение что какая то сортировка включена!
   Ненавижу 1С
 
9 - 16.04.21 - 07:12
Оффтоп конечно, но в приличных местах порядок следования элементов в xml или json, а также "лишние" элементы, не должны влиять на результат парсера.
   youalex
 
10 - 16.04.21 - 07:13
(7) блин, для проверки просто сделай, посмотри что выведется
   PowerBoy
 
11 - 16.04.21 - 07:17
Чудес не бывает, это вьюер тебе показывает разный порядок, открой например c помощью Notepad++
   55reg
 
12 - 16.04.21 - 07:17
(10) Ничего не выдается! Сообщить не работает так
   55reg
 
13 - 16.04.21 - 07:18
(9) Ну как бы алкогольная декларация ...
   NorthWind
 
14 - 16.04.21 - 07:18
(0) порядок следования атрибутов в XML не определен и, насколько я понимаю, вы не добьетесь определенного следования. Ну если только не возьметесь записывать это все строками как текст. Вопрос второй: зачем это вам? Обычно определенного порядка атрибутов никто не требует.
   acht
 
15 - 16.04.21 - 07:20
(0) Три пункта:
1) Не следует называть атрибуты XML элементами.
2) Порядок следования атрибутов XML по стандарту неопределен: https://www.w3.org/TR/REC-xml/#sec-starttags - "Note that the order of attribute specifications in a start-tag or empty-element tag is not significant". Так что все претензии к кривому парсеру.
3) Если за победу над кривым парсером платят деньги, то засучивай рукава и пиши все текстом - или ЗаписатьБезОбработки, или вообще весь XML как текст.
   55reg
 
16 - 16.04.21 - 07:23
(14) Ну как бы можно рискнуть и попробовать сдать алкогольную декларацию так (в таком порядке) такой себе риск...
   55reg
 
17 - 16.04.21 - 07:25
(14) Я так и понял что это все сведется к тексту... Очень странно - если порядок не определен почему он определяется именно таким, а не так как записываются элементы.
(xml не особо моя тема, не думал что так все через Ж)
   acht
 
18 - 16.04.21 - 07:27
(17) >  Очень странно
Это обычный вопрос к программе, написаной не тобой. Другие, кстати, задают тот же вопрос, смотря на твои программы =)
   youalex
 
19 - 16.04.21 - 07:28
(12) заинтриговал) как "так" не работает?
ну в отладчике посмотри ХМЛФайлДанных.Закрыть(), только помни, что у тебя будет всего один шанс
   55reg
 
20 - 16.04.21 - 07:30
(18) вы намекаете что 1С сама при работе с xml сохраняет в таком порядке? Я просто хочу понять на каком этапе принимается решение, "а давайте я все наоборот запишу ради прикола это же весело"
ps
Как то можно отредактировать xml? Мне надо то всего две записи поменять местами.
   Bigbro
 
21 - 16.04.21 - 07:31
переходите на 7ку там все работает корректно)
   spectre1978
 
22 - 16.04.21 - 07:34
(16) сдадите. Если проблемы и возникнут, то не по этой части.
(21) не-а, v7plus так же записывает ;))
   Провинциальный 1сник
 
23 - 16.04.21 - 07:36
(17) "Очень странно - если порядок не определен почему он определяется именно таким" 
Если порядок не определен стандартом - то формирователь упорядочивает так, как ему удобнее и проще.
(21) Там такая же хрень. Если вы про v7plus.
   spectre1978
 
24 - 16.04.21 - 07:37
(20) все попадавшиеся мне формирователи xml записывали атрибуты в каком-то своем порядке, исходя из внутренних соображений. Было такое, что я тоже задавался тем же вопросом что и вы, но в реальности это оказалось не нужно. Выборка идет по имени, а не по номеру. Ну как член структуры. Так что абсолютно неважно в каком порядке они записаны.
   Bigbro
 
25 - 16.04.21 - 07:39
да пардон, заглянул где у меня XML формируются в строгом порядке - там через текст врукопашную все формируем.
   55reg
 
26 - 16.04.21 - 07:42
(22) Ха! делов то! открыл в блокноте и поменял стоки Возврат и Приход как нужно и все проверилось как надо! Возможно Парсер Декларант-Алко не хочет воспринимать такой порядок (не верный), но рисковать с РАР'ом не хочется ... Типа они то верно распарсят как бы там не шло...
   acht
 
27 - 16.04.21 - 07:44
(20) > вы намекаете
Не намекаю, утверждаю. Там в потрохах, если я правильно помню, libxml2. Это к ней.

> отредактировать xml? Мне надо то всего две записи
Не надо "хитрить". Надо делать как надо. Кроилово ведет к последующему попадалову.
   55reg
 
28 - 16.04.21 - 07:45
(24) Не все с вами согласятся...
https://coderoad.ru/1131495/В-XML-году-важен-ли-порядок
   acht
 
29 - 16.04.21 - 07:46
(28) Уважаемый. Ты атрибуты от элементов когда отличать научишся?
   acht
 
30 - 16.04.21 - 07:46
(26) >  стоки Возврат и Приход 
Про это в примере не слова не было. Если это элементы, то ты ССЗБ, формируя XML так
 
 
   55reg
 
31 - 16.04.21 - 07:48
В любом случае всем спасибо за участие!

Стало ясно что победить это - никак.
Если делать то через Текст (раньше так и делал выгрузки), но эта конкретная выгрузка наследие от др. прогеров ))
Сдам пока так (исправлю руками одну строку) - будет еще 3 мес что бы переделать как надо.
   55reg
 
32 - 16.04.21 - 07:49
(29) каюсь это касяк - уже иcправляюсь...
   55reg
 
33 - 16.04.21 - 07:51
(30) Ничего не понял что такое ССЗБ ?

Вот кусок (пример проблемы) 
-<Поставщик ПN="1" ИдПоставщика="000000522">
<Поставка П000000000016="1.01000" П000000000015=" " П000000000014="2190084" П000000000013="19.02.2021"/>
<Возврат П000000000016="0.54000" П000000000015=" " П000000000014="" П000000000013="20.02.2021"/>
</Поставщик>

Это что то меняет? Есть решение?
   55reg
 
34 - 16.04.21 - 07:53
.
.
.
.
.

Если  Строка7.Возврат > 0 Тогда 
 ХМЛФайлДанных.ЗаписатьНачалоЭлемента("Возврат");  // Продукция 4.3

    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000013",Формат(Строка7.Документ.Дата,"ДФ=dd.MM.yyyy"));
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000014",СокрЛП(Строка7.Документ.НомерВходящегоДокумента));
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000015"," ");
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000016",Формат(Строка7.Возврат,"ЧДЦ=5; ЧРД=.; ЧН=0.0000; ЧГ=0"));
    ХМЛФайлДанных.ЗаписатьКонецЭлемента()//Продукция

КонецЕсли;    
        
Если  Строка7.Приход > 0 Тогда 
    ХМЛФайлДанных.ЗаписатьНачалоЭлемента("Поставка",);  // Продукция 4.3

    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000013",Формат(Строка7.Документ.Дата,"ДФ=dd.MM.yyyy"));
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000014",СокрЛП(Строка7.Документ.НомерВходящегоДокумента));
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000015"," ");
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000016",Формат(Строка7.Приход,"ЧДЦ=5; ЧРД=.; ЧН=0.0000; ЧГ=0"));
    ХМЛФайлДанных.ЗаписатьКонецЭлемента()//Продукция

КонецЕсли;    
                                                                        
КонецЦикла;
ХМЛФайлДанных.ЗаписатьКонецЭлемента()//Поставщик


Вот сама запись...
   55reg
 
35 - 16.04.21 - 07:55
Само собой кусок уже исправленный.
В коде как не меняй местами - Возврат на первом месте а потом приход ... Не хорошо!
   RomaH
 
36 - 16.04.21 - 08:01
делай два цикла
вынеси условия в разные циклы - сначала приход
потом возврат
   RomaH
 
37 - 16.04.21 - 08:04
либо коллекцию сортировать так, что бы приход был перед возвратом (или ка тебе надо?)
   55reg
 
38 - 16.04.21 - 08:39
(36) Да, я сначала так и хотел сделать 2 цикла - но работает не корректно - где то путаница с закрытием Элементов.

А как сортировать ?
   NorthWind
 
39 - 16.04.21 - 09:00
(28) вы декларацию сдайте. Если вам придет отлуп от проверки синтаксиса из-за проверки атрибутов - тогда и будете греть голову.
   55reg
 
40 - 16.04.21 - 09:09
(39) Так вы точно знаете что порядок следования Атрибутов в Элементах не важен при проверке декларации в РАР?
Сдавали за 1 квартал по новому?
   NorthWind
 
41 - 16.04.21 - 09:59
(40) а вы точно знаете что он важен? :)
По сути дела. Заголовки, описанные в (0), встречаются у кучи государственных документов, в том числе у ЭУПД. Все это формировалось стандартными способами и сдавалось. Проблем не было. За порядком атрибутов никто не следил.
   NorthWind
 
42 - 16.04.21 - 10:01
я не исключаю, что может найтись какое-то ведомство, которое вдруг начнет вытрепывать голову с этим. В случае с нашим государством удивляться нельзя ничему. Но покуда этого не произошло - пользуйтесь стандартными средствами и не мучайтесь. Когда будут бить - тогда и будете плакать.
   55reg
 
43 - 16.04.21 - 10:14
(42) Проверка в uchet-info.com ругается... Не исключаю что РАРу пофиг на порядок. Логика в ваших словах конечно есть.
   Serg_1960
 
44 - 16.04.21 - 10:34
Чисто формально изучая описание (в том числе "Перечень структурных элементов логической модели файла обмена") не обнаружил никакой информации о порядке следования элементов. Отсутствуют также нумерация строк в перечне элементов и какая-либо кодировка элементов, позволяющая судить о порядке следования.
   MWWRuza
 
45 - 16.04.21 - 10:36
Правильно тут выше написали, порядок следования атрибутов на просмотре, зависит от того, чем просматривать...
Вот, один и тот-же файл, на скриншоте "из двух" - верхняя часть, до красной линии - браузером(IE), нижняя - Notepad++

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/i-385.jpg

Что касается порядка следования элементов - тут х.з., я такого не наблюдал - как вывожу строки ХМЛ(в данном случае - 1с77, компонентой v7Plus), так они и отображаются, любым просмотрщиком. Так, что ищите у себя.

PS На скриншоте, фрагмент реально сданной декларации, никаких проблем с ее приемом не возникло.
   Serg_1960
 
46 - 16.04.21 - 10:40
*(44) Исключение: таблицы 3.8 - 3.6.5 в них есть код, содержащий цифры
   MWWRuza
 
47 - 16.04.21 - 10:40
Не правильно ссылку на скриншот дал, это превьюшка, вот полноразмерная картинка:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-385.jpg
   RomaH
 
48 - 16.04.21 - 11:29
могу ошибаться, но если элементы описаны внутри sequence - то порядок важен
   RomaH
 
49 - 16.04.21 - 11:31
когда порядок не важен - то используется all

для атрибутов такого не видел
   55reg
 
50 - 16.04.21 - 11:57
(47) Это старый формат декларации 4.3 - когда у вас его приняли и за какой период?
В новом формате требуют указывать не только поступления (Элемент - Продукция в 4.3) в новой 4.4 это Поставка, теперь но еще и элемент Возврат. Я не знаю может и порядок не важен - сначала идет Возврат потом Поставка - надеюсь РАР примет...
   55reg
 
51 - 16.04.21 - 11:58
(47) До начала 2021 у меня все отлично сдавалось - никаких проблем то же не было с порядком Атрибутов.
   Жан Пердежон
 
52 - 16.04.21 - 12:00
уже сказали, что парсер - говно?
   55reg
 
53 - 16.04.21 - 12:06
(52) Да, было такое предположение )))
   MWWRuza
 
54 - 16.04.21 - 12:07
(51) До начала 2021

Этот файл - 1 квартал 2021. Раньше, точно так-же на просмотр выводилось. Так, что ищите причину, она в чем-то другом.
Кстати, что в протоколе приема на сайте ФСРАР пишет, покажите ошибку -?
   55reg
 
55 - 16.04.21 - 12:11
(54) Т е вы ничего не меняли просто сформировали все по старому ??? Оч странно... И это не корректировочная за 4 квартал 2020?

Приказ №396 определяет новый формат деклараций в электронном виде - Версии 4.4
Для деклараций объемов оборота этилового спирта и медицинских изделий - Версии 4.33 - это все не читали?

https://ucparma.ru/info/news/izmenenie-v-deklarirovanii-alkogolnoy-produktsii-v-2021-godu/
   55reg
 
56 - 16.04.21 - 12:13
(54) В РАР буду сдавать в понедельник уже...

Разработчики программного обеспечения с нетерпением ждали появления XSD схем новых форм деклараций, и, наконец они были опубликованы на сайте ФСРАР:  https://fsrar.gov.ru/Declaring/xsd_shemy
   MWWRuza
 
57 - 16.04.21 - 12:19
(56)  Т е вы ничего не меняли просто сформировали все по старому ???

В смысле, ничего не менял? Формат 4.40, форма №8... Дописывал в алгоритме формирования,но сам принцип - не менял, основа старая, как еще в 2012 году писал, так и дальше ее допиливаю с каждым изменением формата...
   RomaH
 
58 - 16.04.21 - 12:19
(56) ну вот
https://ibb.co/NjMLPkf

только такой порядок этих элементов
   55reg
 
59 - 16.04.21 - 12:25
(57) Через текст все написано ? Возвраты Поставщику были в декларации?
   MWWRuza
 
60 - 16.04.21 - 12:27
+(57) Аааааа!!!! Извиняюсь, я ошибся, когда скриншоты делал, старый файл открыл, 12 формы, чем ввел Вас в заблуждение. Просто первый, попавшийся под руку :-)

Но, и в новых файлах 08 форм, все точно так-же.
Могу скриншоты переделать, если надо...
 
 
   MWWRuza
 
61 - 16.04.21 - 12:28
Нет, не через текст, через запись ХМЛ...
   MWWRuza
 
62 - 16.04.21 - 12:30
В боевых - возвратов не было. Но, естественно тестировал.
Просто у меня возвраты проверяются при формировании декларации, что они введены на основании ВозвратЕГАИС. Если возврат сделан просто произвольно, он в декларацию не включается, что-бы не было расхождения с ЕГАИС.
   55reg
 
63 - 16.04.21 - 12:33
(57) Вот и у меня основа старая. (60) Ну если есть пример где идут Поступления и Возвраты в то можно - типа какой там порядок у вас? Если сначала Поступления потом Возвраты то хотелось бы знать ка вы это сделали не через текст )))


.
.
.
.

+ Code
Если  Строка7.Возврат > 0 Тогда 
 ХМЛФайлДанных.ЗаписатьНачалоЭлемента("Возврат");  // Продукция 4.3


    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000013",Формат(Строка7.Документ.Дата,"ДФ=dd.MM.yyyy"));
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000014",СокрЛП(Строка7.Документ.НомерВходящегоДокумента));
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000015"," ");
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000016",Формат(Строка7.Возврат,"ЧДЦ=5; ЧРД=.; ЧН=0.0000; ЧГ=0"));
    ХМЛФайлДанных.ЗаписатьКонецЭлемента(//Продукция


КонецЕсли;    
        
Если  Строка7.Приход > 0 Тогда 
    ХМЛФайлДанных.ЗаписатьНачалоЭлемента("Поставка",);  // Продукция 4.3


    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000013",Формат(Строка7.Документ.Дата,"ДФ=dd.MM.yyyy"));
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000014",СокрЛП(Строка7.Документ.НомерВходящегоДокумента));
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000015"," ");
    ХМЛФайлДанных.ЗаписатьАтрибут("П000000000016",Формат(Строка7.Приход,"ЧДЦ=5; ЧРД=.; ЧН=0.0000; ЧГ=0"));
    ХМЛФайлДанных.ЗаписатьКонецЭлемента(//Продукция


КонецЕсли;    
                                                                        
КонецЦикла;
ХМЛФайлДанных.ЗаписатьКонецЭлемента(//Поставщик



Вот мой код ...
   Вафель
 
64 - 16.04.21 - 12:35
ЗаписьXML порядок сохраняет ибо это построчная запись текста.
Ищи свой косяк
   acht
 
65 - 16.04.21 - 12:37
(63) У тебя "Если  Строка7.Возврат > 0 Тогда" и "Если  Строка7.Приход > 0 Тогда" выполняются в произвольном порядке. Ищи почему.
   55reg
 
66 - 16.04.21 - 12:44
(64) Моя тема доказывает обратное ))) Я бы рад с вами согласиться но все пишется так как ему хочется
(ряд причин тут уже озвучили)

(65) - выполняются в произвольном порядке. - это что еще за произвольный порядок выполнения кода? Отладчик с вами не согласен...
   acht
 
67 - 16.04.21 - 12:48
(66) Чудес не бывает. Иди договаривайся со своим отладчиком.
   Джордж1
 
68 - 16.04.21 - 12:50
(0)А как смотришь файл?

За IE такое замечено - отображает атрибуты в обратном порядке
   MWWRuza
 
69 - 16.04.21 - 12:53
(63) Поступления потом Возвраты то хотелось бы знать ка вы это сделали не через текст

Ну, учитывая, что я это все писал методом "латания дыр", алгоритм далеко не оптимальный. Когда я начинал этот отчет писать, такой задачи по возвратам - не было. Сейчас, переделывать все с нуля - лень.
Просто я собираю возвраты в отдельную таблицу, и после вывода приходов, проверяю, есть ли в ней строки по этой связке "Алкокод+Производитель", и если есть вывожу.
   55reg
 
70 - 16.04.21 - 12:56
(68) Открыл блокнотом - все то же самое ... До меня кажется начинает доходить в чем дело ))) acht навел на мысль
Я понял в чем прикол - остался вопрос как красиво это обыграть теперь ...
   55reg
 
71 - 16.04.21 - 12:56
(69) Ну да, нет возвратов нет проблем ))) несчастные 0,54 далл затисались во всей декларации )))
   55reg
 
72 - 16.04.21 - 13:07
В общем переделывать за кем то это пипец! При таком подходе вывода в цикле - возврат всегда тупо стоял первым в таблице ...
   Вафель
 
73 - 16.04.21 - 13:12
(72) вот видишь - всего лишь г...нокод, а не чудеса
   MWWRuza
 
74 - 16.04.21 - 13:15
(71) несчастные 0,54 далл затисались во всей декларации
Я еще, как выше писал, проверяю, введен ли возврат поставщику на основании возврата ЕГАИС... Просто, некоторые поставщики пива, не хотят с возвратами по ЕГАИС связываться, тупо забирают просрочку и утилизируют, заменяя на новую продукцию. Такие возвраты, которые прошли "по учету" но не проходили по ЕГАИС, показывать в декларации... Мягко говоря, "стремено" :-)
   55reg
 
75 - 16.04.21 - 13:31
(74) это понятно - у нас так не принято - только через ЕГАИС!
   55reg
 
76 - 16.04.21 - 13:31
(73) увы так ...


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.