Версия для печати темы (https://pro1c.org.ua/index.php?s=8305a7ad726fe580b00f83d8fede0060&showtopic=1221)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ 1С Предприятие 7.7 _ Разборка XML-файла стандартными средствами (v7plus)

Автор: Кузьмич 10.12.09, 19:56

В преддверии Новогодних праздников захотелось порадовать наше уважаемое сообщество, поэтому и родилась данная статья.
Тема неслучайна и возникла после того как столкнулся сам с такой задачей.
Пропагандируется, что XML-стандарт является наиболее быстрым и универсальным для обмена данными.
Универсальные загрузчики в 1С требуют схемы таких файлов. Приведенные примеры и обработки работают с файлами только несложной структуры и если файл имеет вложенность более 2х уровней, обработка отказывается с ней работать. А наличие в примерах документации несуществующих в компоненте v7plus команд может ввести в заблуждение не только новичка, но и опытного одноэснега.
Лично для меня это была тривиальная задача. Это напоминает мне разбор текстовых файлов с разделителями. Оооочень щепетильная и трудоемкая работа как на меня, и на решение у меня ушло почти 2 недели…
Итак, исходные данные – задачка с 2-мя неизвестными: Х – это содержащиеся в xml-файле данные, Y – это структура файла.
Принципиально отказываюсь от DOM-объекта и использую ПоследовательноСчитываемыйДокумент с его довольно скудным набором команд.
Загрузив внешнюю компоненту, создадим экземпляр «ПоследовательноСчитываемыйДокумент» и начнем с ним работать:

        гФайл = ХМЛАнализатор.СоздатьПоследовательноСчитываемыйДокумент();
    гФайл.СвязатьСФайлом(ИмяВыбрФайла);
    номУр=1;
    ТипТега = гФайл.Спуститься();
    Пока ТипТега <> 4 Цикл        //    пока не достигнут конец файла  
        ПрочитатьДерево(ТипТега,гФайл);
        Если ТипТега=4 Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;

В теле цикла мы должны прочитать вложенную структуру узла.
Это выполним при помощи процедуры «ПрочитатьДерево»:
      Если ВложТег>0 Тогда
        Уровней=КвоУровнейХМЛ(ВложТег,гФайл);
        штрих="--";
        Если ВложТег<3 Тогда  
            //первый полученный элемент
            Сообщить(""+штрих+"<ИмяТега>="+гФайл.СвойстваТекущегоУзла.Имя+"  Уровень="+гФайл.СвойстваТекущегоУзла.Уровень);
            Если гФайл.СвойстваТекущегоУзла.КоличествоАтрибутов>0 Тогда
                КвоАтрибутов= гФайл.СвойстваТекущегоУзла.КоличествоАтрибутов;
                Для а=0 по КвоАтрибутов-1 Цикл
                    Сообщить(""+гФайл.СвойстваТекущегоУзла.НаименованиеАтрибута(а)+"="+гФайл.СвойстваТекущегоУзла.ЗначениеАтрибута(а));
                КонецЦикла;
            КонецЕсли;
            Сообщить("11111111111111111");
            
        КонецЕсли;
            Если  ВложТег =3 Тогда
                //последующие вложенные элементы на текущем уровне
                ВложТег=гФайл.Следующий();
                Если ВложТег<3 Тогда
                    штрих=штрих+"--";
                    Сообщить(""+штрих+"<ИмяТега>="+гФайл.СвойстваТекущегоУзла.Имя+"  Уровень="+гФайл.СвойстваТекущегоУзла.Уровень);
                    Если гФайл.СвойстваТекущегоУзла.КоличествоАтрибутов>0 Тогда
                        КвоАтрибутов= гФайл.СвойстваТекущегоУзла.КоличествоАтрибутов;
                        Для а=0 по КвоАтрибутов-1 Цикл
                            Сообщить(""+штрих+"<Аттр>="+гФайл.СвойстваТекущегоУзла.НаименованиеАтрибута(а)+"="+гФайл.СвойстваТекущегоУзла.ЗначениеАтрибута(а));
                        КонецЦикла;
                    КонецЕсли;
                    Сообщить("**********************");
                КонецЕсли;    
            КонецЕсли;
    КонецЕсли;

Данная процедура использует функцию «КвоУровнейХМЛ», которая позволяет прочитать вложенность узла в полной мере:
       Если ур>0 Тогда
        Если ур =1 Тогда
            ур=гФайл.Спуститься();
            Если ур<3 Тогда  
                номУр=гФайл.СвойстваТекущегоУзла.Уровень;
            КонецЕсли;
        КонецЕсли;    
        Возврат номУр;
    КонецЕсли;

Таким образом у нас получилась http://pro1c.org.ua/redirect.php?http://www.salto.org.ua/ (надеюсь) обработка для чтения хмл-файла. Дальше можете для работы с результатом делать все, что вам удобно: занести эти данные в СписокЗначений, в ТаблицуЗначений либо эти оба варианта одновременно.

Спасибо за внимание. (чуть позже выложу саму обработку)

С уважением, Кузьмич.
И с наступающим НГ!

Автор: Кузьмич 10.12.09, 20:00

* (весь текст статьи вбил в первый пост, ибо поместилось)

Автор: Кузьмич 10.12.09, 20:17

а вот и сама обработка: http://pro1c.org.ua/redirect.php?http://princip.vn.ua/Downloads/extforms/razborXML.ert

Автор: oleksandr.homyak 17.12.10, 22:12

Цитата(Кузьмич @ 10.12.09, 21:17) http://pro1c.org.ua/index.php?act=findpost&pid=6827


И все же сложный ХМЛ оно не кушает...

Автор: Acid 03.12.14, 0:17

Цитата(Кузьмич @ 10.12.09, 21:17) http://pro1c.org.ua/index.php?act=findpost&pid=6827


перезалил http://pro1c.org.ua/redirect.php?http://salto.org.ua/Downloads/

Автор: Vofka 03.12.14, 12:07

Acid, а че б файлик не приложить прям к этой теме? smile.gif

Автор: Acid 03.12.14, 14:42

Цитата(Vofka @ 03.12.14, 12:07) *
Acid, а че б файлик не приложить прям к этой теме? smile.gif

место экономлю )

Автор: pik333 29.09.16, 10:48

СПАСИБО ВАМ ДОБРЫЙ ЧЕЛОВЕК )))
ПОМОГЛА ВАША ОБРАБОТКА

Автор: Multilobster 28.01.21, 17:43

Огромное спасибо за обработку - спасла! Всех благ)

Автор: Vofka 29.01.21, 9:14

Multilobster, для спасибо есть специальная кнопочка.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua