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

Как обратиться к табличной части справочника

Автор Lilitana, 20 дек 2011, 16:50

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

Lilitana

Здравствуйте! Я только начинаю программировать, и сейчас делаю выгрузку данных справочника из 1С 8.0 в 7.7. Возник вопрос, как выгрузить Наименование из определенной табличной части?Дело в том, что реквизит Наименование есть и в реквизитах и в табличных частях, и содержащаяся в них информация разная. Мне нужна информация из табличной части БухДанные. Помогите, пожалуйста!!! Вот код:
Процедура КнопкаВыполнитьНажатие(Кнопка)
ИмяФайла= "c:\Мои документы\Выгрузка.xml";
Запись = Новый ЗаписьXML;
УдалитьФайлы(ИмяФайла);
Запись.ОткрытьФайл(ИмяФайла);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Трубы");
Выборка = Справочники.Трубы.Выбрать();
НомерСтроки = 1;
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
Объект=Выборка.ПолучитьОбъект();
Запись.ЗаписатьНачалоЭлемента("Строка");
Запись.ЗаписатьАтрибут("Номер",Формат(НомерСтроки,"ЧДЦ=0;Чг="));
Запись.ЗаписатьНачалоЭлемента("Наименование",Строка(Объект.Наименование));
Запись.ЗаписатьТекст(Объект.Наименование);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьНачалоЭлемента("ИнвентарныйНомер",Строка(Объект.ИнвентарныйНомер));
Запись.ЗаписатьТекст(Объект.ИнвентарныйНомер);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьНачалоЭлемента("Протяженность",Формат(Объект.Протяженность,"ЧДЦ=2;ЧГ=;ЧН="));
Запись.ЗаписатьТекст(Формат(Объект.Протяженность,"ЧДЦ=2;ЧГ=;ЧН="));
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьКонецЭлемента();
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
Сообщить("Справочник Трубы выгружен в файл "+ИмяФайла+"!");
КонецПроцедуры


Klyacksa

Зря получаете объект, объект получают только если нужно его модифицировать, в других случаях эта операция не нужна, вдобавок она еще и тяжеловесна:
Объект=Выборка.ПолучитьОбъект();

Достаточно обращаться ко всем полям объекта от элемента "Выборка":
Выборка.Наименование;

И табличная часть так же, только для получения значений строк табличной части, придется их перебирать циклом:
ТабЧасть=Выборка.ИмяТабЧастиОбъекта;
Для каждого СтрокаТабЧасти из ТабЧасть Цикл
    ТабЧастьНаименование=СтрокаТабЧасти.Наименование;
КонецЦикла;
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Lilitana

Спасибо за совет! Сделала этот цикл, но все равно обработка не идет, ссылается на ошибку:
Форма.Форма(21)}: Значение не является значением объектного типа (Наименование) Запись.ЗаписатьНачалоЭлемента("Наименование",Строка(СтрокаТабЧасти.Наименование));
Я уже чего только в эту строку не писала, все равно ошибка.В чем может быть ошибка?
Процедура КнопкаВыполнитьНажатие(Кнопка)
ИмяФайла= "c:\Мои документы\Выгрузка.xml";
Запись = Новый ЗаписьXML;
УдалитьФайлы(ИмяФайла);
Запись.ОткрытьФайл(ИмяФайла);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Трубы");
Выборка = Справочники.Трубы.Выбрать();
НомерСтроки = 1;
Пока Выборка.Следующий() Цикл
ТабЧасть=Выборка.БухДанные;
Для каждого СтрокаТабЧасти из ТабЧасть Цикл
ТабЧастьНаименование=СтрокаТабЧасти.Наименование;
КонецЦикла;
      Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
Запись.ЗаписатьНачалоЭлемента("Строка");
Запись.ЗаписатьАтрибут("Номер",Формат(НомерСтроки,"ЧДЦ=0;Чг="));
Запись.ЗаписатьНачалоЭлемента("Наименование",Строка(СтрокаТабЧасти.Наименование));
Запись.ЗаписатьТекст(СтрокаТабЧасти.Наименование);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьНачалоЭлемента("ИнвентарныйНомер",Строка(Выборка.ИнвентарныйНомер));
Запись.ЗаписатьТекст(Выборка.ИнвентарныйНомер);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьНачалоЭлемента("Протяженность",Формат(Выборка.Протяженность,"ЧДЦ=2;ЧГ=;ЧН="));
Запись.ЗаписатьТекст(Формат(Выборка.Протяженность,"ЧДЦ=2;ЧГ=;ЧН="));
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьКонецЭлемента();
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
Сообщить("Справочник Трубы выгружен в файл "+ИмяФайла+"!");
КонецПроцедуры



Lilitana

Сейчас немного переделала, вроде-бы правильно выгружает, вот только грузит не все, может я напутала с циклами?
Процедура КнопкаВыполнитьНажатие(Кнопка)
ИмяФайла= "c:\Мои документы\Выгрузка протяженности.xml";
Запись = Новый ЗаписьXML;
УдалитьФайлы(ИмяФайла);
Запись.ОткрытьФайл(ИмяФайла);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("Трубы");
Выборка = Справочники.Трубы.Выбрать();
НомерСтроки = 1;
Пока Выборка.Следующий() Цикл
ТабЧасть=Выборка.БухДанные;
Для каждого СтрокаТабЧасти из ТабЧасть Цикл
//ТабЧастьНаименование=СтрокаТабЧасти.Наименование;
      Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
Запись.ЗаписатьНачалоЭлемента("Строка");
Запись.ЗаписатьАтрибут("Номер",Формат(НомерСтроки,"ЧДЦ=0;Чг="));
Запись.ЗаписатьНачалоЭлемента("Наименование",Строка(СтрокаТабЧасти.Наименование));
Запись.ЗаписатьТекст(СтрокаТабЧасти.Наименование);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьНачалоЭлемента("ИнвентарныйНомер",Строка(Выборка.ИнвентарныйНомер));
Запись.ЗаписатьТекст(Выборка.ИнвентарныйНомер);
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьНачалоЭлемента("Протяженность",Формат(Выборка.Протяженность,"ЧДЦ=2;ЧГ=;ЧН="));
Запись.ЗаписатьТекст(Формат(Выборка.Протяженность,"ЧДЦ=2;ЧГ=;ЧН="));
Запись.ЗаписатьКонецЭлемента();
Запись.ЗаписатьКонецЭлемента();
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
Сообщить("Справочник Трубы выгружен в файл "+ИмяФайла+"!");
КонецПроцедуры

Klyacksa

Что значит не все грузит?

Да, в первый раз был не правильный цикл, но в последнем посте нормальный
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Lilitana

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

Klyacksa

Так надо наименование из таб.части или из самого элемента?
Сейчас у Вас пропускаются все элементы, которые являются Группой и у которых в табличной части ничего нет.
Если нужно выгружать элементы без таб.частей (да и вообще, для уменьшения выходного файла), то рекомендую вынести выгружаемые поля элемента (кроме таб.части) перед цикл.

Ну и проверку на Группу тоже лучше делать перед циклом, чтобы лишний раз не заходить туда:

Пока Выборка.Следующий() Цикл
        Если Выборка.ЭтоГруппа Тогда
             Продолжить;
        КонецЕсли;

        ТабЧасть=Выборка.БухДанные;
        Для каждого СтрокаТабЧасти из ТабЧасть Цикл
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Lilitana

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



Lilitana

Добрый день! Изаините, что предыдущий пост был не в тот раздел ))) Скажите пожалуйста, а можно выгружать наименование из табличной части, но пустые наименования при этом не пропускать?

Теги:

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

Рейтинг@Mail.ru

Поиск