Имя: Пароль:
1C
 
как при сериализации выгружать в свойство только ссылку, а не полностью объект,
0 novichok79
 
24.08.17
12:50
Доброго времени суток, уважаемые воены света (специалисты 1С)!
Сделал XDTO-пакет, добавил туда типов и объектов, далее сделал выгрузку номенклатуры по этому XDTO пакету в JSON. Все работает замечательно, но есть один момент... почему-то при записи реквизита номенклатуры значение этого реквизита выгружается как объект целиком, то есть идет дублирование ненужной информации и объем файла увеличивается. Вопрос - как выгружать только ID объекта, а не его описание целиком?
Заранее благодарю за помощь.
1 Вафель
 
24.08.17
12:53
тип непривиьлно указал
2 novichok79
 
24.08.17
12:58
(1) тип свойств сейчас - объект, а не примитивный тип. какой тип правильный в XDTO-пакете для ссылочных свойств?
3 Вафель
 
24.08.17
13:01
ссылка, а не объект
4 novichok79
 
24.08.17
13:02
(3) если выгружаю свойство типа ссылка, описание объекта подтягивается платформой?
5 novichok79
 
24.08.17
13:04
(3) ссылка - это то что называется Ref в XDTO-пакете EnterpriseData_1_4_3?
6 Вафель
 
24.08.17
13:05
проще попробовать
7 novichok79
 
24.08.17
13:30
(6) делал по аналогии с типовыми XDTO-пакетами в УТ 11, странно, что не получилось также.
8 novichok79
 
24.08.17
13:48
вы чего серьезно, XDTO не пользуетесь?
9 novichok79
 
24.08.17
14:59
прочитал еще раз статьи про XDTO сериализацию, то там нигде не затрагивается момент, что объекты дублируются. если один объект несколько раз присваивать, а не создавать новый, то объект повторяется только в последнем объекте из списка, то есть не вариант.
как вариант - указывать UID вместо ссылок у свойств, а вручную выгружать все объекты, ссылки которых указаны в UID'ах. это почти тоже самое что выгружать вручную, какой от всего этого XDTO профит тогда?
10 quest
 
24.08.17
15:32
когда станешь новичок92 - тогда поймешь
конкретно по вопросу - разберись что такое список и элемент
11 novichok79
 
24.08.17
15:35
(10) ахахах, шутки за 300.
при чем здесь список и элемент? если мне нужно выгрузить объект 1 раз, а далее давать на него ссылки по своей схеме XSD.
12 novichok79
 
24.08.17
15:45
и да при выгрузке через сериализатор XDTO, подтягиваются только ссылки на объекты, а сами объекты не загружаются. то есть надо только со своим пакетом XDTO делать
13 quest
 
24.08.17
15:46
(11) Прочит еще раз (9) и начни думать
(12) зачетно бредишь....
14 novichok79
 
24.08.17
15:49
(13) прямо, внук Петросяна. как я понял, слабо помочь.
15 quest
 
24.08.17
15:51
(14) Почему же? Конкретно для тебя час консультаций- 1000 рублей. А то ты излишне хамоватый новичок
16 novichok79
 
24.08.17
15:52
(15) не переходи на личности, быдло.
17 quest
 
24.08.17
15:53
была бы у тебя личность - может и перешел бы. А так ты - простой хамоватый новичок...
18 novichok79
 
24.08.17
15:54
(17) аххаха, воу воу воу, у нас тут не просто юморист, а еще и доморощенный психиатр. диалог окончен, быдло.
19 quest
 
24.08.17
15:57
новичок :)
20 novichok79
 
24.08.17
16:01
по теме, никто не знает как выгрузить объект 1 раз, а дальше давать ссылку на него? или может быть пример такой выгрузки в типовых?
21 quest
 
24.08.17
16:10
не, никто не знает. это же уникальная задача, новичок. И  в типовых смотреть бесполезно, особенно бесполезно смотреть в БСП, еще бесполезнее смотреть в модуле обмена данными.
22 novichok79
 
24.08.17
16:13
(21) давай конкретику, Петросян. а не кукарей тут.
23 quest
 
24.08.17
16:15
давай 1000 рублей - будет и конкретика для хамоватого новичка :) А то, что-то много ленивых и туповатых новичков развелось...
24 novichok79
 
24.08.17
16:18
(23) ко-ко-ко, 1000 рублей. все понятно. не флуди, придурок.
25 quest
 
