|   |   | 
| 
 | XDTO Десериализация справочника Мультук, Волшебник, El_Duke, arsik, zarina15015, Tefal, PuhUfa, Chameleon1980, RVN, Галахад, kubik_live, Gera1t, , vicof, SleepyHead | ☑ | ||
|---|---|---|---|---|
| 0
    
        Gera1t 19.03.25✎ 16:09 | 
        Здравствуйте!
 Есть 2 одинаковые базы, нужно из одной в другую загружать справочник Номенклатура. В базе источнике сделал Web сервис, тип возвращаемых данных указал: CatalogObject.Номенклатура ( http://v8.1c.ru/8.1/data/enterprise/current-config ) данные передаю в виде массива, вот так: Ответ = Новый Массив; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | НЕ Номенклатура.ПометкаУдаления"; РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Ответ.Добавить(ВыборкаДетальныеЗаписи.Ссылка); КонецЦикла; Возврат СериализаторXDTO.ЗаписатьXDTO(Ответ); В базы приемнике получаю данные вот так: Определение = Новый WSОпределения("http://localhost/MM/ws/Nomenclature.1cws?wsdl , Логин, Пароль); Прокси = Новый WSПрокси(Определение, "http://localhost/Nomenclature", "Nomenclature", "NomenclatureSoap"); Прокси.Пользователь = Логин; Прокси.Пароль = Пароль; Данные = Прокси.GetData(); СписокНоменклатуры = СериализаторXDTO.ПрочитатьXDTO(Данные); В переменной Данные с типом СписокXDTO. Но при попытке СериализаторXDTO.ПрочитатьXDTO(Данные) получаю ошибку Ошибка отображения типов: Отсутствует отображение для типа '{http://v8.1c.ru/8.1/data/enterprise/current-config}CatalogRef.Номенклатура' Подскажите пожалуйста как десериализовать XDTO? | |||
| 1
    
        Gera1t 19.03.25✎ 16:36 | 
        Если я передаю не Массив, а ссылку на один элемент номенклатуры, то как будто десериализация происходит автоматически, я сразу получаю ссылку. Но если это вновь созданный элемент справочника, то получаю Объект не найден     | |||
| 2
    
        Галахад гуру 19.03.25✎ 16:45 | 
        Скорее всего косяк в коде.     | |||
| 3
    
        Gera1t 19.03.25✎ 16:47 | 
        И исходя из (1) подскажите пожалуйста, как правильно создавать недостающий элемент справочника?     | |||
| 4
    
        Gera1t 19.03.25✎ 16:48 | 
        В Данные.Value я вижу список передаваемой номенклатуры и могу перебрать его     | |||
| 5
    
        Gera1t 19.03.25✎ 16:53 | 
        Т.е. резюмируя все вышесказанное, вот это СериализаторXDTO.ПрочитатьXDTO(Данные) делать не нужно, в Данные.Value уже список с ссылками на элементы справочника Номенклатура.
 Но если передается новый элемент, которого нет в базе приемнике, то я получаю Объект не найден и не очень понимаю как в этом случае создать новый элемент | |||
| 6
    
        Gera1t 19.03.25✎ 16:55 | 
        Ну и если элемент справочника был переименован, по ссылке я вижу название, которое было в базе приемнике, и не вижу как он называется в базе источнике     | |||
| 7
    
        Мультук гуру 19.03.25✎ 17:07 | 
        (0) 
 Добавим в ваш код немного волшебства для простоты отладки (см ниже) В результате получаем 
<ляля xmlns="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Value xmlns:d2p1="http://v8.1c.ru/8.1/data/enterprise/current-config" xsi:type="d2p1:CatalogRef.Номенклатура">5e5a7257-6896-11e8-8780-b06ebf2faaf6</Value>
    <Value xmlns:d2p1="http://v8.1c.ru/8.1/data/enterprise/current-config" xsi:type="d2p1:CatalogRef.Номенклатура">c3314ae7-6899-11e8-8780-b06ebf2faaf6</Value>
</ляля>
Возникает вопрос. А где же код, Наименование, и прочие реквизиты объекта "Номенклатура" ? Но если код немного поменять Ответ.Добавить(ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект()); То и XML-файл в переменной "Стр" становится намного веселее. 
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 	Ответ = Новый Массив;
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 2
        |	Номенклатура.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |	НЕ Номенклатура.ПометкаУдаления
        |	И Номенклатура.ЭтоГруппа = ЛОЖЬ
		|";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Ответ.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
    КонецЦикла;
    
    тт = СериализаторXDTO.ЗаписатьXDTO(Ответ); 	
	
	стр = ОбъектXDTOВСтрокуXML(тт, "ляля");
	
КонецПроцедуры
Функция ОбъектXDTOВСтрокуXML(ОбъектXDTO, ИмяКорневогоУзла, ЗаписатьОбъявлениеXML = Ложь) Экспорт
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку("UTF-8");
	Если ЗаписатьОбъявлениеXML Тогда
		ЗаписьXML.ЗаписатьОбъявлениеXML();
	КонецЕсли;
	ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, ОбъектXDTO, ИмяКорневогоУзла);
	Возврат ЗаписьXML.Закрыть();
