|
как при сериализации выгружать в свойство только ссылку, а не полностью объект, | ☑ | ||
---|---|---|---|---|
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) сложновато как-то, но в целом понятно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |