Имя: Пароль:
1C
1С v8
Ошибка при записи ФабрикаXDTO.ЗаписатьXML (
0 Dunstan
 
03.05.16
18:36
Разбираюсь с XML.
При записи ФабрикаXDTO.ЗаписатьXML (МойXML,Таблица)
дает ошибку:Ошибка преобразования данных XDTO:
Объект XDTO может быть записан только в форме элемента XML
текст процедуры:
Функция _Таблица(BeginDate,EndDate,NameOfFile)  Экспорт
    ТипНоменклатура = ФабрикаXDTO.Тип("http://www.sample-package.org","Good";);
    ТипСтрока        = ФабрикаXDTO.Тип("http://www.Strings.com","String";);
    ТипТаблица        = ФабрикаXDTO.Тип("http://www.Strings.com","Array";);
    ТипКод            = ФабрикаXDTO.Тип("http://www.sample-package.org","_Code";);
    ТипУИД            = ФабрикаXDTO.Тип("http://www.sample-package.org","_UID";);
    ТипНаименование = ФабрикаXDTO.Тип("http://www.sample-package.org","_Name";);
    ТипКолВо        = ФабрикаXDTO.Тип("http://www.Strings.com","_Number";);
    ТипСумма        = ФабрикаXDTO.Тип("http://www.Strings.com","_Amount";);
    ДатаОкончания = Новый Граница(EndDate,ВидГраницы.Включая);
    ДатаНачала = НачалоДня(BeginDate);
    Запрос = Новый Запрос("ВЫБРАТЬ
                           |    ОстаткиНоменклатурыОбороты.Номенклатура,
                           |    ОстаткиНоменклатурыОбороты.КоличествоОборот,
                           |    ОстаткиНоменклатурыОбороты.СуммаОборот
                           |ИЗ
                           |    РегистрНакопления.ОстаткиНоменклатуры.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ОстаткиНоменклатурыОбороты");
   Запрос.УстановитьПараметр("ДатаНачала",ДатаНачала);
   Запрос.УстановитьПараметр("ДатаОкончания",ДатаОкончания);
   Выборка = Запрос.Выполнить().Выбрать();
   Таблица = ФабрикаXDTO.Создать(ТипТаблица);
   Пока Выборка.Следующий() Цикл
        Строка = ФабрикаXDTO.Создать(ТипСтрока,);
        Номенклатура = ФабрикаXDTO.Создать(ТипНоменклатура);
        Номенклатура.Name = ФабрикаXDTO.Создать(ТипНаименование,Выборка.Номенклатура.Наименование);
        Номенклатура.Code = ФабрикаXDTO.Создать(ТипКод,Выборка.Номенклатура.Код);
        Номенклатура.UID  = ФабрикаXDTO.Создать(ТипУИД,XMLСтрока(Выборка.Номенклатура.УникальныйИдентификатор()));
        Строка.Good = Номенклатура;
        Строка.Number = ФабрикаXDTO.Создать(ТипКолВо,Выборка.КоличествоОборот);
        Строка.Amount  = ФабрикаXDTO.Создать(ТипСумма,Выборка.СуммаОборот);
        Таблица.ListOf.Добавить(Строка);
    КонецЦикла;
    Таблица.Проверить();
    
   Если ЗначениеЗаполнено(NameOfFile) Тогда
  
       МойXML = Новый ЗаписьXML;

    ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);

    МойXML.ОткрытьФайл(NameOfFile,  ПараметрыЗаписиXML);
    
    МойXML.ЗаписатьОбъявлениеXML();
    
        ФабрикаXDTO.ЗаписатьXML (МойXML, Таблица,"Table","http://www.Strings.com",ФормаXML.Элемент,НазначениеТипаXML.Явное);
    
    
    МойXML.Закрыть();
  
   КонецЕсли;
   Возврат Таблица;
КонецФункции
1 Dunstan
 
04.05.16
11:39
и тишина
2 mehfk
 
04.05.16
11:44
Экстрасенс-одинэсника - редкая профессия.
3 4St
 
04.05.16
13:29
http://www.sample-package.org
Что это за пространство имен? В конфигурации присутствует пакет XDTO с таким URI?
Как в отладчике отображается вот этот объект?
Таблица = ФабрикаXDTO.Создать(ТипТаблица);
4 Dunstan
 
04.05.16
14:31
(3) Свое пространство имен
Таблица отображается как объект XDTO
5 Dunstan
 
04.05.16
14:33
(3) да XDTO c таким URL есть в конфе
пробовал и такой вариант:
  ФабрикаXDTO.ЗаписатьXML (МойXML, Таблица)
6 Лефмихалыч
 
04.05.16
14:35
версия платформы?
7 Dunstan
 
04.05.16
14:42
(6) 1С:Предприятие 8.3 (8.3.8.1652)
8 Лефмихалыч
 
04.05.16
14:42
(7) на 8.3.7 воспроизводится?
9 Dunstan
 
04.05.16
14:46
(8) была ошибка и в 8,3,6
поменял на 1С:Предприятие 8.3 (8.3.8.1652)
10 RomaH
 
naïve
04.05.16
15:04
(4) а должен быть список, вроде
11 RomaH
 
naïve
04.05.16
15:05
Таблица.ListOf - а нет - это д.б. список
12 4St
 
04.05.16
15:54
(5) Обрати внимание вот сюда:

ТипСтрока        = ФабрикаXDTO.Тип("http://www.Strings.com","String";;);

...


Строка.Good = Номенклатура;

Возможно, у тебя в схеме свойство "Good" у типа "http://www.Strings.com","String"; имеет форму "Атрибут" или "Текст". А должен быть "Элемент".

Возможно, ругается на какое-то другое свойство.
Локализовать можно так:
прямо в коде расставляем такие строки:
"ОбъектXDTO.Проверить()", где "ОбъектXDTO" заменяем на подозрительный объект.
На каком объекте свалится, тот и надо изучать внимательно.
13 4St
 
04.05.16
16:06
С XDTO удобнее работать через функции-обертки, по крайней мере там, где скорость не критична.

//ленивая функция для создания дочернего объекта XDTO по его имени
Функция xmlСоздатьДочернийЭлементXDTO(ТекущийЭлемент,Имя,ПрисвоитьСразу = Истина) Экспорт
    
    _Свойство = ТекущийЭлемент.Свойства().Получить(Имя);
    ТипНовогоЭлемента = _Свойство.Тип;
//    _Фабрика = xmlПолучитьФабрикуПоПространствуИмен(_Свойство.URIПространстваИмен);//это если подключаемые фабрики из схем, не входящих в состав конфигурации

    _Фабрика = ФабрикаXDTO;
    
    НовыйЭлемент = _Фабрика.Создать(ТипНовогоЭлемента);    
    Если ПрисвоитьСразу И Не НовыйЭлемент = Неопределено Тогда
        Если ТипЗнч(ТекущийЭлемент[Имя]) = Тип("СписокXDTO") Тогда
            ТекущийЭлемент[Имя].Добавить(НовыйЭлемент);
        Иначе        
            ТекущийЭлемент[Имя] = НовыйЭлемент;
        КонецЕсли;    
    КонецЕсли;
    
    Возврат НовыйЭлемент;
    
КонецФункции


И дальше вместо

Номенклатура = ФабрикаXDTO.Создать(ТипНоменклатура);

        Номенклатура.Name = ФабрикаXDTO.Создать(ТипНаименование,Выборка.Номенклатура.Наименование);

        Номенклатура.Code = ФабрикаXDTO.Создать(ТипКод,Выборка.Номенклатура.Код);

        Номенклатура.UID  = ФабрикаXDTO.Создать(ТипУИД,XMLСтрока(Выборка.Номенклатура.УникальныйИдентификатор()));

        Строка.Good = Номенклатура;

      
пишем так:

xmlСоздатьДочернийЭлементXDTO(Строка, "Good ");

        Строка.Good.Name = ФабрикаXDTO.Создать(ТипНаименование,Выборка.Номенклатура.Наименование);

        Строка.Good.Code = ФабрикаXDTO.Создать(ТипКод,Выборка.Номенклатура.Код);

        Строка.Good.UID  = ФабрикаXDTO.Создать(ТипУИД,XMLСтрока(Выборка.Номенклатура.УникальныйИдентификатор()));

//        Строка.Good = Номенклатура; это уже не нужно
14 4St
 
04.05.16
16:08
И еще: вместо
Номенклатура.Code = ФабрикаXDTO.Создать(ТипКод,Выборка.Номенклатура.Код)

наверняка можно будет написать гораздо проще:

Номенклатура.Code = Выборка.Номенклатура.Код;

Но это тоже неправильно, потому что Номенклатура.Код надо получить еще в запросе, а здесь писать уже Выборка.Номенклатура_Код;
То же самое с наименованием и прочими полями через точку.
Скорость вырастает на порядок, уверяю.
15 Dunstan
 
04.05.16
16:12
4St Спасибо большое. Буду пробовать.
16 4St
 
04.05.16
16:27
Перечитал еще раз, валится ведь здесь:

ФабрикаXDTO.ЗаписатьXML (МойXML, Таблица,"Table","http://www.Strings.com",ФормаXML.Элемент,НазначениеТипаXML.Явное);


Т.е. все объекты валидные.

Что будет, если вызвать просто
ФабрикаXDTO.ЗаписатьXML (МойXML, Таблица,"Table");
?
17 Dunstan
 
04.05.16
16:30
имеет форму "Атрибут" или "Текст". А должен быть "Элемент".
вот где собака порылась!
2 + 2 = 3.9999999999999999999999999999999...