24.08.17
16:18
код покажи - что ты там делаешь. а то с объяснением словами у тебя туго.
26 novichok79
 
24.08.17
16:19
(25) конечно, куда уж мне то, до местных знаменитостей )))))
27 quest
 
24.08.17
16:20
т.е. и кода у тебя нет?
28 novichok79
 
24.08.17
16:22
(27) да, пожалуйста.

ПозицияНоменклатурыXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, "ProductRange"));
ПозицияНоменклатурыXDTO.ID = XMLСтрока(ТекущаяПозицияНоменклатуры.УникальныйИдентификатор());

Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.Родитель) Тогда ПозицияНоменклатурыXDTO.FullPath = ВыборкаДанныеНоменклатуры.Родитель.ПолноеНаименование();

Иначе ПозицияНоменклатурыXDTO.FullPath = "";
КонецЕсли;

Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.ЕдиницаИзмерения) Тогда

    ЕдиницаИзмеренияXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, "MeasuringUnits"));

    ЕдиницаИзмеренияXDTO.ID = XMLСтрока(ВыборкаДанныеНоменклатуры.ЕдиницаИзмерения.УникальныйИдентификатор());
    ЕдиницаИзмеренияXDTO.Code = ВыборкаДанныеНоменклатуры.ЕдиницаИзмеренияКод;
    ЕдиницаИзмеренияXDTO.Name = ВыборкаДанныеНоменклатуры.ЕдиницаИзмеренияНаименование;

КонецЕсли;

ПозицияНоменклатурыXDTO.Code = СокрЛП(ВыборкаДанныеНоменклатуры.Код);
ПозицияНоменклатурыXDTO.StockNumber = СокрЛП(ВыборкаДанныеНоменклатуры.Артикул);
ПозицияНоменклатурыXDTO.Name = СокрЛП(ВыборкаДанныеНоменклатуры.Наименование);
ПозицияНоменклатурыXDTO.FullName = СокрЛП(ВыборкаДанныеНоменклатуры.НаименованиеПолное);

Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.ЕдиницаИзмерения) Тогда

    ПозицияНоменклатурыXDTO.MeasuringUnit = ЕдиницаИзмеренияXDTO;

КонецЕсли;
29 novichok79
 
24.08.17
16:24
соответственно, в конце цикла пишется
        СписокНоменклатурыXDTO.Item.Добавить(ПозицияНоменклатурыXDTO);

а после цикла

ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ОткрытьФайл(Объект.ИмяФайлаДляВыгрузки);
ФабрикаXDTO.ЗаписатьJSON(ЗаписьJSON, СписокНоменклатурыXDTO);
ЗаписьJSON.Закрыть();
30 quest
 
24.08.17
16:29
Если все так как ты говоришь то либо Item у тебя не список, либо добавление за концом цикла.

СписокНоменклатурыXDTO.Item.Добавить(ПозицияНоменклатурыXDTO);

Для контроля - попробуй не в json писать, а в xml

И еще - везде у тебя ВыборкаДанныеНоменклатуры, а в id уходит - ТекущаяПозицияНоменклатуры - точно не ошибся?
31 novichok79
 
24.08.17
16:38
(30) вот схема
http://2bay.org/ftp/files/xml_scheme.xsd

>> Для контроля - попробуй не в json писать, а в xml

результат одинаковый.

>> везде у тебя ВыборкаДанныеНоменклатуры, а в id уходит - ТекущаяПозицияНоменклатуры - точно не ошибся?

Пока ВыборкаДанныеНоменклатуры.Следующий() Цикл

ТекущаяПозицияНоменклатуры = ВыборкаДанныеНоменклатуры.Ссылка;
32 quest
 
24.08.17
16:48
код процедуры полностью выложи.
Осталось не провереным 2 предположения - добавление у тебя идет после цикла, или перед добавлением ты каждый раз создаешь ProductList
33 novichok79
 
24.08.17
16:52
единицы измерения - из набора базовых единиц измерения, они не привязаны к номенклатуре и каждую из них можно выгрузить всего 1 раз, чего я и хочу сделать. а получается что в списке 10 позиций номенклатуры и единица измерения "шт" выгрузилась 10 раз.
в итоге, не хотелось так делать, но придется, Item сделаю свойством составного типа, куда буду закидывать поочередно объекты ссылочных типов, которые используются в позиции номенклатуры, а в свойства самой номенклатуры кидать UID'ы выгруженных ранее единиц измерения и. т. д.
34 novichok79
 
24.08.17
16:53
ну... вы хотели пати... вот вам, нате:

    ИмяПространстваИмен = "http://www.mista.ru";;
    СписокНоменклатурыXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, "ProductList"));

    Пока ВыборкаДанныеНоменклатуры.Следующий() Цикл

        ТекущаяПозицияНоменклатуры = ВыборкаДанныеНоменклатуры.Ссылка;

        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоИндивидуальный);
        
        ЗначениеИндивидуальныйНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеИндивидуальный = РезультатПоиска.НайденноеЗначение;

        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСпецификацияЗнака);
        
        ЗначениеСпецификацияЗнакаНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСпецификацияЗнака = РезультатПоиска.НайденноеЗначение;
        
        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСпецификацияКанта);
        
        ЗначениеСпецификацияКантаНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСпецификацияКанта = РезультатПоиска.НайденноеЗначение;
        
        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСпецификацияКрепления);

        ЗначениеСпецификацияКрепленияНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСпецификацияКрепления = РезультатПоиска.НайденноеЗначение;
        
        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСпецификацияОсновы);

        ЗначениеСпецификацияОсновыНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСпецификацияОсновы = РезультатПоиска.НайденноеЗначение;
        
        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСпецификацияПрофиля);

        ЗначениеСпецификацияПрофиляНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСпецификацияПрофиля = РезультатПоиска.НайденноеЗначение;

        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСпецификацияРазмера);

        ЗначениеСпецификацияРазмераНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСпецификацияРазмера = РезультатПоиска.НайденноеЗначение;

        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСпецификацияТипаПленки);

        ЗначениеСпецификацияТипаПленкиНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСпецификацияТипаПленки = РезультатПоиска.НайденноеЗначение;

        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСпецификацияФона);

        ЗначениеСпецификацияФонаНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСпецификацияФона = РезультатПоиска.НайденноеЗначение;

        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСтрочкаКлиента);

        ЗначениеСтрочкаКлиентаНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСтрочкаКлиента = РезультатПоиска.НайденноеЗначение;

        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоДополнение);

        ЗначениеДополнениеНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеДополнение = РезультатПоиска.НайденноеЗначение;

        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоВыпрямитель);

        ЗначениеВыпрямительНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеВыпрямитель = РезультатПоиска.НайденноеЗначение;

        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСтарыйКод);

        ЗначениеСтарыйКодНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСтарыйКод = РезультатПоиска.НайденноеЗначение;

        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСтароеНаименование);

        ЗначениеСтароеНаименованиеНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСтароеНаименование = РезультатПоиска.НайденноеЗначение;

        РезультатПоиска = ПолучитьЗначениеДополнительногоРеквизита(ТекущаяПозицияНоменклатуры, Объект.СвойствоСтароеНаименованиеПолное);

        ЗначениеСтароеНаименованиеПолноеНайдено = РезультатПоиска.ЗначениеНайдено;
        ЗначениеСтароеНаименованиеПолное = РезультатПоиска.НайденноеЗначение;

        Вес = ?(ВыборкаДанныеНоменклатуры.ВесЗнаменатель = 0, 0, ВыборкаДанныеНоменклатуры.ВесЧислитель / ВыборкаДанныеНоменклатуры.ВесЗнаменатель);
        Объем = ?(ВыборкаДанныеНоменклатуры.ОбъемЗнаменатель = 0, 0, ВыборкаДанныеНоменклатуры.ОбъемЧислитель / ВыборкаДанныеНоменклатуры.ОбъемЗнаменатель);
        
        ПозицияНоменклатурыXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, "ProductRange"));

        ПозицияНоменклатурыXDTO.ID = XMLСтрока(ТекущаяПозицияНоменклатуры.УникальныйИдентификатор());
        
        Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.Родитель) Тогда
            
            ПозицияНоменклатурыXDTO.FullPath = ВыборкаДанныеНоменклатуры.Родитель.ПолноеНаименование();
            
        Иначе ПозицияНоменклатурыXDTO.FullPath = "";
        КонецЕсли;
        
        Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.ЕдиницаИзмерения) Тогда
            
            ЕдиницаИзмеренияXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, "MeasuringUnits"));
            
            ЕдиницаИзмеренияXDTO.ID = XMLСтрока(ВыборкаДанныеНоменклатуры.ЕдиницаИзмерения.УникальныйИдентификатор());
            ЕдиницаИзмеренияXDTO.Code = ВыборкаДанныеНоменклатуры.ЕдиницаИзмеренияКод;
            ЕдиницаИзмеренияXDTO.Name = ВыборкаДанныеНоменклатуры.ЕдиницаИзмеренияНаименование;
            
        КонецЕсли;

        Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.ВесЕдиницаИзмерения) Тогда
            
            ВесЕдиницаИзмеренияXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, "MeasuringUnits"));
            
            ВесЕдиницаИзмеренияXDTO.ID = XMLСтрока(ВыборкаДанныеНоменклатуры.ВесЕдиницаИзмерения.УникальныйИдентификатор());
            ВесЕдиницаИзмеренияXDTO.Code = ВыборкаДанныеНоменклатуры.ВесЕдиницаИзмеренияКод;
            ВесЕдиницаИзмеренияXDTO.Name = ВыборкаДанныеНоменклатуры.ВесЕдиницаИзмеренияНаименование;
            
        КонецЕсли;

        Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.ОбъемЕдиницаИзмерения) Тогда
            
            ОбъемЕдиницаИзмеренияXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, "MeasuringUnits"));
            
            ОбъемЕдиницаИзмеренияXDTO.ID = XMLСтрока(ВыборкаДанныеНоменклатуры.ОбъемЕдиницаИзмерения.УникальныйИдентификатор());
            ОбъемЕдиницаИзмеренияXDTO.Code = ВыборкаДанныеНоменклатуры.ОбъемЕдиницаИзмеренияКод;
            ОбъемЕдиницаИзмеренияXDTO.Name = ВыборкаДанныеНоменклатуры.ОбъемЕдиницаИзмеренияНаименование;
            
        КонецЕсли;

        ПозицияНоменклатурыXDTO.Code = СокрЛП(ВыборкаДанныеНоменклатуры.Код);
        ПозицияНоменклатурыXDTO.StockNumber = СокрЛП(ВыборкаДанныеНоменклатуры.Артикул);
        ПозицияНоменклатурыXDTO.Name = СокрЛП(ВыборкаДанныеНоменклатуры.Наименование);
        ПозицияНоменклатурыXDTO.FullName = СокрЛП(ВыборкаДанныеНоменклатуры.НаименованиеПолное);
        
        Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.ТипНоменклатуры) Тогда
            
            ПозицияНоменклатурыXDTO.ItemType = XMLСтрока(ВыборкаДанныеНоменклатуры.ТипНоменклатуры);
        
        КонецЕсли;
        
        Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.ЕдиницаИзмерения) Тогда
            
            ПозицияНоменклатурыXDTO.MeasuringUnit = ЕдиницаИзмеренияXDTO;
            
        КонецЕсли;
        
        ПозицияНоменклатурыXDTO.WeightUsage = ВыборкаДанныеНоменклатуры.ВесИспользовать;
        
        Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.ВесЕдиницаИзмерения) Тогда
            
            ПозицияНоменклатурыXDTO.WeightMeasuringUnit = ВесЕдиницаИзмеренияXDTO;
            
        КонецЕсли;
        
        ПозицияНоменклатурыXDTO.Weight = Вес;
        ПозицияНоменклатурыXDTO.VolumeUsage = ВыборкаДанныеНоменклатуры.ОбъемИспользовать;
        
        Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.ОбъемЕдиницаИзмерения) Тогда
            
            ПозицияНоменклатурыXDTO.VolumeMeasuringUnit = ОбъемЕдиницаИзмеренияXDTO;
            
        КонецЕсли;

        ПозицияНоменклатурыXDTO.Volume = Объем;

        ПозицияНоменклатурыXDTO.Individual = ?(ЗначениеИндивидуальныйНайдено, ЗначениеИндивидуальный, Ложь);
        
        ТекущееИмяСвойстваНоменклатуры = "ProductSpecification";
        ТекущееИмяТипа = "ProductSpecifications";
        ТекущееЗначениеНайдено = ЗначениеСпецификацияЗнакаНайдено;
        ТекущееЗначение = ЗначениеСпецификацияЗнака;

        Если ТекущееЗначениеНайдено И ЗначениеЗаполнено(ТекущееЗначение) Тогда

            РеквизитыТекущегоСвойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекущееЗначение, "Код, Наименование, НаименованиеДляПечати, НаименованиеДляПоиска");

            ТекущееЗначениеXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, ТекущееИмяТипа));

            ТекущееЗначениеXDTO.ID = XMLСтрока(ТекущееЗначение.УникальныйИдентификатор());
            ТекущееЗначениеXDTO.Code = РеквизитыТекущегоСвойства.Код;
            ТекущееЗначениеXDTO.Name = РеквизитыТекущегоСвойства.Наименование;
            ТекущееЗначениеXDTO.FullName = РеквизитыТекущегоСвойства.НаименованиеДляПечати;
            ТекущееЗначениеXDTO.SearchingName = РеквизитыТекущегоСвойства.НаименованиеДляПоиска;

            ПозицияНоменклатурыXDTO[ТекущееИмяСвойстваНоменклатуры] = ТекущееЗначениеXDTO;

        КонецЕсли;

        ТекущееИмяСвойстваНоменклатуры = "Edging";
        ТекущееИмяТипа = "Edgings";
        ТекущееЗначениеНайдено = ЗначениеСпецификацияКантаНайдено;
        ТекущееЗначение = ЗначениеСпецификацияКанта;

        Если ТекущееЗначениеНайдено И ЗначениеЗаполнено(ТекущееЗначение) Тогда

            РеквизитыТекущегоСвойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекущееЗначение, "Код, Наименование, НаименованиеДляПечати, НаименованиеДляПоиска");

            ТекущееЗначениеXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, ТекущееИмяТипа));

            ТекущееЗначениеXDTO.ID = XMLСтрока(ТекущееЗначение.УникальныйИдентификатор());
            ТекущееЗначениеXDTO.Code = РеквизитыТекущегоСвойства.Код;
            ТекущееЗначениеXDTO.Name = РеквизитыТекущегоСвойства.Наименование;
            ТекущееЗначениеXDTO.FullName = РеквизитыТекущегоСвойства.НаименованиеДляПечати;
            ТекущееЗначениеXDTO.SearchingName = РеквизитыТекущегоСвойства.НаименованиеДляПоиска;

            ПозицияНоменклатурыXDTO[ТекущееИмяСвойстваНоменклатуры] = ТекущееЗначениеXDTO;

        КонецЕсли;
        
        ТекущееИмяСвойстваНоменклатуры = "Fixturing";
        ТекущееИмяТипа = "Fixturings";
        ТекущееЗначениеНайдено = ЗначениеСпецификацияКрепленияНайдено;
        ТекущееЗначение = ЗначениеСпецификацияКрепления;
        
        Если ТекущееЗначениеНайдено И ЗначениеЗаполнено(ТекущееЗначение) Тогда
            
            РеквизитыТекущегоСвойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекущееЗначение, "Код, Наименование, НаименованиеДляПечати, НаименованиеДляПоиска");
            
            ТекущееЗначениеXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, ТекущееИмяТипа));
            
            ТекущееЗначениеXDTO.ID = XMLСтрока(ТекущееЗначение.УникальныйИдентификатор());
            ТекущееЗначениеXDTO.Code = РеквизитыТекущегоСвойства.Код;
            ТекущееЗначениеXDTO.Name = РеквизитыТекущегоСвойства.Наименование;
            ТекущееЗначениеXDTO.FullName = РеквизитыТекущегоСвойства.НаименованиеДляПечати;
            ТекущееЗначениеXDTO.SearchingName = РеквизитыТекущегоСвойства.НаименованиеДляПоиска;
            
            ПозицияНоменклатурыXDTO[ТекущееИмяСвойстваНоменклатуры] = ТекущееЗначениеXDTO;
            
        КонецЕсли;
        
        ТекущееИмяСвойстваНоменклатуры = "BasicMaterial";
        ТекущееИмяТипа = "Materials";
        ТекущееЗначениеНайдено = ЗначениеСпецификацияОсновыНайдено;
        ТекущееЗначение = ЗначениеСпецификацияОсновы;

        Если ТекущееЗначениеНайдено И ЗначениеЗаполнено(ТекущееЗначение) Тогда
            
            РеквизитыТекущегоСвойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекущееЗначение, "Код, Наименование, НаименованиеДляПечати, НаименованиеДляПоиска");
            
            ТекущееЗначениеXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, ТекущееИмяТипа));
            
            ТекущееЗначениеXDTO.ID = XMLСтрока(ТекущееЗначение.УникальныйИдентификатор());
            ТекущееЗначениеXDTO.Code = РеквизитыТекущегоСвойства.Код;
            ТекущееЗначениеXDTO.Name = РеквизитыТекущегоСвойства.Наименование;
            ТекущееЗначениеXDTO.FullName = РеквизитыТекущегоСвойства.НаименованиеДляПечати;
            ТекущееЗначениеXDTO.SearchingName = РеквизитыТекущегоСвойства.НаименованиеДляПоиска;
            
            ПозицияНоменклатурыXDTO[ТекущееИмяСвойстваНоменклатуры] = ТекущееЗначениеXDTO;
            
        КонецЕсли;
        
        ТекущееИмяСвойстваНоменклатуры = "Profile";
        ТекущееИмяТипа = "Profiles";
        ТекущееЗначениеНайдено = ЗначениеСпецификацияПрофиляНайдено;
        ТекущееЗначение = ЗначениеСпецификацияПрофиля;

        Если ТекущееЗначениеНайдено И ЗначениеЗаполнено(ТекущееЗначение) Тогда
            
            РеквизитыТекущегоСвойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекущееЗначение, "Код, Наименование, НаименованиеДляПечати, НаименованиеДляПоиска");
            
            ТекущееЗначениеXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, ТекущееИмяТипа));
            
            ТекущееЗначениеXDTO.ID = XMLСтрока(ТекущееЗначение.УникальныйИдентификатор());
            ТекущееЗначениеXDTO.Code = РеквизитыТекущегоСвойства.Код;
            ТекущееЗначениеXDTO.Name = РеквизитыТекущегоСвойства.Наименование;
            ТекущееЗначениеXDTO.FullName = РеквизитыТекущегоСвойства.НаименованиеДляПечати;
            ТекущееЗначениеXDTO.SearchingName = РеквизитыТекущегоСвойства.НаименованиеДляПоиска;
            
            ПозицияНоменклатурыXDTO[ТекущееИмяСвойстваНоменклатуры] = ТекущееЗначениеXDTO;
            
        КонецЕсли;
        
        ТекущееИмяСвойстваНоменклатуры = "FilmType";
        ТекущееИмяТипа = "FilmTypes";
        ТекущееЗначениеНайдено = ЗначениеСпецификацияТипаПленкиНайдено;
        ТекущееЗначение = ЗначениеСпецификацияТипаПленки;

        Если ТекущееЗначениеНайдено И ЗначениеЗаполнено(ТекущееЗначение) Тогда
            
            РеквизитыТекущегоСвойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекущееЗначение, "Код, Наименование, НаименованиеДляПечати, НаименованиеДляПоиска");
            
            ТекущееЗначениеXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, ТекущееИмяТипа));
            
            ТекущееЗначениеXDTO.ID = XMLСтрока(ТекущееЗначение.УникальныйИдентификатор());
            ТекущееЗначениеXDTO.Code = РеквизитыТекущегоСвойства.Код;
            ТекущееЗначениеXDTO.Name = РеквизитыТекущегоСвойства.Наименование;
            ТекущееЗначениеXDTO.FullName = РеквизитыТекущегоСвойства.НаименованиеДляПечати;
            ТекущееЗначениеXDTO.SearchingName = РеквизитыТекущегоСвойства.НаименованиеДляПоиска;
            
            ПозицияНоменклатурыXDTO[ТекущееИмяСвойстваНоменклатуры] = ТекущееЗначениеXDTO;
            
        КонецЕсли;
        
        ТекущееИмяСвойстваНоменклатуры = "BackgroundColor";
        ТекущееИмяТипа = "BackgroundColors";
        ТекущееЗначениеНайдено = ЗначениеСпецификацияФонаНайдено;
        ТекущееЗначение = ЗначениеСпецификацияФона;

        Если ТекущееЗначениеНайдено И ЗначениеЗаполнено(ТекущееЗначение) Тогда
            
            РеквизитыТекущегоСвойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекущееЗначение, "Код, Наименование, НаименованиеДляПечати, НаименованиеДляПоиска");
            
            ТекущееЗначениеXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, ТекущееИмяТипа));
            
            ТекущееЗначениеXDTO.ID = XMLСтрока(ТекущееЗначение.УникальныйИдентификатор());
            ТекущееЗначениеXDTO.Code = РеквизитыТекущегоСвойства.Код;
            ТекущееЗначениеXDTO.Name = РеквизитыТекущегоСвойства.Наименование;
            ТекущееЗначениеXDTO.FullName = РеквизитыТекущегоСвойства.НаименованиеДляПечати;
            ТекущееЗначениеXDTO.SearchingName = РеквизитыТекущегоСвойства.НаименованиеДляПоиска;
            
            ПозицияНоменклатурыXDTO[ТекущееИмяСвойстваНоменклатуры] = ТекущееЗначениеXDTO;
            
        КонецЕсли;

        ТекущееИмяСвойстваНоменклатуры = "Dimensions";
        ТекущееИмяТипа = "Dimensions";
        ТекущееЗначениеНайдено = ЗначениеСпецификацияРазмераНайдено;
        ТекущееЗначение = ЗначениеСпецификацияРазмера;

        Если ТекущееЗначениеНайдено И ЗначениеЗаполнено(ТекущееЗначение) Тогда
            
            РеквизитыТекущегоСвойства = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ТекущееЗначение, "Код, Наименование, ФормаЗнака, ПервоеИзмерение, ВтороеИзмерение");
            
            ТекущееЗначениеXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, ТекущееИмяТипа));
            
            ТекущееЗначениеXDTO.ID = XMLСтрока(ТекущееЗначение.УникальныйИдентификатор());
            ТекущееЗначениеXDTO.Code = РеквизитыТекущегоСвойства.Код;
            ТекущееЗначениеXDTO.Name = РеквизитыТекущегоСвойства.Наименование;
            
            Если ЗначениеЗаполнено(РеквизитыТекущегоСвойства.ФормаЗнака) Тогда
                
                ТекущееЗначениеXDTO.ProductShape = XMLСтрока(РеквизитыТекущегоСвойства.ФормаЗнака);
                
            КонецЕсли;
            
            ТекущееЗначениеXDTO.FirstDimension = РеквизитыТекущегоСвойства.ПервоеИзмерение;
            ТекущееЗначениеXDTO.SecondDimension = РеквизитыТекущегоСвойства.ВтороеИзмерение;

            ПозицияНоменклатурыXDTO[ТекущееИмяСвойстваНоменклатуры] = ТекущееЗначениеXDTO;
            
        КонецЕсли;

        ПозицияНоменклатурыXDTO.CustomerTextString = ?(ЗначениеСтрочкаКлиентаНайдено, ЗначениеСтрочкаКлиента, Ложь);
        ПозицияНоменклатурыXDTO.AdditionalText = ?(ЗначениеДополнениеНайдено, ЗначениеДополнение, "");
        ПозицияНоменклатурыXDTO.RectificationIsRequired = ?(ЗначениеВыпрямительНайдено, ЗначениеВыпрямитель, Ложь);
        ПозицияНоменклатурыXDTO.OldCode = ?(ЗначениеСтарыйКодНайдено, ЗначениеСтарыйКод, "");
        ПозицияНоменклатурыXDTO.OldName = ?(ЗначениеСтароеНаименованиеНайдено, ЗначениеСтароеНаименование, "");
        ПозицияНоменклатурыXDTO.OldFullName = ?(ЗначениеСтароеНаименованиеПолноеНайдено, ЗначениеСтароеНаименованиеПолное, "");

        СписокНоменклатурыXDTO.Item.Добавить(ПозицияНоменклатурыXDTO);

    КонецЦикла;

    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.ОткрытьФайл(Объект.ИмяФайлаДляВыгрузки);
    ФабрикаXDTO.ЗаписатьJSON(ЗаписьJSON, СписокНоменклатурыXDTO);
    ЗаписьJSON.Закрыть();
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(СтрЗаменить(Объект.ИмяФайлаДляВыгрузки, "json", "xml"));
    ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, СписокНоменклатурыXDTO);
    ЗаписьXML.Закрыть();