КонецФункции
 | |||
| 8
    
        Gera1t 20.03.25✎ 09:32 | 
        (7) Большое спасибо! Ни разу не вникал в то, как работает сериализация, опыта в этой сфере нет     | |||
| 9
    
        Gera1t 20.03.25✎ 09:53 | 
        Я так и не понял до конца как мне прочитать данные переданные через web сервис.
 Если бы я использовал HTTP-сервис, я бы сделал так: передавал в json массив из структур, в приемнике считывал бы его. При использовании WEB-сервиса: если я передаю CatalogObject.Номенклатура ( http://v8.1c.ru/8.1/data/enterprise/current-config ), то все отлично если нужно просто передать ссылку на объект из одной конфигурации в другую, но у меня задача получить создаваемые или измененные объекты и в базе приемнике переименовать или создать точно такие объекты Если я передаю XML как строку, там я получаю кучу лишнего и читать XML, по-моему сложнее чем JSON. Подскажите пожалуйста как и с каким типом данных передать данные из конфигурации источника и как прочитать, с учетом измененных и новых объектов, данные в базе приемнике? | |||
| 10
    
        Gera1t 20.03.25✎ 15:35 | 
        Если вдруг кому то интересно, то сделал так:
 Во первых тип возвращаемых данных указал: ValueStorage ( http://v8.1c.ru/8.1/data/core ) Затем в базе источнике: Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Код КАК Код, | Номенклатура.Наименование КАК Наименование, | Номенклатура.Ссылка КАК Ссылка, | Номенклатура.КатегорияНоменклатуры КАК КатегорияНоменклатуры |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | НЕ Номенклатура.ПометкаУдаления"; РезультатЗапроса = Запрос.Выполнить(); Возврат Новый ХранилищеЗначения(РезультатЗапроса.Выгрузить()); В базе приемнике: 
	Определение = Новый WSОпределения("http://localhost/MM/ws/Directories.1cws?wsdl  , Логин, Пароль);
	Прокси = Новый WSПрокси(Определение, "http://192.168.1.62/Directories  , "Directories", "DirectoriesSoap");	   
	Прокси.Пользователь = Логин;
	Прокси.Пароль = Пароль;	  
	
	Данные = Прокси.GetData();
	
	ТЗ= Данные.Получить();В ТЗ получаю Таблицу значений как в базе источнике. Если ТЗ.Ссылка = Объект не найден создаю новый элемент справочника с наименованием ТЗ.Наименование. Если элемент справочника есть, но ТЗ.Ссылка.Наименование <> ТЗ.Наименование, переименовываю. | |||
| 11
    
        Михаил Козлов 20.03.25✎ 16:39 | 
        "Если ТЗ.Ссылка = Объект не найден создаю новый элемент справочника с наименованием ТЗ.Наименование."
 На всякий случай установите у него ссылку по ГУИДу в источнике. Удобно еще через конвертацию данных. Если конфигурации одинаковые, можно через штатную обработку Выгрузка/Загрузка данных XML. | |||
| 12
    
        Gera1t 21.03.25✎ 11:38 | 
        (11)     
 НовЭл = Справочники.КатегорииНоменклатуры.СоздатьЭлемент(); НовЭл.УстановитьСсылкуНового(Ссылка); Вот так делаю в конфигурации приемнике. Ссылка это ссылка на объект из конфигурации источника | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |