Имя: Пароль:
1C
1С v8
Работа с XDTO. Списки
,
0 kinazarov
 
23.06.16
14:20
День добрый.
Вопрос по CML. Версия CML 2.07.
Есть у меня  корректно созданный объект XDTO у которого одно из свойств определяется так
<ЗначенияРеквизитов>
   <ЗначениеРеквизита>
      <Наименование>ВидНоменклатуры</Наименование>
      <Значение>Товар</Значение>
   </ЗначениеРеквизита>
   <ЗначениеРеквизита>
      <Наименование>ТипНоменклатуры</Наименование>
      <Значение>Товар</Значение>
   </ЗначениеРеквизита>
....
</ЗначенияРеквизитов>

У объекта который я создал есть свойство "ЗначенияРеквизитов". В импортированной схеме у меня есть тип "ЗначениеРеквизита"

Как мне:
1. Создать СписокXDTO с типом "ЗначениеРеквизита"? Это при том что по схеме ЗначениеРеквизита - и так список.
2. Как добавить в свойство "ЗначенияРеквизитов" созданного мной документа списочное субсвойство "ЗначениеРеквизита"?

Должно получиться так:
http://c2n.me/3zvrbrV
1 totparen
 
23.06.16
14:53
Что означает "корректно созданный объект XDTO" ?
Как вы его создали?
2 kinazarov
 
23.06.16
16:00
Вот так:
Функция cml_сгенерироватьОбъектCML(НаименованиеТипаОбъекта)
    ОбъектТип=ФабрикаXDTO.Тип("urn:1C.ru:commerceml_2",НаименованиеТипаОбъекта);
    Возврат ФабрикаXDTO.Создать(ОбъектТип);
КонецФункции

Документ=cml_сгенерироватьОбъектCML("Документ");
3 totparen
 
23.06.16
16:12
Создать новый объект ХДТО ЗначениеРеквизита и добавить его в "ЗначенияРеквизитов". ЗначенияРеквизитов станет списком ХДТО автоматом.
4 kinazarov
 
23.06.16
16:41
Ошибка при установке значения атрибута контекста (ЗначенияРеквизитов)
    Документ.ЗначенияРеквизитов=cml_сгенерироватьОбъектCML("ЗначениеРеквизита");
по причине:
Несоответствие типов XDTO:
Тип '{urn:1C.ru:commerceml_2}ЗначениеРеквизита' не соответствует типу ''
Тип свойства не соответствует типу значения
5 totparen
 
23.06.16
17:35
(4) Что за муть?!

Посмотрите методы у СпискаХДТО.

Что-то типа

Документ.ЗначенияРеквизитов. Добавить(cml_сгенерироватьОбъектCML("ЗначениеРеквизита"));
6 kinazarov
 
23.06.16
17:45
Кое-как получилось. Позже если будет настроение напишу детально что и как делал.
7 kinazarov
 
24.06.16
12:09
Пока без деталей и объяснений кусок кода

Функция cml_сгенерироватьОбъектCML(ТипОбъекта,Значение=Неопределено)
    Если ТипЗнч(ТипОбъекта)=Тип("Строка") Тогда
        ОбъектТип=ФабрикаXDTO.Тип("urn:1C.ru:commerceml_2",ТипОбъекта);
        Если ЗначениеЗаполнено(Значение)Тогда
            Возврат ФабрикаXDTO.Создать(ОбъектТип,Значение);
        Иначе
            Возврат ФабрикаXDTO.Создать(ОбъектТип);
        КонецЕсли;
    ИначеЕсли ТипЗнч(ТипОбъекта)=Тип("СвойствоXDTO") Тогда
        Возврат ФабрикаXDTO.Создать(ТипОбъекта.Тип);
    КонецЕсли;
КонецФункции

Процедура cml_ЗаполнитьСложноеСвойство(ДокументXDTO,НаименованиеСвойства)
    ДокументXDTO[НаименованиеСвойства]=cml_сгенерироватьОбъектCML(ДокументXDTO.Свойства().Получить(НаименованиеСвойства));
КонецПроцедуры


Документ=cml_сгенерироватьОбъектCML("Документ");
Документ.Ид=СокрЛП(ДокументСсылка.Номер);
Документ.Номер=СокрЛП(ДокументСсылка.Номер);
Документ.Дата=cml_Конвертировать_Дата(ДокументСсылка.Дата,ЧастиДаты.Дата);
Документ.Время=cml_Конвертировать_Дата(ДокументСсылка.Дата,ЧастиДаты.Время);
Документ.ХозОперация="Заказ товара";
Документ.Роль="Продавец";
Документ.Валюта=cml_сгенерироватьОбъектCML("ВалютаТип",ДокументСсылка.ВалютаДокумента.Наименование);
Документ.Курс="1";
Документ.Сумма=cml_суммаСтрокой(ДокументСсылка.СуммаДокумента);
cml_ЗаполнитьСложноеСвойство(Документ,"Контрагенты");
Контрагент=cml_сгенерироватьОбъектCML("Документ");

Схема отсюда
http://v8.1c.ru/edi/edi_stnd/90/CML207.XSD
8 kinazarov
 
24.06.16
12:16
В последней строке ошибся, нужно так:

Контрагент=cml_сгенерироватьОбъектCML("Контрагент");//тип перепутал в прошлом посте
Контрагент.Ид=Строка(ДокументСсылка.Контрагент.УникальныйИдентификатор());
Контрагент.Наименование(СокрЛП(ДокументСсылка.Контрагент.Наименование));
Контрагент.ПолноеНаименование(СокрЛП(ДокументСсылка.Контрагент.НаименованиеПолное));
Контрагент.Роль="Покупатель";
9 kinazarov
 
24.06.16
12:17
Для тех кто не врубилсмя - "ЗначенияРеквизитов" и "Контрагенты" одинаково формируются.
10 kinazarov
 
24.06.16
12:18
Ну и в созданный список

Документ.Контрагенты.Добавить(Контрагент);