Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Разборка XML-файла стандартными средствами (v7plus)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > База знаний > Наши статьи > 1С Предприятие 7.7
Acid
В преддверии Новогодних праздников захотелось порадовать наше уважаемое сообщество, поэтому и родилась данная статья.
Тема неслучайна и возникла после того как столкнулся сам с такой задачей.
Пропагандируется, что 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 Тогда  
                номУр=гФайл.СвойстваТекущегоУзла.Уровень;
            КонецЕсли;
        КонецЕсли;    
        Возврат номУр;
    КонецЕсли;

Таким образом у нас получилась необходимо зарегистрироваться для просмотра ссылки (надеюсь) обработка для чтения хмл-файла. Дальше можете для работы с результатом делать все, что вам удобно: занести эти данные в СписокЗначений, в ТаблицуЗначений либо эти оба варианта одновременно.

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

С уважением, Кузьмич.
И с наступающим НГ!
Acid
* (весь текст статьи вбил в первый пост, ибо поместилось)
Acid
а вот и сама обработка: необходимо зарегистрироваться для просмотра ссылки
oleksandr.homyak
Цитата(Кузьмич @ 10.12.09, 21:17) необходимо зарегистрироваться для просмотра ссылки
а вот и сама обработка: необходимо зарегистрироваться для просмотра ссылки


И все же сложный ХМЛ оно не кушает...
Acid
Цитата(Кузьмич @ 10.12.09, 21:17) необходимо зарегистрироваться для просмотра ссылки
а вот и сама обработка: необходимо зарегистрироваться для просмотра ссылки


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

место экономлю )
pik333
СПАСИБО ВАМ ДОБРЫЙ ЧЕЛОВЕК )))
ПОМОГЛА ВАША ОБРАБОТКА
Multilobster
Огромное спасибо за обработку - спасла! Всех благ)
Vofka
Multilobster, для спасибо есть специальная кнопочка.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.