Имя: Пароль:
1C
1C 7.7
v7: Импорт данных из xml
,
0 MaxStarkov
 
04.08.11
14:26
Задача стоит следующая:

имеется xml файл следующего содержания:

<?xml version="1.0" encoding="WINDOWS-1251"?>
-<Корневой>
<!--Выгрузка проводок за 31.01.2011 23:59:59-->
<Проводка Примечание="#Выгрузка проводок за 31.01.2011 ОсновныеНачисления" Сумма="15 000" СубконтоКт3="" СубконтоКт2="заработная плата" СубконтоКт1="Сотрудник" Кредит="70" СубконтоДт3="" СубконтоДт2="" СубконтоДт1="Заработная плата без НДФЛ" Дебет="26" Дата="31.01.2011"/>

</Корневой>

понятно, что элементов в файле в действительности значительно больше.

Этот файл нужно загрузить в 1С 7.7, загрузить просто хотя бы для того, чтобы в дальнейшем с этими данными можно было бы выполнять различные действия.
И вроде бы все понятно, вот мой код по загрузке:

Процедура Сформировать()
   // Формирование таблицы проводок
   
   // Проверка на загрузку внешней компоненты
   Если гВнешняяКомпонента_Загрузить("v7plus.dll")=0 Тогда
       Возврат;
   КонецЕсли;
   
   // Проверка на заполнение пути и имени файла
   Если ПустоеЗначение(ПутьФайл)=1 Тогда
       Предупреждение("Не выбран файл!");
       Возврат;
   КонецЕсли;
   
   // Импорт данных
   Анализатор=СоздатьОбъект("AddIn.XMLParser");
   Д=Анализатор.СоздатьДокумент();
   Д.Загрузить(Каталог+Файл);
   
   Узел=Д.ВыбратьУзел("Корневой");
   
   Для i=1 По Узел.КоличествоПодчиненных() Цикл
       ТекУзел=Узел.ПолучитьПодчиненныйПоНомеру(i);
       Сообщить(ТекУзел.ПолучитьАтрибут("Сумма"));
       
   КонецЦикла;
КонецПроцедуры

файл загружается и код работает до строчки:

Сообщить(ТекУзел.ПолучитьАтрибут("Сумма"));

на этой строчке все прерывается и выдается сообщение:

Поле агрегатного объекта не обнаружено (ПолучитьАтрибут)

смысл ошибки мне понятен, но как все же прочитать данные из файла о сумме, дебете, кредите и т.д.?

И ведь применяю к элементу ТекУзел действующий метод, но все равно получается ошибка. А вот если например применить метод ПредставлениеXML(), то в окне сообщений выводится строка со всеми атрибутами элемента, но как обратиться и получить данные каждого из них по отдельности? В качестве xml парсера обычная v7plus.dll
1 Ёпрст
 
04.08.11
14:32
(0)
 Для i=0 По Узел.КоличествоПодчиненных()-1 Цикл
       ТекУзел=Узел.ПолучитьПодчиненныйПоНомеру(i);
2 andrewks
 
04.08.11
14:33
-<Корневой>

что за тире?
3 Ёпрст
 
04.08.11
14:33
+1
Параметры:
<НомерУзла> - числовое выражение, содержащее номер требуемого узла. Нумерация узлов начинается с нуля
©СП

ЗЫ: СП купить у ДенисЧ
4 ЧеловекДуши
 
04.08.11
14:35
В 7-ке лучше это делать вот этим http://x-romix.narod.ru/OpenXML.rar
http://x-romix.narod.ru/
5 andrewks
 
04.08.11
14:40
лучше юзать msxml
6 MaxStarkov
 
04.08.11
14:41
что за тире?

это просто из експлорера копировал файл. тире на самом деле нет)

Для i=0 По Узел.КоличествоПодчиненных()-1 Цикл
       ТекУзел=Узел.ПолучитьПодчиненныйПоНомеру(i);

не работает, пробовал уже.

да, видимо придется воспользоваться OpenXML.

В итоге можно сказать, что парсер v7plus.dll не рабочий?
7 andrewks
 
04.08.11
14:43
парсер v7plus.dll рабочий. но не на любом файле и не на любом окружении
8 MaxStarkov
 
04.08.11
14:46
Ну хорошо, сделаю все на OpenXML. Делал даже когда то на нем...года два назад. Всем спасибо за оперативные ответы!
9 andrewks
 
04.08.11
15:16
Попытка
       //ДОМ=СоздатьОбъект("MSXML2.DOMDocument.6.0");
       ДОМ=СоздатьОбъект("MSXML2.DOMDocument");
   Исключение
       Сообщить("Не удалось создать объект DOMDocument","!");
       Возврат 0;
   КонецПопытки;
   
   ДОМ.async=0;
   ДОМ.validateOnParse=-1;
   ДОМ.resolveExternals=-1;
   ДОМ.load(ИмяФайла);
   
   Если (ДОМ.parseError.errorCode<>0) Тогда
       // ошибки при проверке валидности
       Сообщить("При проверке валидности файла "+ИмяФайла+" выявлены ошибки!","!");
       Возврат 0;
   КонецЕсли;
   
   Элем1=ДОМ.getElementsByTagName("Корневой").item(0);
   
   Для ном=0 По Элем1.childNodes.length-1 Цикл
       ДочЭлем=Элем1.childNodes(ном);
       
       Если (ДочЭлем.nodeType=1) Тогда
           Сообщить("Атрибут Сумма = "+ДочЭлем.getAttribute("Сумма"));
       КонецЕсли;
   КонецЦикла;
10 andrewks
 
04.08.11
15:24
(3) по-ходу, в СП пистёшь. с единицы принимает только

а трабла в комменте. в7+, в силу своей ограниченности, не знает про камменты в хмл
11 MaxStarkov
 
04.08.11
15:52
"а трабла в комменте."

Точно!!! Без него все работает отлично. Огромное спасибо за помощь!
12 1Сергей
 
04.08.11
16:26
В любом месте дерева может быть размещен элемент-комментарий. XML-комментарии размещаются внутри специального тега, начинающегося с символов <!-- и заканчивающегося символами -->. Два знака дефис (--) внутри комментария присутствовать не могут.

wiki:XML
13 andrewks
 
04.08.11
16:33
(12) и?
14 1Сергей
 
04.08.11
16:55
(13) а у него -<Корневой>
15 andrewks
 
04.08.11
17:00
(14) читай (2)(6)
Закон Брукера: Даже маленькая практика стоит большой теории.