35 quest
 
24.08.17
16:55
где-то в начале -
ВыгруженныеЕдиницы = новый соответсвие;

Если ЗначениеЗаполнено(ВыборкаДанныеНоменклатуры.ЕдиницаИзмерения) Тогда
    
    ЕдиницаИзмеренияXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ИмяПространстваИмен, "MeasuringUnits"));
    если ВыгруженныеЕдиницы[ВыборкаДанныеНоменклатуры.ЕдиницаИзмерения] = неопределено тогда
        ЕдиницаИзмеренияXDTO.ID = XMLСтрока(ВыборкаДанныеНоменклатуры.ЕдиницаИзмерения.УникальныйИдентификатор());
        ЕдиницаИзмеренияXDTO.Code = ВыборкаДанныеНоменклатуры.ЕдиницаИзмеренияКод;
        ЕдиницаИзмеренияXDTO.Name = ВыборкаДанныеНоменклатуры.ЕдиницаИзмеренияНаименование;
        
        ВыгруженныеЕдиницы[ВыборкаДанныеНоменклатуры.ЕдиницаИзмерения] = ЕдиницаИзмеренияXDTO.ID;
    иначе
        ЕдиницаИзмеренияXDTO.ID = ВыгруженныеЕдиницы[ВыборкаДанныеНоменклатуры.ЕдиницаИзмерения];
    конецесли
