В преддверии Новогодних праздников захотелось порадовать наше уважаемое сообщество, поэтому и родилась данная статья.
Тема неслучайна и возникла после того как столкнулся сам с такой задачей.
Пропагандируется, что 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://princip.vn.ua/Downloads/extforms/razborXML.ert
Acid, а че б файлик не приложить прям к этой теме?
СПАСИБО ВАМ ДОБРЫЙ ЧЕЛОВЕК )))
ПОМОГЛА ВАША ОБРАБОТКА
Огромное спасибо за обработку - спасла! Всех благ)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua