Имя: Пароль:
1C
1C 7.7
v7: Загрузка в справочник 1С Предприятие 7.7 из XML
,
0 Начинающий Админ
 
25.12.11
12:18
Всем Добрый День! Делаю загрузку из XML в справочник "Основные средства". Подскажите пожалуйста, почему при чтении элемента появляется ошибка: Значение не представляет агрегатный объект (Значение)? Может быть потому что  в XML-файле в названиях элементов добавлено d3p1: (Например: d3p1:Протяженность)? Пробовала в коде при чтении значения добавлять  d3p1: , например  Протяженность=СокрЛП(Строка(Элемент.ВыбратьУзел("d3p1:Протяженность").Значение)); ,но появляется другая ошибка: Ошибка исполнения метода.
Вот часть XML:
<Трубы>
&#8722; <Строка Номер="1">
<d3p1:Наименование> г Липецк ул Ленина</d3p1:Наименование>
<ИнвентарныйНомер/>
<d3p1:НомерДокументации>13007-Д</d3p1:НомерДокументации>
<d3p1:Протяженность>1,00</d3p1:Протяженность>
</Строка>
&#8722;<Строка Номер="2">
<d3p1:Наименование> г Липецк ул 300 лет Рос.Флота</d3p1:Наименование>
<ИнвентарныйНомер/>
<d3p1:НомерДокументации>12760-Д</d3p1:НомерДокументации>
<d3p1:Протяженность>51,60</d3p1:Протяженность>
</Строка>
...
-<Строка Номер="16894">
<d3p1:Наименование>ул. Советская</d3p1:Наименование>
<d3p1:ИнвентарныйНомер>52700</d3p1:ИнвентарныйНомер>
<d3p1:НомерДокументации>3-С</d3p1:НомерДокументации>
<d3p1:Протяженность>1478,80</d3p1:Протяженность>
</Строка>
</Трубы>
Код:
ФайлДанных=Анализатор.СоздатьДокумент();
       ФайлДанных.Загрузить(ИмяФайла);
       ВсеУзлы=ФайлДанных.ВыбратьУзлы("Трубы");
       
       Данные=ВсеУзлы.ПолучитьУзел(0);
       
       Справочник = Данные.ПолучитьПодчиненныйПоНомеру(1);
       Трубы= СоздатьОбъект("Справочник.ОсновныеСредства");
       
       Для х = 1 по Данные.КоличествоПодчиненных() Цикл
           Элемент = Данные.ПолучитьПодчиненныйПоНомеру(х);
           ТекущийЭлемент = Элемент.Наименование;
           Если ТекущийЭлемент = "Строка" Тогда  
               
               ИнвентарныйНомер=СокрЛП(Строка(Элемент.ВыбратьУзел("ИнвентарныйНомер").Значение));
               Протяженность=СокрЛП(Строка(Элемент.ВыбратьУзел("Протяженность").Значение));
               НомерДокументации=СокрЛП(Строка(Элемент.ВыбратьУзел("НомерДокументации").Значение));
               Наименование=СокрЛП(Строка(Элемент.ВыбратьУзел("Наименование").Значение));
               
           КонецЕсли;
           Если Трубы.НайтиПоКоду(ИнвентарныйНомер) = 0 Тогда
               Сообщить("При загрузке файла не найдено " + Наименование + "с инвентарным номером "+ ИнвентарныйНомер + "и Номером архивного дела "+НомерДокументации+". Протяженность не записана!");
               Продолжить;
           Иначе Трубы.Кол = Протяженность;
               Трубы.Записать();
           КонецЕсли;
       КонецЦикла;    
КонецПроцедуры
1 Дачник
 
25.12.11
13:19
А так
Наименование=СокрЛП(Строка(Элемент.ВыбратьУзел("d3p1:Наименование").Значение));
2 andrewks
 
25.12.11
19:47
(0) брось ты эту v7plus. глючная она. юзай msxml напрямую
3 Rie
 
25.12.11
19:51
(0) Попробуй его не оптом загружать, а последовательно читать.
4 Начинающий Админ
 
26.12.11
09:50
Спасибо за советы! Если посмотреть исходный XML например, в AkelPad, то в структуре можно заметить вот такие строки:
  <d3p1:Наименование xmlns:d3p1=" г Липецк ул Сокольская"> г Липецк ул Сокольская</d3p1:Наименование>
Так что пришлось переделывать исходный файл программно. )))
Теперь другая проблема: я что-то напутала с поиском элемента справочника по номеру арх.дела, элемент не ищется, да еще и сообщение о том, что элемент не найден, выводится по первому элементу до бесконечности. Помогите,люди добрые, пожалуйста )))
Вот часть кода:
Трубы= СоздатьОбъект("Справочник.ОсновныеСредства");
Трубы.ВыбратьЭлементы();
Пока Трубы.ПолучитьЭлемент()=1 Цикл
    Если Трубы.ЭтоГруппа()=0 Тогда
     Если (Трубы.НомАрхДела=НомерДокументации) Тогда
       Трубы.Кол = Протяженность;    
       Трубы.Записать();
       Прервать;
     Иначе
     Предупреждение("При загрузке файла не найдено " + Наименование + "с Номером архивного дела "+НомерДокументации+". Протяженность не записана!");
     Продолжить;
     КонецЕсли;
    КонецЕсли;
КонецЦикла;
5 andrewks
 
26.12.11
10:02
реквизит Трубы.НомАрхДела  проиндексирован, или нет?
6 andrewks
 
26.12.11
10:07
короче, если нет, и реквизит строковый, тогда
Если (СокрП(Трубы.НомАрхДела)=СокрП(НомерДокументации)) Тогда

если да, используй НайтиПоРеквизиту()
7 Начинающий Админ
 
26.12.11
14:45
если использовать метод НайтиПоРеквизиту(), то ошибок нет, обработка идет, но тем не менее, ничего не находится и ничего в элемент не записывается. Сейчас код вот такого вида:
Функция НайтиПоНомеруАрхДела(НомерДокументации)
   Трубы= СоздатьОбъект("Справочник.ОсновныеСредства");
   НомАрхДела=Трубы.НомАрхДела;
   Если Трубы.НайтиПоРеквизиту("НомАрхДела",НомерДокументации,1)=0 Тогда
       Возврат 0;
   Иначе Возврат 1;
   КонецЕсли;
КонецФункции  

и еще:
 Трубы= СоздатьОбъект("Справочник.ОсновныеСредства");
              Трубы.ВыбратьЭлементы();
                  Если НайтиПоНомеруАрхДела(НомерДокументации) = 1 Тогда
               Если Трубы.ЭтоГруппа()=0 Тогда
                      Если Трубы.Выбран()=1 тогда
                       Трубы.ТекущийЭлемент();
                          Трубы.Кол = Протяженность;    
                       Трубы.Записать();
                       //Прервать;
                   Иначе
                       Сообщить("При загрузке файла не найдено: " + Наименование + "и Номером архивного дела "+НомерДокументации+".");
                       Продолжить;
                   КонецЕсли;
               КонецЕсли;
           КонецЕсли;
2 + 2 = 3.9999999999999999999999999999999...