| 
    
        
     
     | 
    
  | 
Работа с 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 
 | 
         
        Ну и в созданный список
 
        Документ.Контрагенты.Добавить(Контрагент);  | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |