Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 03:45

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

Автор Lilitana, 24 дек 2011, 14:03

0 Пользователей и 1 гость просматривают эту тему.

Lilitana

Здравствуйте! Я новичок в области программирования. Делаю загрузку из 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 Тогда
                Сообщить("При загрузке файла не найдено " + Наименование + "с инвентарным номером "+ ИнвентарныйНомер + "и Номером архивного дела "+НомерДокументации+". Протяженность не записана!");
                Продолжить;
            Иначе Трубы.Кол = Протяженность;
                Трубы.Записать();
            КонецЕсли;
        КонецЦикла;   
КонецПроцедуры     


     

Клюшкин

Для начала попробуйте все же удалить автозаменой в файле сочетание букв d3p1:.

Lilitana

Все оказалось гораздо интересней. Если посмотреть исходный XML например, в AkelPad, то в структуре можно заметить вот такие строки:
   <d3p1:Наименование xmlns:d3p1=" г Липецк ул Сокольская"> г Липецк ул Сокольская</d3p1:Наименование>
Так что автозамена здесь бы не помогла. Пришлось переделывать исходный файл программно. )))   

Lilitana

Теперь другая проблема: я что-то напутала с поиском элемента справочника по номеру арх.дела, элемент не ищется, да еще и сообщение о том, что элемент не найден, выводится по первому элементу до бесконечности. Помогите,люди добрые, пожалуйста )))
Вот часть кода:

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

sergejK74

Кнопочка Спасибо - слева!

Lilitana

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

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

sergejK74

Если использовать НайтиПоРеквизиту - у реквизита должна быть включена сортировка.
Родители, Владельцы не используются?
"НомАрхДела" и НомерДокументации тип один?
Если тип Строка - пробелы справа слева не мешают? Регистр (прописные, строчные)?

Кнопочка Спасибо - слева!

Lilitana

Сортировка включена, родители и владельцы не используются, тип один - "Строка", при загрузке НомерДокументации использовала метод СокрЛП. В строку включаются символы как прописные, так и строчные, буквы, цифры и знаки препинания (дефис, тире, запятая). На самом деле поиск происходит, но при этом находится и записывается очень малое число элементов в связи с тем, что в строке НомерАрхивногоДела в загружаемой конфигурации могут быть несколько номеров архивных дел, например: 3869-Д,3870-Д, 3872-Д, а нужно найти значение 3872-Д. Поиск происходит по полному совпадению строк.  Можно ли сделать поиск по частичному совпадению строк?

Клюшкин

Можно в функции поиска делать перебор всех элементов справочника с использованием функции Найти() для поиска подстроки в нужном реквизите. То есть искать в КАЖДОМ элементе нужную подстроку.
Однозначно производительность упадет по сравнению с поиском просто по реквизиту.

Lilitana

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

КонецЕсли;


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск