Имя: Пароль:
1C
 
Выгрузка в XML (порядок следования элементов)
,
0 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
ну переставь местами строки и посмотри
2 youalex
 
16.04.21
06:53
может не тот файл смотришь?
Напиши Сообщить(ХМЛФайлДанных.Закрыть()) после твоего фрагмента
3 Chameleon1980
 
16.04.21
07:00
А чем смотришь?
Может это просмотрщик сотрирует
4 55reg
 
16.04.21
07:04
(1) пробовал бесполезно, все параметры в обратном порядке...
5 55reg
 
16.04.21
07:04
(3) Да нет ))) если открыть в блокноте так и будет. Ну и парсер выдает ошибку
6 55reg
 
16.04.21
07:07
(2) ну там цикл - это сложно сделать ...
7 55reg
 
16.04.21
07:10
(2) это вообще не работает! Ничего не происходит
8 55reg
 
16.04.21
07:11
Такое ощущение что какая то сортировка включена!
9 Ненавижу 1С
 
гуру
16.04.21
07:12
Оффтоп конечно, но в приличных местах порядок следования элементов в xml или json, а также "лишние" элементы, не должны влиять на результат парсера.
10 youalex
 
16.04.21
07:13
(7) блин, для проверки просто сделай, посмотри что выведется
11 PowerBoy
 
16.04.21
07:17
Чудес не бывает, это вьюер тебе показывает разный порядок, открой например c помощью Notepad++
12 55reg
 
16.04.21
07:17
(10) Ничего не выдается! Сообщить не работает так
13 55reg
 
16.04.21
07:18
(9) Ну как бы алкогольная декларация ...
14 NorthWind
 
16.04.21
07:18
(0) порядок следования атрибутов в XML не определен и, насколько я понимаю, вы не добьетесь определенного следования. Ну если только не возьметесь записывать это все строками как текст. Вопрос второй: зачем это вам? Обычно определенного порядка атрибутов никто не требует.
15 acht
 
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 как текст.
16 55reg
 
16.04.21
07:23
(14) Ну как бы можно рискнуть и попробовать сдать алкогольную декларацию так (в таком порядке) такой себе риск...
17 55reg
 
16.04.21
07:25
(14) Я так и понял что это все сведется к тексту... Очень странно - если порядок не определен почему он определяется именно таким, а не так как записываются элементы.
(xml не особо моя тема, не думал что так все через Ж)
18 acht
 
16.04.21
07:27
(17) >  Очень странно
Это обычный вопрос к программе, написаной не тобой. Другие, кстати, задают тот же вопрос, смотря на твои программы =)
19 youalex
 
16.04.21
07:28
(12) заинтриговал) как "так" не работает?
ну в отладчике посмотри ХМЛФайлДанных.Закрыть(), только помни, что у тебя будет всего один шанс
20 55reg
 
16.04.21
07:30
(18) вы намекаете что 1С сама при работе с xml сохраняет в таком порядке? Я просто хочу понять на каком этапе принимается решение, "а давайте я все наоборот запишу ради прикола это же весело"
ps
Как то можно отредактировать xml? Мне надо то всего две записи поменять местами.
21 Bigbro
 
16.04.21
07:31
переходите на 7ку там все работает корректно)
22 spectre1978
 
16.04.21
07:34
(16) сдадите. Если проблемы и возникнут, то не по этой части.
(21) не-а, v7plus так же записывает ;))
23 Провинциальный 1сник
 
16.04.21
07:36
(17) "Очень странно - если порядок не определен почему он определяется именно таким"
Если порядок не определен стандартом - то формирователь упорядочивает так, как ему удобнее и проще.
(21) Там такая же хрень. Если вы про v7plus.
24 spectre1978
 
16.04.21
07:37
(20) все попадавшиеся мне формирователи xml записывали атрибуты в каком-то своем порядке, исходя из внутренних соображений. Было такое, что я тоже задавался тем же вопросом что и вы, но в реальности это оказалось не нужно. Выборка идет по имени, а не по номеру. Ну как член структуры. Так что абсолютно неважно в каком порядке они записаны.
25 Bigbro
 
16.04.21
07:39
да пардон, заглянул где у меня XML формируются в строгом порядке - там через текст врукопашную все формируем.
26 55reg
 
16.04.21
07:42
(22) Ха! делов то! открыл в блокноте и поменял стоки Возврат и Приход как нужно и все проверилось как надо! Возможно Парсер Декларант-Алко не хочет воспринимать такой порядок (не верный), но рисковать с РАР'ом не хочется ... Типа они то верно распарсят как бы там не шло...
27 acht
 
16.04.21
07:44
(20) > вы намекаете
Не намекаю, утверждаю. Там в потрохах, если я правильно помню, libxml2. Это к ней.

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

Стало ясно что победить это - никак.
Если делать то через Текст (раньше так и делал выгрузки), но эта конкретная выгрузка наследие от др. прогеров ))
Сдам пока так (исправлю руками одну строку) - будет еще 3 мес что бы переделать как надо.
32 55reg
 
16.04.21
07:49
(29) каюсь это касяк - уже иcправляюсь...
33 55reg
 
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"/>
</Поставщик>

Это что то меняет? Есть решение?
34 55reg
 
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"));
    ХМЛФайлДанных.ЗаписатьКонецЭлемента();//Продукция
КонецЕсли;    
                                                                        
КонецЦикла;
ХМЛФайлДанных.ЗаписатьКонецЭлемента();//Поставщик

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

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

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

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

Этот файл - 1 квартал 2021. Раньше, точно так-же на просмотр выводилось. Так, что ищите причину, она в чем-то другом.
Кстати, что в протоколе приема на сайте ФСРАР пишет, покажите ошибку -?
55 55reg
 
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/
56 55reg
 
16.04.21
12:13
(54) В РАР буду сдавать в понедельник уже...

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

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

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

Но, и в новых файлах 08 форм, все точно так-же.
Могу скриншоты переделать, если надо...
61 MWWRuza
 
гуру
16.04.21
12:28
Нет, не через текст, через запись ХМЛ...
62 MWWRuza
 
гуру
16.04.21
12:30
В боевых - возвратов не было. Но, естественно тестировал.
Просто у меня возвраты проверяются при формировании декларации, что они введены на основании ВозвратЕГАИС. Если возврат сделан просто произвольно, он в декларацию не включается, что-бы не было расхождения с ЕГАИС.
63 55reg
 
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 порядок сохраняет ибо это построчная запись текста.
Ищи свой косяк
65 acht
 
16.04.21
12:37
(63) У тебя "Если  Строка7.Возврат > 0 Тогда" и "Если  Строка7.Приход > 0 Тогда" выполняются в произвольном порядке. Ищи почему.
66 55reg
 
16.04.21
12:44
(64) Моя тема доказывает обратное ))) Я бы рад с вами согласиться но все пишется так как ему хочется
(ряд причин тут уже озвучили)

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

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

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