Имя: Пароль:
1C
 
Сериализация объекта для передачи по JSON и десериализация в отличающиеся объект?
,
0 Бешеный заяц
 
12.10.20
16:16
Нужно наладить обмен между двума базами ДО одна буза немного отличается, для обмена планирую поднять HTTP сервис (точнее он уже есть под другие справочники),
Документ довольно массивный планирую воспользоваться примером из https://wonderland.v8.1c.ru/blog/serializatsiya-prikladnykh-tipov-1s-predpriyatiya-v-json/
Возник вопрос, что произайдет в момент десериализации если не будет определенного реквизита? есть ли в ручную этот момент разрулить?
Второй вопрос , можно ли к HTTP обменам конвертацию данных прикрутить? чтобы происходила конвертация объектов по правилам далее по JSON отправлялась и дальше в обратном порядке?
1 ДенисЧ
 
12.10.20
16:18
Упадёт, разумеется. Если влоб десериализовывать будешь.
Ручками читай жисон.
2 Престарелый Заяц
 
12.10.20
16:18
Он тебе его десериализует в новый объект, в тот который ты опишешь.
3 ДенисЧ
 
12.10.20
16:18
"можно ли к HTTP обменам конвертацию данных прикрутить?"
Да
4 Бешеный заяц
 
12.10.20
16:23
(1) если стандартно дисирилизуешь JSON становится не стандартный
5 sikuda
 
12.10.20
16:23

ПрочитатьJSON(<ЧтениеJSON>, <Тип>, <ИмяФункцииВосстановления>, <МодульФункцииВосстановления>, <ДополнительныеПараметрыФункцииВосстановления>, <ТипыДляОбработкиВосстановления>, <ИменаСвойствДляВосстановления>)

- идти тебе Иванушка в тридесятое царство...
6 worker-good
 
12.10.20
16:29
(0) Да прибудет с тобой сила, молодой джидай!


&НаКлиенте
Процедура JSONtoXML(Команда)
    
    ДанныеXML = КонвертироватьДанныеИзJSONВXML(ДанныеJSON, СписокМассивов, СписокКорневых, СписокТеговСАтрибутами);
    
КонецПроцедуры

&НаКлиенте
Процедура XMLtoJSON(Команда)
    
    ДанныеJSON = КонвертироватьДанныеИзXMLВJSON(ДанныеXML, СписокМассивов, СписокКорневых, СписокТеговСАтрибутами, СписокЧисел, СписокБулевых);
    
КонецПроцедуры


&НаКлиентеНаСервереБезКонтекста
Функция КонвертироватьДанныеИзJSONВXML(Данные, СписокМассивов, СписокКорневых, СписокТеговСАтрибутами)
    
    ЧтениеJSON = Новый ЧтениеJSON();
    ЧтениеJSON.УстановитьСтроку(Данные);
    
    ЗаписьXML = Новый ЗаписьXML();
    ЗаписьXML.УстановитьСтроку();
    
    Для Каждого Корневой Из СписокКорневых Цикл
        ЗаписьXML.ЗаписатьНачалоЭлемента(Корневой.Значение);
    КонецЦикла;
    
    МассивШаговДоТекущегоЭлемента = Новый Массив();
    ЭтоЗаписьАтрибутов = Ложь;
    ИмяАтрибута = "";
    ЗначениеТегаСАтрибутом = "";
    Пока ЧтениеJSON.Прочитать() Цикл
        
        Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.НачалоОбъекта Тогда
            Если ЭтоМассив(СписокМассивов, МассивШаговДоТекущегоЭлемента) Тогда
                ИмяЭлементов = ИмяЭлементовМассиваИзJSONВXML(СписокМассивов, МассивШаговДоТекущегоЭлемента);
                ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЭлементов);
                МассивШаговДоТекущегоЭлемента.Добавить(ИмяЭлементов);
            КонецЕсли;
            Если ЭтоТегСАтрибутами(СписокТеговСАтрибутами, МассивШаговДоТекущегоЭлемента) Тогда
                ЭтоЗаписьАтрибутов = Истина;
            КонецЕсли;
        КонецЕсли;
        
        Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.КонецОбъекта Тогда
            Если не МассивШаговДоТекущегоЭлемента.Количество() = 0 Тогда
                МассивШаговДоТекущегоЭлемента.Удалить(МассивШаговДоТекущегоЭлемента.ВГраница());
            КонецЕсли;
            Если ЭтоЗаписьАтрибутов Тогда
                ЭтоЗаписьАтрибутов = Ложь;
                Если не ЗначениеТегаСАтрибутом = "" Тогда
                    ЗаписьXML.ЗаписатьТекст(Строка(ЗначениеТегаСАтрибутом));
                    ЗначениеТегаСАтрибутом = "";
                    ЗаписьXML.ЗаписатьКонецЭлемента();
                КонецЕсли;
            ИначеЕсли не МассивШаговДоТекущегоЭлемента.Количество() = 0 Тогда
                ЗаписьXML.ЗаписатьКонецЭлемента();
            КонецЕсли;
        КонецЕсли;
        
        Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.КонецМассива Тогда
            МассивШаговДоТекущегоЭлемента.Удалить(МассивШаговДоТекущегоЭлемента.ВГраница());
            ЗаписьXML.ЗаписатьКонецЭлемента();
        КонецЕсли;
        
        Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
            МассивШаговДоТекущегоЭлемента.Добавить(ЧтениеJSON.ТекущееЗначение);
            Если ЭтоЗаписьАтрибутов Тогда
                ИмяАтрибута = ЧтениеJSON.ТекущееЗначение;
            Иначе
                ЗаписьXML.ЗаписатьНачалоЭлемента(ЧтениеJSON.ТекущееЗначение);
            КонецЕсли;
        КонецЕсли;
        
        Если ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Булево
            или ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Число
            или ЧтениеJSON.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Тогда
            
            Если ЭтоМассив(СписокМассивов, МассивШаговДоТекущегоЭлемента) Тогда
                ИмяЭлементов = ИмяЭлементовМассиваИзJSONВXML(СписокМассивов, МассивШаговДоТекущегоЭлемента);
                ЗаписьXML.ЗаписатьНачалоЭлемента(ИмяЭлементов);
                МассивШаговДоТекущегоЭлемента.Добавить(МассивШаговДоТекущегоЭлемента);
            КонецЕсли;
            
            Если не ЭтоЗаписьАтрибутов или не ИмяАтрибута = ИмяЗначенияТегаСАтрибутамиJSONtoXML(СписокТеговСАтрибутами, МассивШаговДоТекущегоЭлемента) Тогда
                Если ТипЗнч(ЧтениеJSON.ТекущееЗначение) = Тип("Число") Тогда
                    Если ЭтоЗаписьАтрибутов Тогда
                        ЗаписьXML.ЗаписатьАтрибут(ИмяАтрибута, Формат(ЧтениеJSON.ТекущееЗначение, "ЧГ=0"));
                    Иначе
                        ЗаписьXML.ЗаписатьТекст(Формат(ЧтениеJSON.ТекущееЗначение, "ЧГ=0"));
                    КонецЕсли;
                Иначе
                    Если ЭтоЗаписьАтрибутов Тогда
                        ЗаписьXML.ЗаписатьАтрибут(ИмяАтрибута, Строка(ЧтениеJSON.ТекущееЗначение));
                    Иначе
                        ЗаписьXML.ЗаписатьТекст(Строка(ЧтениеJSON.ТекущееЗначение));
                    КонецЕсли;
                КонецЕсли;
            Иначе
                ЗначениеТегаСАтрибутом = ЧтениеJSON.ТекущееЗначение;
            КонецЕсли;
            
            Если не ЭтоЗаписьАтрибутов Тогда
                ЗаписьXML.ЗаписатьКонецЭлемента();
            КонецЕсли;
            
            МассивШаговДоТекущегоЭлемента.Удалить(МассивШаговДоТекущегоЭлемента.ВГраница());
            
        КонецЕсли;
        
    КонецЦикла;
    
    Для Каждого Корневой Из СписокКорневых Цикл
        ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;
    
    XMLСтрока = ЗаписьXML.Закрыть();
    
    Возврат XMLСтрока;
    
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция КонвертироватьДанныеИзXMLВJSON(Данные, СписокМассивов, СписокКорневых, СписокТеговСАтрибутами, СписокЧисел, СписокБулевых)
    
    ЧтениеXML = Новый ЧтениеXML();
    ЧтениеXML.УстановитьСтроку(Данные);
    
    ЗаписьJSON = Новый ЗаписьJSON();
    ЗаписьJSON.УстановитьСтроку();
    
    ЗаписьJSON.ЗаписатьНачалоОбъекта();
    
    МассивШаговДоТекущегоЭлемента = Новый Массив();
    ОткрытыеОбъекты = Новый Массив();
    ЭтоЭлементыМассива = Ложь;
    УЭлементаЗаписаноЗначение = Ложь;
    ЭтоЗаписьАтрибутов = Ложь;
    Пока ЧтениеXML.Прочитать() Цикл
        
        НовыйМассив = Новый Массив();
        Для Каждого ПредыдущийЭлемент Из МассивШаговДоТекущегоЭлемента Цикл
            НовыйМассив.Добавить(ПредыдущийЭлемент);
        КонецЦикла;
        НовыйМассив.Добавить(ЧтениеXML.Имя);
        ЭтоКорневойЭлемент = ЭтоКорневой(СписокКорневых, НовыйМассив);
        
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента и не ЭтоКорневойЭлемент Тогда
            Если ЭтоМассив(СписокМассивов, МассивШаговДоТекущегоЭлемента) Тогда
                ЭтоЭлементыМассива = Истина;
            Иначе
                ЭтоЭлементыМассива = Ложь;
            КонецЕсли;
            Если не МассивШаговДоТекущегоЭлемента.Количество() = 0 и не ЭтотОбъектОткрыт(ОткрытыеОбъекты, МассивШаговДоТекущегоЭлемента) Тогда
                Если ЭтоМассив(СписокМассивов, МассивШаговДоТекущегоЭлемента) Тогда
                    ЗаписьJSON.ЗаписатьНачалоМассива();
                Иначе
                    ЗаписьJSON.ЗаписатьНачалоОбъекта();
                КонецЕсли;
                ПриОткрытииОбъекта(ОткрытыеОбъекты, МассивШаговДоТекущегоЭлемента);
            КонецЕсли;
            Если не ЭтоЭлементыМассива Тогда
                ЗаписьJSON.ЗаписатьИмяСвойства(ЧтениеXML.Имя);
                УЭлементаЗаписаноЗначение = Ложь;
            КонецЕсли;
            МассивШаговДоТекущегоЭлемента.Добавить(ЧтениеXML.Имя);
        КонецЕсли;
        
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
            Если не МассивШаговДоТекущегоЭлемента.Количество() = 0 и ЭтотОбъектОткрыт(ОткрытыеОбъекты, МассивШаговДоТекущегоЭлемента) и не ЭтоКорневойЭлемент Тогда
                ПриЗакрытииОбъекта(ОткрытыеОбъекты, МассивШаговДоТекущегоЭлемента);
                Если ЭтоМассив(СписокМассивов, МассивШаговДоТекущегоЭлемента) Тогда
                    ЗаписьJSON.ЗаписатьКонецМассива();
                    ЭтоЭлементыМассива = Ложь;
                Иначе
                    ЗаписьJSON.ЗаписатьКонецОбъекта();
                КонецЕсли;
            ИначеЕсли не УЭлементаЗаписаноЗначение и не ЭтоКорневойЭлемент Тогда
                ЗаписьJSON.ЗаписатьЗначение("");
            КонецЕсли;
            Если не ЭтоКорневойЭлемент Тогда
                МассивШаговДоТекущегоЭлемента.Удалить(МассивШаговДоТекущегоЭлемента.ВГраница());
            КонецЕсли;
        КонецЕсли;
        
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
            Если ЭтоЧисло(СписокЧисел, МассивШаговДоТекущегоЭлемента) Тогда
                Если ЭтоЗаписьАтрибутов Тогда
                    ЗаписьJSON.ЗаписатьИмяСвойства(ИмяЗначенияТегаСАтрибутами(СписокТеговСАтрибутами, МассивШаговДоТекущегоЭлемента));
                    ЗаписьJSON.ЗаписатьЗначение(Число(ЧтениеXML.Значение));
                Иначе
                    ЗаписьJSON.ЗаписатьЗначение(Число(ЧтениеXML.Значение));
                КонецЕсли;
            ИначеЕсли ЭтоБулево(СписокБулевых, МассивШаговДоТекущегоЭлемента) Тогда
                Если ЭтоЗаписьАтрибутов Тогда
                    ЗаписьJSON.ЗаписатьИмяСвойства(ИмяЗначенияТегаСАтрибутами(СписокТеговСАтрибутами, МассивШаговДоТекущегоЭлемента));
                    ЗаписьJSON.ЗаписатьЗначение(Булево(ЧтениеXML.Значение));
                Иначе
                    ЗаписьJSON.ЗаписатьЗначение(Булево(ЧтениеXML.Значение));
                КонецЕсли;
            Иначе
                Если ЭтоЗаписьАтрибутов Тогда
                    ЗаписьJSON.ЗаписатьИмяСвойства(ИмяЗначенияТегаСАтрибутами(СписокТеговСАтрибутами, МассивШаговДоТекущегоЭлемента));
                    ЗаписьJSON.ЗаписатьЗначение(ЧтениеXML.Значение);
                Иначе
                    ЗаписьJSON.ЗаписатьЗначение(ЧтениеXML.Значение);
                КонецЕсли;
            КонецЕсли;
            УЭлементаЗаписаноЗначение = Истина;
        КонецЕсли;
        
        Если ЭтоЗаписьАтрибутов Тогда
            
            ЭтоЗаписьАтрибутов = Ложь;
            ЗаписьJSON.ЗаписатьКонецОбъекта();
            
        ИначеЕсли ЭтоТегСАтрибутами(СписокТеговСАтрибутами, МассивШаговДоТекущегоЭлемента) Тогда
            
            ЭтоЗаписьАтрибутов = Истина;
            
            ЗаписьJSON.ЗаписатьНачалоОбъекта();
            
            Пока ЧтениеXML.СледующийАтрибут() Цикл
                
                ЗаписьJSON.ЗаписатьИмяСвойства(ЧтениеXML.Имя);
                Если ЭтоЧисло(СписокЧисел, МассивШаговДоТекущегоЭлемента) Тогда
                    ЗаписьJSON.ЗаписатьЗначение(Число(ЧтениеXML.Значение));
                ИначеЕсли ЭтоБулево(СписокБулевых, МассивШаговДоТекущегоЭлемента) Тогда
                    ЗаписьJSON.ЗаписатьЗначение(Булево(ЧтениеXML.Значение));
                Иначе
                    ЗаписьJSON.ЗаписатьЗначение(ЧтениеXML.Значение);
                КонецЕсли;
                
            КонецЦикла;
            
        КонецЕсли;
        
    КонецЦикла;
    
    ЗаписьJSON.ЗаписатьКонецОбъекта();
    
    JSONСтрока = ЗаписьJSON.Закрыть();
    
    Возврат JSONСтрока;
    
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ЭтоМассив(СписокМассивов, МассивШагов)
    
    ПутьБезПоследнегоПрыжка = СтрСоединить(МассивШагов, ".") + ".";
    
    Для Каждого Массив Из СписокМассивов Цикл
        
        Если СтрНачинаетсяС(Массив.Значение, ПутьБезПоследнегоПрыжка)
            и СтрЧислоВхождений(СтрЗаменить(Массив.Значение, ПутьБезПоследнегоПрыжка, ""), ".") = 0 Тогда
            
            Возврат Истина;
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат Ложь;
    
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ИмяЭлементовМассиваИзJSONВXML(СписокМассивов, МассивШагов)
    
    ПутьБезПоследнегоПрыжка = СтрСоединить(МассивШагов, ".") + ".";
    
    Для Каждого Массив Из СписокМассивов Цикл
        
        Если СтрНачинаетсяС(Массив.Значение, ПутьБезПоследнегоПрыжка)
            и СтрЧислоВхождений(СтрЗаменить(Массив.Значение, ПутьБезПоследнегоПрыжка, ""), ".") = 0 Тогда
            
            Возврат СтрЗаменить(Массив.Значение, ПутьБезПоследнегоПрыжка, "");
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат "";
    
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ЭтоТегСАтрибутами(СписокТеговСАтрибутами, МассивШагов)
    
    ПутьБезПоследнегоПрыжка = СтрСоединить(МассивШагов, ".") + ".";
    
    Для Каждого ТегСАтрибутами Из СписокТеговСАтрибутами Цикл
        
        Если СтрНачинаетсяС(ТегСАтрибутами.Значение, ПутьБезПоследнегоПрыжка)
            и СтрЧислоВхождений(СтрЗаменить(ТегСАтрибутами.Значение, ПутьБезПоследнегоПрыжка, ""), ".") = 0 Тогда
            
            Возврат Истина;
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат Ложь;
    
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ИмяЗначенияТегаСАтрибутами(СписокТеговСАтрибутами, МассивШагов)
    
    ПутьБезПоследнегоПрыжка = СтрСоединить(МассивШагов, ".") + ".";
    
    Для Каждого ТегСАтрибутами Из СписокТеговСАтрибутами Цикл
        
        Если СтрНачинаетсяС(ТегСАтрибутами.Значение, ПутьБезПоследнегоПрыжка)
            и СтрЧислоВхождений(СтрЗаменить(ТегСАтрибутами.Значение, ПутьБезПоследнегоПрыжка, ""), ".") = 0 Тогда
            
            Возврат СтрЗаменить(ТегСАтрибутами.Значение, ПутьБезПоследнегоПрыжка, "");
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат "";
    
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ИмяЗначенияТегаСАтрибутамиJSONtoXML(СписокТеговСАтрибутами, МассивШагов)
    
    Если СписокТеговСАтрибутами.НайтиПоЗначению(СтрСоединить(МассивШагов, ".")) = Неопределено Тогда
        Возврат "";
    Иначе
        Возврат МассивШагов[МассивШагов.ВГраница()];
    КонецЕсли;
    
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ЭтоКорневой(СписокКорневых, МассивШагов)
    
    Возврат не СписокКорневых.НайтиПоЗначению(СтрСоединить(МассивШагов, ".")) = Неопределено;
    
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ЭтоЧисло(СписокЧисел, МассивШагов)
    
    Возврат не СписокЧисел.НайтиПоЗначению(СтрСоединить(МассивШагов, ".")) = Неопределено;
    
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ЭтоБулево(СписокБулевых, МассивШагов)
    
    Возврат не СписокБулевых.НайтиПоЗначению(СтрСоединить(МассивШагов, ".")) = Неопределено;
    
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Функция ЭтотОбъектОткрыт(ОткрытыеОбъекты, МассивШагов)
    
    СтрокаТекущегоПути = СтрСоединить(МассивШагов, ".");
    
    Возврат не ОткрытыеОбъекты.Найти(СтрокаТекущегоПути) = Неопределено;
    
КонецФункции

&НаКлиентеНаСервереБезКонтекста
Процедура ПриОткрытииОбъекта(ОткрытыеОбъекты, МассивШагов)
    
    СтрокаТекущегоПути = СтрСоединить(МассивШагов, ".");
    
    ОткрытыеОбъекты.Добавить(СтрокаТекущегоПути);
    
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура ПриЗакрытииОбъекта(ОткрытыеОбъекты, МассивШагов)
    
    СтрокаТекущегоПути = СтрСоединить(МассивШагов, ".");
    
    ИндексЭлемента = ОткрытыеОбъекты.Найти(СтрокаТекущегоПути);
    Если не ИндексЭлемента = Неопределено Тогда
        ОткрытыеОбъекты.Удалить(ИндексЭлемента);
    КонецЕсли;
    
КонецПроцедуры
7 Бешеный заяц
 
12.10.20
16:30
(5) ок понял нужно раскурить "ИмяФункцииВосстановления"
вопрос , ссылочные объекты тоже серилизуются полностью?
8 Бешеный заяц
 
12.10.20
16:31
(6) ок спасибо польшое)
9 worker-good
 
12.10.20
16:32
(8) Дам тебе еще больше магии, но только уже не джейсон, а в XML:

Перем СчетчикЭлементов;
Перем ПоследняяСсылка;
// Рекурсивная выгрузка значений, ссылки раскрываются в таблицу объекта только один раз
Функция РаскрытьЗначениеВСтрокуXML(ЗаписьXML, Знач Значение, ИменаУровня = 0, БывшиеСсылки = Неопределено, ТекущийУровеньГлубины = 0)
    Если СчетчикЭлементов = Неопределено Тогда
        СчетчикЭлементов = 1;
    Иначе
        СчетчикЭлементов = СчетчикЭлементов + 1;
    КонецЕсли;
    Если Окр(СчетчикЭлементов / 100) * 100 = СчетчикЭлементов Тогда
        Состояние("Обработка выгрузки коллекции: " + СчетчикЭлементов + " " + ПоследняяСсылка);
        ОбработкаПрерыванияПользователя();
    КонецЕсли;

    Если ТекущийУровеньГлубины > 25 Тогда
        ЗаписьXML.ЗаписатьТекст(XMLСтрока(Значение));
        Возврат 0;
    КонецЕсли;
    Если БывшиеСсылки = Неопределено Тогда
        БывшиеСсылки = Новый Массив;            // При больших объёмах - индексированная ТЗ
    КонецЕсли;
    
    Если 0 Тогда ЗаписьXML = Новый ЗаписьXML; КонецЕсли; // Dummy
    
    ТипЗначения = ТипЗнч(Значение);
    ФлагПримитивныйТип = Найти("Число,Дата,Строка,Булево,Неопределено", ТипЗначения);
    Если ФлагПримитивныйТип Тогда
        ЗаписьXML.ЗаписатьАтрибут("ТипЗначения", "" + ТипЗначения);
        ЗаписьXML.ЗаписатьТекст(XMLСтрока(Значение));
    Иначе
        Попытка
            Если НЕ ЗначениеЗаполнено(Значение) Тогда
                Возврат 0;
            КонецЕсли;
            ФлагЗакрыватьЭлемент = 0;
            ТЗЗначения          = Новый ТаблицаЗначений;
            ТЗЗначения.Колонки.Добавить("Значение");
            ТЗЗначения.Колонки.Добавить("ИмяКолонки");
            
            UID = 0;
            Если Перечисления.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
                ЗаписьXML.ЗаписатьАтрибут("ТипЗначения", "Перечисление");
                ЗначенияПеречисления = Значение.Метаданные().ЗначенияПеречисления[Перечисления[Значение.Метаданные().Имя].Индекс(Значение)].Имя;
                ЗаписьXML.ЗаписатьТекст(ЗначенияПеречисления);
                Возврат 0;
            ИначеЕсли Найти("" + ТипЗначения, " ссылка") > 0 Тогда // Преобразование ссылок в таблицу
                ПоследняяСсылка     = Значение;
                
                СтрокаТЗ             = ТЗЗначения.Добавить();
                СтрокаТЗ.Значение   = Значение.ПометкаУдаления;
                СтрокаТЗ.ИмяКолонки = "ПометкаУдаления";
                Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
                    ЗаписьXML.ЗаписатьАтрибут("ТипЗначения", "Справочник");
                    СтрокаТЗ             = ТЗЗначения.Добавить();
                    СтрокаТЗ.Значение   = Значение.Код;
                    СтрокаТЗ.ИмяКолонки = "Код";
                    СтрокаТЗ             = ТЗЗначения.Добавить();
                    СтрокаТЗ.Значение   = Значение.Наименование;
                    СтрокаТЗ.ИмяКолонки = "Наименование";
                    СтрокаТЗ             = ТЗЗначения.Добавить();
                    СтрокаТЗ.Значение   = Значение.Родитель;
                    СтрокаТЗ.ИмяКолонки = "Родитель";
                    СтрокаТЗ             = ТЗЗначения.Добавить();
                    СтрокаТЗ.Значение   = Значение.Владелец;
                    СтрокаТЗ.ИмяКолонки = "Владелец";
                    СтрокаТЗ             = ТЗЗначения.Добавить();
                    СтрокаТЗ.Значение   = Значение.ЭтоГруппа;
                    СтрокаТЗ.ИмяКолонки = "ЭтоГруппа";
                ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипЗначения) Тогда
                    ЗаписьXML.ЗаписатьАтрибут("ТипЗначения", "Документ");
                    СтрокаТЗ             = ТЗЗначения.Добавить();
                    СтрокаТЗ.Значение   = Значение.Дата;
                    СтрокаТЗ.ИмяКолонки = "Дата";
                    СтрокаТЗ             = ТЗЗначения.Добавить();
                    СтрокаТЗ.Значение   = Значение.Номер;
                    СтрокаТЗ.ИмяКолонки = "Номер";
                    СтрокаТЗ             = ТЗЗначения.Добавить();
                    СтрокаТЗ.Значение   = Значение.Проведен;
                    СтрокаТЗ.ИмяКолонки = "Проведен";
                КонецЕсли;
                
                UID = Значение.УникальныйИдентификатор();
                Если (БывшиеСсылки.Найти("" + UID) <> Неопределено) Тогда
                    ЗаписьXML.ЗаписатьТекст(XMLСтрока(Значение));
                    Возврат 0;
                Иначе
                    Для каждого Реквизит Из Значение.Метаданные().Реквизиты Цикл
                        СтрокаТЗ             = ТЗЗначения.Добавить();
                        СтрокаТЗ.Значение   = Значение[Реквизит.Имя];
                        СтрокаТЗ.ИмяКолонки = Реквизит.Имя;
                    КонецЦикла;
                    БывшиеСсылки.Добавить("" + UID);
                КонецЕсли;
            ИначеЕсли // Безличный массив
                (ТипЗначения = Тип("Массив")) Тогда
                Для НомСтроки = 0 По Значение.Количество() - 1 Цикл
                    СтрокаТЗ             = ТЗЗначения.Добавить();
                    СтрокаТЗ.Значение   = Значение[НомСтроки];
                    СтрокаТЗ.ИмяКолонки = НомСтроки;
                КонецЦикла;
            ИначеЕсли (ТипЗначения = Тип("СтрокаТаблицыЗначений")) Тогда
                Если ИменаУровня = 0 Тогда
                    ИменаУровня = Новый Массив;
                    Для Каждого Колонка Из Значение.Владелец().Колонки Цикл
                        ИменаУровня.Добавить(Колонка.Имя);
                    КонецЦикла;    
                КонецЕсли;
                КоличествоКолонок         = Значение.Владелец().Колонки.Количество() - 1;
                Для НомКолонки = 0 По КоличествоКолонок Цикл
                    СтрокаТЗ             = ТЗЗначения.Добавить();
                    СтрокаТЗ.Значение   = Значение[НомКолонки];
                    СтрокаТЗ.ИмяКолонки = ?(ИменаУровня <> 0,ИменаУровня[НомКолонки],"Колонка" + Формат(НомКолонки,"ЧГ=;ЧН="));
                КонецЦикла;
            ИначеЕсли // Именованный массив
                ТипЗначения = Тип("ТаблицаЗначений") Тогда
                
                ФлагЗакрыватьЭлемент = Истина;
                ЗаписьXML.ЗаписатьНачалоЭлемента("ТаблицаЗначений");
                
                ИменаУровня = Новый Массив;
                Для Каждого Колонка Из Значение.Колонки Цикл
                    ИменаУровня.Добавить(Колонка.Имя);
                КонецЦикла;    
                
                Для НомСтроки = 0 По Значение.Количество() - 1 Цикл
                    СтрокаТЗ             = ТЗЗначения.Добавить();
                    СтрокаТЗ.Значение   = Значение[НомСтроки];
                    СтрокаТЗ.ИмяКолонки = НомСтроки;
                КонецЦикла;
            КонецЕсли;
            Если ТЗЗначения.Количество() = 0 Тогда
                ЗаписьXML.ЗаписатьБезОбработки("<ТаблицаЗначений Количество=""0""></ТаблицаЗначений>");
            Иначе
                Для НомЭлемента = 0 По ТЗЗначения.Количество() - 1 Цикл
                    СтрокаТЗ = ТЗЗначения[НомЭлемента];
                    ИмяКолонки = "" + СтрокаТЗ.ИмяКолонки;
                    ЗаписьXML.ЗаписатьНачалоЭлемента("Элемент");
                    ЗаписьXML.ЗаписатьАтрибут("Имя", ИмяКолонки);
                    
                    РаскрытьЗначениеВСтрокуXML(ЗаписьXML,СтрокаТЗ.Значение,, БывшиеСсылки, ТекущийУровеньГлубины + 1);
                    ЗаписьXML.ЗаписатьКонецЭлемента();
                КонецЦикла;
            КонецЕсли;
            Если ФлагЗакрыватьЭлемент = Истина Тогда
                ЗаписьXML.ЗаписатьКонецЭлемента();
            КонецЕсли;
        Исключение
            Сообщить("" + ОписаниеОшибки());
        КонецПопытки;
    КонецЕсли;
    Возврат 0;
