Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Разборка XML-файла стандартными средствами (v7plus)          
Рейтинг 5 V
Acid Подменю пользователя
сообщение 10.12.09, 19:56
Сообщение #1

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

В преддверии Новогодних праздников захотелось порадовать наше уважаемое сообщество, поэтому и родилась данная статья.
Тема неслучайна и возникла после того как столкнулся сам с такой задачей.
Пропагандируется, что 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 - 27.01.11, 18:53

Спасибо сказали: maks_75, mister-x, pik333, Smoke, Vofka, yua,

Acid Подменю пользователя
сообщение 10.12.09, 20:00
Сообщение #2

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

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

Спасибо сказали: bob210250, MATEVI, pik333, Vofka,

Acid Подменю пользователя
сообщение 10.12.09, 20:17
Сообщение #3

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

а вот и сама обработка: [необходимо зарегистрироваться для просмотра ссылки]


oleksandr.homyak Подменю пользователя
сообщение 17.12.10, 22:12
Сообщение #4

Молчаливый
*
Группа: Пользователи
Сообщений: 7
Спасибо сказали: 0 раз
Рейтинг: 0

Цитата(Кузьмич @ 10.12.09, 21:17) *
а вот и сама обработка: [необходимо зарегистрироваться для просмотра ссылки]


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

Acid Подменю пользователя
сообщение 03.12.14, 0:17
Сообщение #5

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

Цитата(Кузьмич @ 10.12.09, 21:17) *
а вот и сама обработка: [необходимо зарегистрироваться для просмотра ссылки]


перезалил [необходимо зарегистрироваться для просмотра ссылки]


Signature

Документируйте Код! мать вашу...


Спасибо сказали: alexyav, masterkm, mister-x, nasty_d, pik333, yua,

Vofka Подменю пользователя
сообщение 03.12.14, 12:07
Сообщение #6

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

Acid Подменю пользователя
сообщение 03.12.14, 14:42
Сообщение #7

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

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

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

Спасибо сказали: igmig65, pik333,

pik333 Подменю пользователя
сообщение 29.09.16, 10:48
Сообщение #8

Молчаливый
*
Группа: Пользователи
Сообщений: 1
Спасибо сказали: 0 раз
Рейтинг: 0

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

Multilobster Подменю пользователя
сообщение 28.01.21, 17:43
Сообщение #9

Молчаливый
*
Группа: Пользователи
Сообщений: 7
Спасибо сказали: 1 раз
Рейтинг: 1

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

Vofka Подменю пользователя
сообщение 29.01.21, 9:14
Сообщение #10

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 28.03.24, 17:20
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!