КонецЕсли;
36 novichok79
 
24.08.17
16:57
(35) тоже так думал сделать, но не сделал потому что на ИС в публикации XDTO - это просто написано следующее:

В приведенном примере кода объект Сообщение создается 2 раза. Угадайте, что будет, если убрать вторую строчку “Сообщение = ФабрикаXDTO.Создать”? А будет вот что:

После добавления первого сообщения пакет сообщений содержит 1 элемент. После второго добавления в дерево будет добавлен еще раз тот же самый объект. Загадка: сколько объектов "Сообщение" будет записано в файл XML?

Будет записан только один объект. И этот эффект абсолютно нигде не документирован. Происходит следующее: объект XDTO представляет собой единый граф XML документа. Т.е. все вложенные элементы уникальны, и по объекту XDTO можно гулять вверх-вниз, определяя, какой XML записан выше или ниже объекта. Если мы возьмем объект Message, который уже помещен внутрь списка и присвоим его куда-то еще (например в другой список) то он удалится из первого списка. Объект уникален. Он не будет скопирован в другое место, он будет перемещен, а его связи перестроены.

Еще один пример. Есть тип “Должность” со свойствами “Название” и “Оклад”.

Записываем список сотрудников, где все они имеют должность “Рабочий”

ДолжностьРабочий = СоздатьДолжностьXDTO(); // Фабрика.Создать(.. ля-ля-ля);
СписокСотрудников = СоздатьСписокСотрудников(); // Фабрика.Создать(.. "НекийСписок")
Для Каждого Сотрудник Из Сотрудники Цикл

    xdtoСотрудник = ФабрикаXDTO.Создать("namespace","Сотрудник");
    xdtoСотрудник.Должность = ДолжностьРабочий; // Это всегда один и тот же объект
    СписокСотрудников.Добавить(xdtoСотрудник);