КонецФункции
Функция РаскрытьЗначениеВСтрокуВнутр(Знач Значение)
    Попытка
        РезЗначение =  "{" + Значение.Количество() + ",";
        Для Каждого ЭлементЗначения Из Значение Цикл
            РезЗначение = РезЗначение + ?(ЭлементЗначения = Значение[0],"","," + Символы.ПС) + "{" + РаскрытьЗначениеВСтрокуВнутр(ЭлементЗначения) + "}";
        КонецЦикла;
        РезЗначение = РезЗначение + "}";
    Исключение
        Если ТипЗнч(Значение) = Тип("СтрокаТаблицыЗначений") Тогда
            ТаблицаВладелец = Значение.Владелец();
            Содержимое = "";
            Попытка
                КоличествоЗначений = 0;
                Для НомЭлемента = 0 По 9000000 Цикл
                    Если Окр(НомЭлемента / 500) * 500 <> НомЭлемента Тогда
                        Состояние("Обработка выгрузки коллекции: " + НомЭлемента);
                        ОбработкаПрерыванияПользователя();
                    КонецЕсли;
                    ИмяКолонки = ТаблицаВладелец.Колонки[НомЭлемента].Имя;
                    Содержимое = Содержимое + ?(НомЭлемента = 0,"","," + Символы.ПС) + "{" + НомЭлемента + ",""" + ИмяКолонки + """," +
                    "{" + РаскрытьЗначениеВСтрокуВнутр(Значение[НомЭлемента]) + "}";
                    КоличествоЗначений = КоличествоЗначений + 1;
                КонецЦикла;
            Исключение
                РезЗначение =  "{" + КоличествоЗначений + "," + Содержимое + "}";
            КонецПопытки;
        Иначе
            РезЗначение = ЗначениеВСтрокуВнутр(Значение);
        КонецЕсли;
    КонецПопытки;
    Возврат РезЗначение;
КонецФункции
10 Garykom
 
гуру
12.10.20
16:40
(0) Делаешь десериализацию в структуру, правишь ее а затем заполняешь из нее объект блин
11 Garykom
 
гуру
12.10.20
16:41
(9) Поубивав бы. Нахрена эти портянки кода с xml когда на json все простейше?
12 Бешеный заяц
 
12.10.20
16:54
(10) кстати да не сообразил, при десериализации можно указать в какой объект, в голове у меня засело что объектом может быть только документ и справочник)
13 Бешеный заяц
 
13.10.20
12:21
Подниму тему, при сериализации получается вид Контрагенты": [
{
"Контрагент": "cc7a4214-1ee0-11e9-8125-00155d1a7e04",
"КонтактноеЛицо": "00000000-0000-0000-0000-000000000000",
"ПодписалОтКонтрагента": "00000000-0000-0000-0000-000000000000"

Как заставить сериализовать ссылки? хотя бы на один уровень вложенности? чтобы например из контрагента достать ИНН при получении и уже по нему поиск выполнять если по ссылке не нашел?
14 youalex
 
13.10.20
12:27
XDTO не пробовал?
15 Бешеный заяц
 
13.10.20
12:33
(14) всмысле ?у меня сериализация идет как СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ВнутреннийДокумент,НазначениеТипаXML.Явное);
16 Бешеный заяц
 
13.10.20
12:40
(14) (15) может есть возможность перечислить реквизиты объекты которого нужно тоже сериализовать? или указать глубину сериализации?
17 youalex
 
13.10.20
12:43
(15) Создать пакет XDTO, указать там явно 1с-ные типы,  читать через ФабрикаXDTO.ПрочитатьJSON()
Но я не уверен, что взлетит, мне самому интересно))
18 youalex
 
13.10.20
12:45
А так, "Контрагент": "cc7a4214-1ee0-11e9-8125-00155d1a7e04",
читается стандартно как XMLЗначение(Тип("СправочникСсылка.Контрагенты"), "cc7a4214-1ee0-11e9-8125-00155d1a7e04")
ну или типа того
19 youalex
 
13.10.20
12:52
(16) Да, ты можешь задать список реквизитов в ИменаСвойствДляВосстановления
А (18) прописать в <МодульФункцииВосстановления>.<ИмяФункцииВосстановления>
Если в лоб решать
20 Бешеный заяц
 
13.10.20
13:30
(19) (18) прочитать не проблема, проблема как туда объект запихнуть а не ссылки (гуиды) их
21 Бешеный заяц
 
13.10.20
13:34
может после сериализации можно обраться к данным как к структуре и заменить данные ссылки на данные объекта? или перед сериализацией выгрузить объект в структуру заменить данные с сылки на обект, сериализовать данную структуру в нужный объект,
22 Garykom
 
гуру
13.10.20
13:38
23 Garykom
 
гуру
13.10.20
13:39
(22)+ там в двух местах своим кодом влезаешь и делаешь замену\добавление реквизитов
24 Бешеный заяц
 
13.10.20
13:56
(22) были бы еще старт мани(
25 Бешеный заяц
 
13.10.20
13:58
ок нашел скачал изучаю
26 Бешеный заяц
 
13.10.20
14:07
так эта обработка также выгружает, по ссылочным данным выгружает ссылку гуид, а не сам объект, ниже пример

},
"ВидДокумента":{
"TYPE":"СправочникСсылка.ВидыВнутреннихДокументов",
"UID":"f545c182-bb45-11e8-811b-00155d1a7e07"
},
"ДатаНачалаДействия":{
"TYPE":"Дата",
"UID":"2019-12-27T00\:00\:00"
},
"ДатаОкончанияДействия":{
"TYPE":"Дата",
"UID":"2020-12-31T00\:00\:00"
},
"ДатаРегистрации":{
"TYPE":"Дата",
"UID":"2020-12-27T11\:56\:11"
},
"ДатаСоздания":{
"TYPE":"Дата",
"UID":"2020-01-10T12\:41\:53"
},
27 Бешеный заяц
 
13.10.20
14:17
как вместо ВидДокумента":{
"TYPE":"СправочникСсылка.ВидыВнутреннихДокументов",
"UID":"f545c182-bb45-11e8-811b-00155d1a7e07"

объект справочника вида документа запихнуть?
28 RomanYS
 
13.10.20
14:18
(26) Выгружай по ссылкам дополнительно нужные объекты, откуда обработка может знать что тебе надо?
29 mistеr
 
13.10.20
14:39
(6) Вопрос, нафига тогда JSON, лучше юзать родной XML.
30 Бешеный заяц
 
13.10.20
15:05
как мне тогда одним запросом несколько объектов отправить? СериализаторXDTO целиком занимает ЗаписьJSON объектом, если я правильно выразился, массив ему не подсунуть

Соединение = Новый HTTPСоединение(ИмяСервера,,ИмяПользователя,Пароль);
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
    
    
    ЗаписьJSON = Новый ЗаписьJSON;    
    ЗаписьJSON.УстановитьСтроку();

    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ВнутреннийДокумент,НазначениеТипаXML.Явное);

    ТекстЗапроса = ЗаписьJSON.Закрыть();
    HTTPЗапрос.УстановитьТелоИзСтроки(ТекстЗапроса);
    
    Результат = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    КодОтвета  = Результат.КодСостояния;
31 RomanYS
 
13.10.20
15:09
(30) СериализаторXDTO.ЗаписатьJSON в цикле нельзя?
32 Бешеный заяц
 
13.10.20
15:17
(31) надо попробовать, но думаю каждый раз будет замещаться значение
33 Бешеный заяц
 
13.10.20
15:37
Еще вопрос (эх разошелся я сегодня:-))
Объект приемник отличается от источника соответственно на

СтрДанные = СериализаторXDTO.ПрочитатьJSON(ЧтениеJSON);

сыпется, предполагаю при отправке структуру данных необходимо привести к данным источника? подскажите как это можно реализовать? думаю в отправку нужно добавить те реквизиты которые присутствуют у получателя? или в параметрах восстановления есть возможность поставить признак игнорировать ошибки при  десириализации?
34 Бешеный заяц
 
13.10.20
16:45
при серилизации попытался скормить схему базы получателя которую получил путем кликанья в дереве метаданных "XDTO-пакеты" Экспорт xml схемы.
Далее открыл данный файл в блокноте, скопировал содержимое к себе в обработку в макет (макет текстовой)
далее пытаюсь использовать данную схему:

        ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.УстановитьСтроку(РеквизитФормыВЗначение("Объект").ПолучитьМакет("Схема").ПолучитьТекст());
    ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
    НоваяФабрикаXDTO = Новый ФабрикаXDTO(ОбъектModel);
    ЧтениеXML.Закрыть();
    НовыйСериализаторXDTO = Новый СериализаторXDTO(НоваяФабрикаXDTO);
  
    НовыйСериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, СписокОбъектов,НазначениеТипаXML.Явное);

В результате валится ошибка на ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);


Несоответствие типов XDTO:
Тип '{http://www.w3.org/2001/XMLSchema}anyType' не соответствует типу ''
Тип свойства не соответствует типу значения
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(31)}:    ОбъектModel = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(56)}:    ВыгрузитьНаСервере();

по причине:
Ошибка преобразования данных XDTO:
Чтение объекта типа: {http://www.w3.org/2001/XMLSchema}anyType - [3,2]
Проверка дополнительного свойства:
    форма: Элемент
    имя: {http://www.w3.org/2001/XMLSchema}import
по причине:
Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {http://www.w3.org/2001/XMLSchema}anyType

по причине:
Несоответствие типов XDTO:
Тип '{http://www.w3.org/2001/XMLSchema}anyType' не соответствует типу ''
Тип свойства не соответствует типу значения




Вопрос возник как сие лечить?
35 youalex
 
13.10.20
16:50
Еще немного, и ты напишешь КД3 )
36 RomanYS
 
13.10.20
16:53
(35) ага :)
Есть ощущение, что на КД2 ТС бы уже давно всё сделал и не парился
37 Бешеный заяц
 
13.10.20
16:58
(35) (36) так мне надо через http сервис все отправить запросом)

так в чем ошибка может быть? изначально как я предпологаю десирилизация не шла так как объекты в базе одличаются составом реквизитов, соответственно опять же я предположил нужно при серилизации подкинуть схему даба данный изначально сформировались корректно, почти получилось, но вот почему завал ФабрикаXDTO.ПрочитатьXML(ЧтениеXML)???
38 RomanYS
 
13.10.20
17:02
(37) А через http сервис нельзя передать результат выгрузки КД2 и стандартной обработкой его обработать?
По (34) извини, чем помочь не знаю)
39 Garykom
 
гуру
13.10.20
18:11
(27) примерно так

Функция ВыгрузкаРеквизита(Значение, ЗначениеСтруктурой)
    
    Если ЗначениеСтруктурой.TYPE = "СправочникСсылка.КлассификаторЕдиницИзмерения" Тогда
        ЗначениеСтруктурой.Вставить("CODE", XMLСтрока(Значение.Код));
    КонецЕсли;
    
КонецФункции

//В функции конструкции условий расставлены по частоте их использования.
//Если кому нибудь удастся более оптимально (в смысле быстродействия) написать,
//то просьба сообщить мне на [email protected]
Функция НеФорматированныйJSON(Значение,СтруктураТипов=Неопределено)
    
    Если СтруктураТипов=Неопределено Тогда
        СоответствиеХМЛ = Новый Соответствие;
        СоответствиеОбъектов  = Новый Соответствие;
        СтруктураТипов = Новый Структура("СоответствиеХМЛ,СоответствиеОбъектов",СоответствиеХМЛ,СоответствиеОбъектов);
    Иначе
        СоответствиеХМЛ = СтруктураТипов.СоответствиеХМЛ;
        СоответствиеОбъектов  = СтруктураТипов.СоответствиеОбъектов;
    КонецЕсли;
    
    Разделитель="";
    
    ТипЗн=ТипЗнч(Значение);

    Если ТипЗн=Тип("Строка") Тогда
        Стр=""""+Экранировать(Значение)+""""

    ИначеЕсли ТипЗн=Тип("Число") ИЛИ ТипЗнч(Значение)=Тип("Булево") Тогда
        Стр=XMLСтрока(Значение)

    //ИначеЕсли ТипЗн=Тип("Дата") Тогда
    //    Стр=""""+?(ЗначениеЗаполнено(Значение),XMLСтрока(Значение),"")+""""

    ИначеЕсли ТипЗн=Тип("Структура") Тогда
        Стр="{";
        Для Каждого Параметр Из Значение Цикл
            Стр=Стр+Разделитель+Символы.ПС+""""+Параметр.Ключ+""":"+НеФорматированныйJSON(Параметр.Значение,СтруктураТипов);
            Разделитель=","
        КонецЦикла;
        Стр=Стр+Символы.ПС+"}";

    ИначеЕсли ТипЗн=Тип("Массив") Тогда
        Стр="[";
        Для Каждого Элемент Из Значение Цикл
            Стр=Стр+Разделитель+Символы.ПС+НеФорматированныйJSON(Элемент,СтруктураТипов);
            Разделитель=","
        КонецЦикла;
        Стр=Стр+Символы.ПС+"]";

    ИначеЕсли ТипЗн=Тип("ТаблицаЗначений") Тогда
        Колонки=Значение.Колонки;
        СтруктураТЗ = Новый Структура;
        СтруктураТЗ.Вставить("TYPE","ТаблицаЗначений");
        СтруктураТЗ.Вставить("COLUMNS",Новый Структура);
        СтруктураТЗ.Вставить("ROWS",Новый Массив);
        Для Каждого Колонка Из Колонки Цикл
            СтруктураТЗ.COLUMNS.Вставить(Колонка.Имя,);
        КонецЦикла;
        Для Каждого СтрокаТЗ Из Значение Цикл
            Структура=Новый Структура;
            Для Каждого Колонка Из Колонки Цикл
                Если ЗначениеЗаполнено(СтрокаТЗ[Колонка.Имя]) Тогда
                    Структура.Вставить(Колонка.Имя,СтрокаТЗ[Колонка.Имя])
                КонецЕсли;
            КонецЦикла;
            СтруктураТЗ.ROWS.Добавить(Структура);
        КонецЦикла;
        Стр=НеФорматированныйJSON(СтруктураТЗ,СтруктураТипов)
        
    ИначеЕсли Значение=Неопределено Тогда
        Стр="null"
        
    ИначеЕсли СоответствиеХМЛ.Получить(ТипЗн) <> Неопределено Тогда
        
        
        ЗначениеСтруктурой = Новый Структура("TYPE,UID",СоответствиеХМЛ.Получить(ТипЗн),XMLСтрока(Значение));
        
        ВыгрузкаРеквизита(Значение, ЗначениеСтруктурой);
        
        Стр=НеФорматированныйJSON(ЗначениеСтруктурой,СтруктураТипов)
        
    ИначеЕсли СоответствиеОбъектов.Получить(ТипЗн) <> Неопределено Тогда
        
        ЗначениеСтруктурой = Новый Структура("OBJECT,NEW",Истина,СоответствиеОбъектов.Получить(ТипЗн));
        ЗначениеСтруктурой.Вставить("SAVE",СтруктураТипов.Свойство("SAVE") И СтруктураТипов.SAVE = Истина);
        
        //Значение = Документы.Поступление.НайтиПоНомеру("000000001").ПолучитьОбъект();
        МетаданныеЗначения = Значение.Метаданные();
        
        Для каждого СтандартныйРеквизит Из МетаданныеЗначения.СтандартныеРеквизиты Цикл
            ЗначениеСтруктурой.Вставить(СтандартныйРеквизит.Имя,Значение[СтандартныйРеквизит.Имя]);
        КонецЦикла;
        
        ЭтоГруппа = ЗначениеСтруктурой.Свойство("ЭтоГруппа") И ЗначениеСтруктурой.ЭтоГруппа = Истина;
                                
        Если ЭтоГруппа Тогда
            ЗначениеСтруктурой.NEW = СтрЗаменить(ЗначениеСтруктурой.NEW,"СоздатьЭлемент()","СоздатьГруппу()");
        КонецЕсли;
        Для каждого Реквизит Из МетаданныеЗначения.Реквизиты Цикл
            Если ЭтоГруппа И Реквизит.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента Тогда
                Продолжить;
            КонецЕсли;
            
            Если ЗначениеЗаполнено(Значение[Реквизит.Имя]) Тогда
                ЗначениеСтруктурой.Вставить(Реквизит.Имя,Значение[Реквизит.Имя]);
            КонецЕсли;
        КонецЦикла;
        Для каждого ТабличнаяЧасть Из МетаданныеЗначения.ТабличныеЧасти Цикл
            Если ЭтоГруппа И ТабличнаяЧасть.Использование = Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента Тогда
                Продолжить;
            КонецЕсли;

            Если Значение[ТабличнаяЧасть.Имя].Количество()>0 Тогда
                ЗначениеСтруктурой.Вставить(ТабличнаяЧасть.Имя,Значение[ТабличнаяЧасть.Имя].Выгрузить());
            КонецЕсли;
        КонецЦикла;
        Стр=НеФорматированныйJSON(ЗначениеСтруктурой,СтруктураТипов)
    Иначе
        Стр=""""+Экранировать(Значение)+""""
    КонецЕсли;

    Возврат Стр
КонецФункции
40 Garykom
 
гуру
13.10.20
18:16
(39)+ Но в общем случае предполагается что сами объекты со всеми реквизитами не надо засовывать по многу раз.
Только вид объекта и уид суем.

И дополнительно при необходимости один раз выгружаем сам этот объект (один раз), при необходимости аналогично вниз по иерархии идем, но все полные объекты будут на самом верхнем уровне выгружены в json
41 Garykom
 
гуру
13.10.20
18:18
(40)+ Т.е. допустим у тебя выгружаются 100 объектов Справочник.Номенклатура, у каждого есть Справочник.ВидНоменклатуры одинаковый
Так вот выгружаем 101 объект 100 номенклатуры и 1 вид номенклатуры

А не внутри каждой номенклатуры дублируем данные вида номенклатуры ))
42 Бешеный заяц
 
14.10.20
08:11
(41) спасибо  большое
43 Cthulhu
 
14.10.20
12:20
"все уже украли до нас!" (с)
в ДО свои веб-сервисы есть же, бери да юзай...
для примера - смотри как сделана бесшовная интеграция с ДО в той же УТ например...
44 VladZ
 
14.10.20
12:23
(38) Конечно можно.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс