|
При копировании ТЗ не копируются вложенные ТЗ | ☑ | ||
---|---|---|---|---|
0
NcSteel
23.05.13
✎
19:58
|
Пример:
ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("ТЗКолонка", Новый ОписаниеТипов("ТаблицаЗначений")); ТЗКолонка = Новый ТаблицаЗначений; ТЗКОлонка.Колонка.Добавить("Колонка1"); СтрокаТЗ = ТЗ.Добавить(); СтрокаТЗ.ТЗКолонка = ТЗКОлонка; ТЗКопия = ТЗ.Скопировать(); ТЗ[0].ТЗКолонка.Колонки.Добавить("Колонка2"); ТЗКолонка[0].ТЗКолонка.Колонки.Колонка2 - появится такая колонка. Тоесть при копировании ТЗ вложенные ТЗ не копируются и остается ссылка. Или я не туда смотрю. |
|||
1
NcSteel
23.05.13
✎
19:59
|
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ТЗКолонка", Новый ОписаниеТипов("ТаблицаЗначений")); ТЗКолонка = Новый ТаблицаЗначений; ТЗКОлонка.Колонка.Добавить("Колонка1"); СтрокаТЗ = ТЗ.Добавить(); СтрокаТЗ.ТЗКолонка = ТЗКОлонка; ТЗКопия = ТЗ.Скопировать(); ТЗКопия[0].ТЗКолонка.Колонки.Добавить("Колонка2"); Поправленный пример ))) |
|||
2
NcSteel
23.05.13
✎
20:01
|
При этом ТЗ[0].ТЗКолонка.Колонка2 - появится такая колонка.
|
|||
3
Лефмихалыч
23.05.13
✎
20:01
|
(0) агрегатные объекты не копируются. Присваивается ссылка на правое пот "=" значение
|
|||
4
NcSteel
23.05.13
✎
20:02
|
(3) ТЗ.Скопировать() создает копию объекта.
Описание: Создает копию исходной таблицы значений. |
|||
5
Лефмихалыч
23.05.13
✎
20:02
|
Если бы копировались
|
|||
6
Лефмихалыч
23.05.13
✎
20:03
|
(4) не доэтовайся до слов - я имел в виду, что присваивание не копирует агрегатные объекты
|
|||
7
NcSteel
23.05.13
✎
20:04
|
(6) У мну тут и нет присваивания.
|
|||
8
NcSteel
23.05.13
✎
20:06
|
Логика программы понятна, что если мы копируем ТЗ, то колонки содержащие ссылки на Справочники не создают копию данных. То есть в справочнике не появится новая ссылка.
Но не ожидал данного поведения от коллекций вложенных. |
|||
9
NcSteel
23.05.13
✎
20:07
|
(8) + Такого например не происходит в дереве значений, хотя надо проверить.
|
|||
10
NcSteel
23.05.13
✎
20:09
|
(9) То есть
Дерево = Новый ДеревоЗначений; ...... ДеревоКопия = Дерево.Скопировать() Тоесть в данном случае скопируются и вложенные ТЗ.... |
|||
11
Лефмихалыч
23.05.13
✎
20:09
|
(8) а там логика та же - ссылка, она ссылка и есть. Присваивание одной ссылки другой не должно дублить объект, иначе будет ад и израиль и ни какие сборщики мусора не спасут
|
|||
12
Лефмихалыч
23.05.13
✎
20:10
|
(10) не верю
|
|||
13
NcSteel
23.05.13
✎
20:10
|
(11) Я бы не чертыхался, если бы с деревом значений было бы так же. Но тут же явное противоречие )))
|
|||
14
NcSteel
23.05.13
✎
20:12
|
(12)
Дерево = Новый ДеревоЗначений; Дерево.Колонки.Добавить("Колонка1"); НоваяСтрока = Дерево.Строки.Добавить(); КопияДерева = Дерево.Скопировать(); КопияДерева.Колонки.Добавить("Колонка2"); В данном случае в первом дереве не появится колонка. |
|||
15
Ненавижу 1С
гуру
23.05.13
✎
20:12
|
(13) брехло?
|
|||
16
NcSteel
23.05.13
✎
20:13
|
(15)
ДеревоЗначений.Скопировать (ValueTree.Copy) ДеревоЗначений (ValueTree) Скопировать (Copy) Синтаксис: Скопировать() Возвращаемое значение: Тип: ДеревоЗначений. Описание: Создает полную копию исходного дерева значений. Доступность: Сервер, толстый клиент, внешнее соединение. Пример: // ДеревоСостава имеет тип ДеревоЗначений НовоеДеревоСостава = ДеревоСостава.Скопировать(); |
|||
17
Ненавижу 1С
гуру
23.05.13
✎
20:13
|
(14) и в ТЗ не появится так,т ты пойми разницу!
|
|||
18
NcSteel
23.05.13
✎
20:15
|
(17) Появится. Суть в том что в дереве каждый вложенный уровень это ТЗ. И при копировании дерева , так же копируются вложенные ТЗ.
Но Дерево не всегда удобно, когда надо произвольные колонки использовать на разных уровнях вложенности. |
|||
19
Лефмихалыч
23.05.13
✎
20:18
|
(18) >в дереве каждый вложенный уровень это ТЗ
это утверждение по меньшей мере спорно, шопестец |
|||
20
NcSteel
23.05.13
✎
20:21
|
В общем видна не доработка, да ТЗ не простой тип, а коллекция. Видимо при копировании ТЗ выполняется подобный алгоритм:
Для Каждого СтрокаТЗ Из ИсходнаяТЗ Цикл СтрокаНовойТЗ = НоваяТЗ.Добавить(); ЗаполнитьЗначениеСвойств(СтрокаНовойТЗ, СтрокаТЗ); КонецЦикла; Тогда как в Дереве скурпулезно копируется и содержимое структуры дерева. |
|||
21
NcSteel
23.05.13
✎
20:21
|
(19) Я утрировал, но суть в том , что это "КОЛЛЕКЦИЯ"
|
|||
22
Chai Nic
23.05.13
✎
20:23
|
Вот так с гарантией создает полную копию. Со всеми вложенными объектами.
КопияПолная=ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(ИсходнаяТаблица)) |
|||
23
NcSteel
23.05.13
✎
20:25
|
(22) Мастер... )
|
|||
24
NcSteel
23.05.13
✎
20:29
|
Жаль я не ИЗ, так бы добавил в книгу знаний.
|
|||
25
Лефмихалыч
23.05.13
✎
20:36
|
(0) если эксперимент дает неожиданные результаты, значит надо было чище мыть пробирки.
Вот такой код:
|
|||
26
NcSteel
23.05.13
✎
20:39
|
(25) Ты не понял о чем я. Жаль.
|
|||
27
Лефмихалыч
23.05.13
✎
20:39
|
(22) могу пару гарантийных случаев подкинуть, надо?
|
|||
28
NcSteel
23.05.13
✎
20:39
|
(27) Давай.
|
|||
29
Лефмихалыч
23.05.13
✎
20:40
|
(28) любой объект прикладного объекта
|
|||
30
Лефмихалыч
23.05.13
✎
20:41
|
ну, то есть, например Справочники.Номенклаура.СоздатьЭлемент(), если его ту-сюда через строкувнутр прогнать, восстановится в Неопределено
|
|||
31
Лефмихалыч
23.05.13
✎
20:42
|
COMОбъекты еще
|
|||
32
NcSteel
23.05.13
✎
20:48
|
(29) ТаблицаЗначение = Новый ТаблицаЗначений;
ТаблицаЗначение.Колонки.Добавить("КолонкаОбъект", Новый ОписаниеТипов("СправочникОбъект.Номенклатура")); НоваяСТрока = ТаблицаЗначение.Добавить(); НоваяСтрока.КолонкаОбъект = Реквизит1.ПолучитьОбъект(); КопияТЗ = ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(ТаблицаЗначение)); Да, не восстанавливает. В моем случае таких объектов не будет, так что прокатит. Можно конечно через XML серелизовать. |
|||
35
Chai Nic
23.05.13
✎
21:11
|
(29) Ну, об объектах базы данных речи не идет, разумеется.
|
|||
36
Torquader
24.05.13
✎
00:19
|
Ребята! А что вы хотите, у вас есть объект, в полях которого записаны ссылки на другие объекты.
Когда вы просите систему скопировать объект, то она создаёт новый объект, а все поля заполняет через присваивание. А у вас же при присваивании объект не копируется. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |