Имя: Пароль:
1C
 
Сравнить два XML с разной сортировкой
0 RomaH
 
naïve
03.07.17
11:31
Суть - ТФОМС раз 20 в год выкладывает файл XML с нормативно-справочной
что изменили - нам не рассказывают
соответственно - берем предыдущий файл
текущий
и сравниваем как текст - KDiff3

но ТФОМС разгадал наш хитрый план - и теперь каждый раз пересортировывает таблицы перед выгрузкой в XML
теперь что там реально изменилось с первого раза не видно


хотелось бы этот файл как-то преобразовать в произвольные коллекции, отсортировать и сохранить обратно в текст - дабы просто сравнить два текстовых файла с одинаковой сортировкой


    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.УстановитьСтроку(Объект.ТекстФайла);
    
    Данные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);


в данных имеем структуру типа ОбъектХДТО - СписокХДТО

но СписокХДТО не сортируется

Подскажите?
1 Кирпич
 
03.07.17
11:33
вытягивай из обоих файлов важные данные, сортируй как тебе надо и сравнивай.
2 RomaH
 
naïve
03.07.17
11:33
можно рекурсией все списки выгрузить в ТЗ с генерируемой структурой колонок по свойствам...
3 RomaH
 
naïve
03.07.17
11:34
(1) для этого надо четко описывать структуру важных данных
там порядка 70 таблиц
при этом структура может неожиданно менятся
мне нужна универсальность
4 trdm
 
03.07.17
11:35
А выложить можно куда-нить файло?
5 RomaH
 
naïve
03.07.17
11:36
6 Кирпич
 
03.07.17
11:44
(3) т.е. вас не волнует в какой из 70 таблиц, что изменилось. А что же вас тогда волнует.
7 Mihenius
 
03.07.17
11:45
(0) Мы пробовали ругаться. Писали им грозные письма.

Потом плюнули, создали в sql отдельные временные базы. Грузим туда и спокойно сравниваем.

А так да, с форматом xml в ФОМС-ах видимо еще до сих пор не разобрались )

Особенно радует могут 1 код удалить вначале года, в конце года по этому же коду добавить совсем другой элемент.

Или период действия гонять туда сюда.
8 trdm
 
03.07.17
11:47
Пересортировывай перед сравнением.
9 trdm
 
03.07.17
11:48
Не смысла ругаться. Все равно не отреагируют.
10 RomaH
 
naïve
03.07.17
11:50
(8) так и вопрос - как пересортировать?
11 Cyberhawk
 
03.07.17
11:50
ПреобразованиеXSL
12 Mihenius
 
03.07.17
11:51
(7) Еще из приколов Федеральный и Местный фонды со структурой разобраться не могут друг с другом. И бессистемно и бессмысленно дублируют поля по таблицам.

И сидишь постоянно репу чешешь. Чего же они в этом месяце нового придумают )

Из последних приколов. Введен новый порядок с 1 мая.
(изменена структура, добавлено/изменена куча полей)

И вот, о чудо, 30 апреля сообщают, что ПО еще не готово и изменения начнут действовать с июня )

А мы уже все сделали ) Пришлось за 1 день возвращать назад.

Короче бардак там полный.
13 Mihenius
 
03.07.17
11:54
(10) В связи с тем что они не понимают что ключевое поле должно быть уникальным, хотя бы в пределах года - делали свой ключ "Код+Начало действия", иначе потом не разберешься.
14 trdm
 
03.07.17
11:56
(10) Обычным XML мелкософтовским.
Открываешь 2 файла, один на чтение, другой на запись, выдираешь baseName из узлов 3-го уровня - это и будут ключи сортировки. Пихаешь их в список, сортируешь список, потом идя по отсортированному списку выгружаешь во второй файл. Его и сравниваешь.
15 trdm
 
03.07.17
12:01
+(14) для веток 4-го уровня можно завести словарь уникальных полей.
LPUs->code
fed_department_mo->IDOTD
И т.п.
16 RomaH
 
naïve
03.07.17
12:08
(11) уверен?
17 Cyberhawk
 
03.07.17
12:15
(16) Нет, конечно - тут ведь пишут, что выкладывают файл с расширением xml, но стандартам XML он не отвечает
18 RomaH
 
naïve
03.07.17
12:15
(14) что такое обычный XML мелкосовтовский?
19 Mihenius
 
03.07.17
12:21
20 trdm
 
03.07.17
13:31
21 Lama12
 
03.07.17
13:58
(0) Возможно не в тему.
Если открыть в екселе и там отсортировать и сравнить, результат устроит?
Или там структура такая что ексель не переваривает?
22 1dvd
 
03.07.17
14:12
Когда-то давно-давно делал сравнилавку xml файлов, которая бы тебе помогла. Но, она для клюшек :)

http://catalog.mista.ru/public/60322/
23 RomaH
 
naïve
03.07.17
14:22
(22) сортировку написал
сильно не помогла в этом случае

KDiff3 - не видит вставленные и убранные куски

https://screenpresso.com/=HNPNf
24 RomaH
 
naïve
03.07.17
14:23
&НаКлиенте
Процедура ВыполнитьСортировку(Команда)
    ВыполнитьСортировкуНаСервере();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьСортировкуНаСервере()
    
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.УстановитьСтроку(Объект.ТекстФайла);
    
    Данные = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
    
    ПройтисьПоВеткеДерева(Данные.body);
    
    ЗаписьXML = Новый ЗаписьXML;
    
    ЗаписьXML.УстановитьСтроку("windows-1251");
    ЗаписьXML.ЗаписатьОбъявлениеXML();
    ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, Данные);
    
    Объект.ТекстВыгрузки = ЗаписьXML.Закрыть();
    
КонецПроцедуры

Процедура ПройтисьПоВеткеДерева(ЗначениеВетки)
    
    //Свойства = ЗначениеВетки.Свойства();
    
    Для Каждого Свойство Из ЗначениеВетки.Свойства() Цикл
        
        ЗначениеСвойства = ЗначениеВетки[Свойство.ЛокальноеИмя];
        
        Если ТипЗнч(ЗначениеСвойства) = Тип("СписокXDTO") Тогда
            ОтсортироватьСписок(ЗначениеСвойства);    
        ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("ОбъектXDTO") Тогда
            ПройтисьПоВеткеДерева(ЗначениеСвойства);
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Процедура ОтсортироватьСписок(ЗначениеСвойства)
    //ЗначениеСвойства - СписокXDTO    
    //Создадим ТЗ со структурой колонок как у Списка
    
    ТаблицаСписка = Новый ТаблицаЗначений;
    
    МассивСортировки = Новый Массив;
    
    КолонокСортировки = 0;
    
    СтрокаСортировки = СтрСоединить(МассивСортировки,",");
    
    Для Каждого СтрокаСписка Из ЗначениеСвойства Цикл
        
        Для Каждого Свойство Из СтрокаСписка.Свойства() Цикл
            
            Если ТаблицаСписка.Колонки.Найти(Свойство.ЛокальноеИмя) = Неопределено Тогда
                ТаблицаСписка.Колонки.Добавить(Свойство.ЛокальноеИмя);
                Если КолонокСортировки <= 3 И ТипЗнч(СтрокаСписка[Свойство.ЛокальноеИмя]) = Тип("Строка") Тогда
                    МассивСортировки.Добавить(Свойство.ЛокальноеИмя);
                    КолонокСортировки = КолонокСортировки + 1;
                КонецЕсли;
            КонецЕсли;
            
            Если ТипЗнч(СтрокаСписка[Свойство.ЛокальноеИмя]) = Тип("СписокXDTO") Тогда
                ОтсортироватьСписок(СтрокаСписка[Свойство.ЛокальноеИмя]);    
            ИначеЕсли ТипЗнч(СтрокаСписка[Свойство.ЛокальноеИмя]) = Тип("ОбъектXDTO") Тогда
                ПройтисьПоВеткеДерева(СтрокаСписка[Свойство.ЛокальноеИмя]);
            КонецЕсли;
        КонецЦикла;
        
        СтрокаТЗ = ТаблицаСписка.Добавить();
        
        ЗаполнитьЗначенияСвойств(СтрокаТЗ,СтрокаСписка);
        
        
    КонецЦикла;
    
    Если Не ПустаяСтрока(СтрокаСортировки) Тогда
        ТаблицаСписка.Сортировать(СтрокаСортировки);
    КонецЕсли;
    
    ИндексСтроки = 0;
    
    Для Каждого СтрокаСписка Из ЗначениеСвойства Цикл
        
        ЗаполнитьЗначенияСвойств(СтрокаСписка,ТаблицаСписка[ИндексСтроки]);
        ИндексСтроки = ИндексСтроки + 1;
        
    КонецЦикла;
    
    //ФабрикаXDTO.Создать(ЗначениеСвойства.ПолучитьXDTO(0).Тип(),ЗначениеСвойства.ПолучитьXDTO(0))
КонецПроцедуры
25 RomaH
 
naïve
03.07.17
14:28
Для Каждого СтрокаСписка Из ЗначениеСвойства Цикл
        
        ЗаполнитьЗначенияСвойств(СтрокаСписка,ТаблицаСписка[ИндексСтроки]);
        ИндексСтроки = ИндексСтроки + 1;
        
    КонецЦикла;

вот это, конечно, в корне не верно

но как создать ОбъектXDTO не имея схемы?
26 trdm
 
03.07.17
15:15
(23) ну дык сортируй подветки дальше. Я вроде намекал в (15)
27 EugeniaK
 
03.07.17
15:19
(0) Утилитка  ExamDIFF. Отлично сравнивает XML с учетом имен элементов, а не порядка расположения.
28 EugeniaK
 
03.07.17
15:22
(27) Перепутала название. Правильно ExamXML. Для постоянного использования стоит символических денег, первые 30 дней бесплатно.
29 RomaH
 
naïve
03.07.17
15:44
(28) оно виснет на таких файлах 26 метров, похоже для него не подъемно)
30 Вафель
 
03.07.17
15:48
Чтение XML в дерево - задача решенная много-много лет назад
31 RomaH
 
naïve
04.07.17
07:28
а как, все-таки, создать новый объектХДТО с определенным набором свойств?
32 Garykom
 
гуру
04.07.17
08:21
(0) Там же в заголовке XML указано https://ru.wikipedia.org/wiki/XMLSpy
33 Garykom
 
гуру
04.07.17
08:21
(32)+ Это такой DBF Navigator для "программистов"