Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
13 Дек 2017, 00:40
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Загрузка в справочник 1С Предприятие 7.7 из XML  (Прочитано 11046 раз)

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

Оффлайн Lilitana

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

     


Оффлайн Клюшкин

  • *
  • Сообщений: 19
  • РЕПУТАЦИЯ: 4
  • КПД: 21%
  • Регистрация: 2011-12-09
  • Сайт: 
Для начала попробуйте все же удалить автозаменой в файле сочетание букв d3p1:.

Оффлайн Lilitana

  • *
  • Сообщений: 16
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-19
  • Сайт: 
  • Профессия: Программист 1С
Все оказалось гораздо интересней. Если посмотреть исходный XML например, в AkelPad, то в структуре можно заметить вот такие строки:
   <d3p1:Наименование xmlns:d3p1=" г Липецк ул Сокольская"> г Липецк ул Сокольская</d3p1:Наименование>
Так что автозамена здесь бы не помогла. Пришлось переделывать исходный файл программно. )))   

Оффлайн Lilitana

  • *
  • Сообщений: 16
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-19
  • Сайт: 
  • Профессия: Программист 1С
Теперь другая проблема: я что-то напутала с поиском элемента справочника по номеру арх.дела, элемент не ищется, да еще и сообщение о том, что элемент не найден, выводится по первому элементу до бесконечности. Помогите,люди добрые, пожалуйста )))
Вот часть кода:

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

Оффлайн sergejK74

  • *****
  • Сообщений: 1093
  • РЕПУТАЦИЯ: 458
  • КПД: 42%
  • Всегда готов помочь!
  • Регистрация: 2011-07-08
  • Сайт: 
  • Профессия: Ученик 1С
Предупреждение() из цикла убери
Кнопочка Спасибо - слева!

Оффлайн Lilitana

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

Оффлайн sergejK74

  • *****
  • Сообщений: 1093
  • РЕПУТАЦИЯ: 458
  • КПД: 42%
  • Всегда готов помочь!
  • Регистрация: 2011-07-08
  • Сайт: 
  • Профессия: Ученик 1С
Если использовать НайтиПоРеквизиту - у реквизита должна быть включена сортировка.
Родители, Владельцы не используются?
"НомАрхДела" и НомерДокументации тип один?
Если тип Строка - пробелы справа слева не мешают? Регистр (прописные, строчные)?

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

Оффлайн Lilitana

  • *
  • Сообщений: 16
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-19
  • Сайт: 
  • Профессия: Программист 1С
Сортировка включена, родители и владельцы не используются, тип один - "Строка", при загрузке НомерДокументации использовала метод СокрЛП. В строку включаются символы как прописные, так и строчные, буквы, цифры и знаки препинания (дефис, тире, запятая). На самом деле поиск происходит, но при этом находится и записывается очень малое число элементов в связи с тем, что в строке НомерАрхивногоДела в загружаемой конфигурации могут быть несколько номеров архивных дел, например: 3869-Д,3870-Д, 3872-Д, а нужно найти значение 3872-Д. Поиск происходит по полному совпадению строк.  Можно ли сделать поиск по частичному совпадению строк?

Оффлайн Клюшкин

  • *
  • Сообщений: 19
  • РЕПУТАЦИЯ: 4
  • КПД: 21%
  • Регистрация: 2011-12-09
  • Сайт: 
Можно в функции поиска делать перебор всех элементов справочника с использованием функции Найти() для поиска подстроки в нужном реквизите. То есть искать в КАЖДОМ элементе нужную подстроку.
Однозначно производительность упадет по сравнению с поиском просто по реквизиту.

Оффлайн Lilitana

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

КонецЕсли;


Теги:
 


* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
170 Сообщений
ilyay ilyay
75 Сообщений
oleg-x
51 Сообщений
alex0402
49 Сообщений
andron81_81
38 Сообщений
AIFrame
37 Сообщений
MuI_I_Ika MuI_I_Ika
33 Сообщений
BuhRust
30 Сообщений
Golickoff Golickoff
28 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 218
  • Точка Скрытых: 0
  • Точка Пользователей: 1
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal