7.7 Загрузка в справочник 1С Предприятие 7.7 из XML

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем S0LNCE, 25 дек 2011.

  1. TopicStarter Overlay
    S0LNCE
    Offline

    S0LNCE

    Регистрация:
    28 окт 2011
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте! Всем доброго дня! :angry: Делаю загрузку из XML в справочник "Основные средства". Подскажите пожалуйста, почему при чтении элемента появляется ошибка: Значение не представляет агрегатный объект (Значение)? Может быть потому что в XML-файле в названиях элементов добавлено d3p1: (Например: d3p1:Протяженность)? Пробовала в коде при чтении значения добавлять d3p1: , например Протяженность=СокрЛП(Строка(Элемент.ВыбратьУзел("d3p1:Протяженность").Значение)); ,но появляется другая ошибка: Ошибка исполнения метода.
    Вот часть XML:
    <Трубы>
    − <Строка Номер="1">
    <d3p1:Наименование> г Липецк ул Ленина</d3p1:Наименование>
    <ИнвентарныйНомер/>
    <d3p1:НомерДокументации>13007-Д</d3p1:НомерДокументации>
    <d3p1:Протяженность>1,00</d3p1:Протяженность>
    </Строка>
    −<Строка Номер="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 Тогда
    Сообщить("При загрузке файла не найдено " + Наименование + "с инвентарным номером "+ ИнвентарныйНомер + "и Номером архивного дела "+НомерДокументации+". Протяженность не записана!");
    Продолжить;
    Иначе Трубы.Кол = Протяженность;
    Трубы.Записать();
    КонецЕсли; 
    КонецЦикла;    
    КонецПроцедуры      
    
    
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    нет. судя по коду у вас Элемент не имеет агрегатный объект. Гляньте отладчиком какое значение он принимает (может просто строка или пустое значение).
  3. TopicStarter Overlay
    S0LNCE
    Offline

    S0LNCE

    Регистрация:
    28 окт 2011
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    Спасибо за ответ! Оказалось, что исходный XML был неверен. Я его переделала, и теперь такие ошибки не возникают. Теперь другая проблема: я что-то напутала с поиском элемента справочника по номеру арх.дела, элемент не ищется, да еще и сообщение о том, что элемент не найден, выводится по первому элементу до бесконечности. Помогите, пожалуйста )))
    Вот часть кода:

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

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Неизвестен тип сравниваемых реквизитов. Предположу из предыдущего поста что это строка...
    Тогда нужно так:
    Код:
    Если СокрЛП(Трубы.НомАрхДела)=СокрЛП(НомерДокументации) Тогда
    
    
  5. TopicStarter Overlay
    S0LNCE
    Offline

    S0LNCE

    Регистрация:
    28 окт 2011
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    Попробовала сделать так, результат был таким же. В итоге, сделала отдельную функцию, в которой использовала метод НайтиПоРеквизиту(), ошибки больше не возникали, но и элементы тоже не ищутся. Не подскажете, где я напорола? :angry:
    Код:
    Функция НайтиПоНомеруАрхДела(НомерДокументации)
    Трубы= СоздатьОбъект("Справочник.ОсновныеСредства");
    НомАрхДела=Трубы.НомАрхДела;
    Если Трубы.НайтиПоРеквизиту("НомАрхДела",НомерДокументации,1)=0 Тогда
    Возврат 0;
    Иначе Возврат 1;
    КонецЕсли;
    КонецФункции  
    
    и еще:
    Код:
    Трубы= СоздатьОбъект("Справочник.ОсновныеСредства");
    Трубы.ВыбратьЭлементы();
    Если НайтиПоНомеруАрхДела(НомерДокументации) = 1 Тогда
    Если Трубы.ЭтоГруппа()=0 Тогда
    Если Трубы.Выбран()=1 тогда
    Трубы.ТекущийЭлемент();
    Трубы.Кол = Протяженность;    
    Трубы.Записать();
    //Прервать;
    
    Иначе 
    Сообщить("При загрузке файла не найдено: " + Наименование + "и Номером архивного дела "+НомерДокументации+".");
    Продолжить;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
    
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Если искать по реквизиту то нужно так:
    Код:
    Трубы= СоздатьОбъект("Справочник.ОсновныеСредства"); //делать 1 раз где-то выше
    Если Трубы.НайтиПоРеквизиту("НомАрхДела",НомерДокументации,1)=1 Тогда
    Если Трубы.ЭтоГруппа()=0 Тогда //а надо ли? Разве НомерДокументации это реквизит группы?
    Трубы.Кол = Протяженность;    
    Трубы.Записать();
    КонецЕсли;
    Иначе
    Сообщить("При загрузке файла не найдено: " + Наименование + "и Номером архивного дела "+НомерДокументации+".");
    КонецЕсли;
    
    
  7. TopicStarter Overlay
    S0LNCE
    Offline

    S0LNCE

    Регистрация:
    28 окт 2011
    Сообщения:
    20
    Симпатии:
    0
    Баллы:
    1
    Спасибо! Сейчас работает! :angry: Но если есть в 1С 7.7 строка НомерАрхивногоДела, в которой записаны несколько архивных дел (3869-Д,3870-Д, 3872-Д), то не находит значение 3872-Д. Можно ли сделать поиск по частичному совпадению строк?
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Нужно тогда перебором всего справочника, а лучше запросом с выгрузкой в ТаблицуЗначений (если много грузите). Будет намного быстрее

Поделиться этой страницей