КонецЦикла;
ФабрикаXDTO.Записать(ЗаписьXML, СписокСотрудников);

Объект “ДолжностьРабочий” будет гулять от сотрудника к сотруднику, и должность окажется назначенной только у последнего в списке. У всех остальных Должность будет пустой, т.к. она по очереди “перепрыгнула” от одного к другому.
37 quest
 
24.08.17
16:59
но потом при загрузке тебе анализировать придется что ты там грузишь.

И еще - XDTO ничем не отличается от структуры - проще собрать все на примитивах и потом отобразить в xml
38 quest
 
24.08.17
17:07
и кстати, смысл экономить байтики? при загрузке будет сложнее.
39 novichok79
 
24.08.17
18:50
(37) Не могу ничего сказать, но если я выгружаю таблицу ссылок, при использовании ЗаписатьXDTO сохранится та же таблица ссылок что и через ЗаписатьJSON, ЗаписатьXML. Объекты все равно придется вручную грузить в тот же результирующий файлик, вместе с таблицей ссылок.
(38) Размер JSON файла из 8000 позиций номенклатуры получился 19 Мб, мне показалось, что логично будет как-то оптимизировать данные.
40 quest
 
24.08.17
20:43
если разовая обработка - нефиг и париться из-за объема
если же на постоянной основе - то надо схему обмена переделывать.
41 novichok79
 
24.08.17
22:18
(40) обработка на постоянной основе. схема обмена сейчас в разработке с программистом, который делает сайт, так что успею еще допилить файл.
42 quest
 
25.08.17
08:08
у меня длля такого обмена сделано 2 метода - 1 возвращает все изменения и отдает ссылки. На стороне сайта есть мелка БД где при загрузке смотрят - есть ссылка или нет, и если ссылки нет запрашивают объект отдельным запросом.
Основная проблема в этом была программиста который делал сайт убедить что так проще для всех
43 novichok79
 
25.08.17
08:41
(42) сложновато как-то, но в целом понятно.