Имя: Пароль:
1C
1С v8
При копировании ТЗ не копируются вложенные ТЗ
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
Если бы копировались

Объект1 = Справочники.Номенклатура.НайтиПоКоду("Ы");
Объект2 = Объект1; // то вот это приводило бы к появлению нового объекта
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) если эксперимент дает неожиданные результаты, значит надо было чище мыть пробирки.
Вот такой код:

Дерево1 = Новый ДеревоЗначений;
Дерево1.Колонки.Добавить("ВложеннаяТаблица");

Строка = Дерево1.Строки.Добавить();
Строка.ВложеннаяТаблица = Новый ТаблицаЗначений;
Строка.ВложеннаяТаблица.Колонки.Добавить("Колонка1");

Дерево2 = Дерево1.Скопировать();
Дерево2.Строки[0].ВложеннаяТаблица.Колонки.Добавить("Колонка2");

Таблица1 = Новый ТаблицаЗначений;
Таблица1.Колонки.Добавить("ВложеннаяТаблица");
Строка = Таблица1.Добавить();
Строка.ВложеннаяТаблица = Новый ТаблицаЗначений;
Строка.ВложеннаяТаблица.Колонки.Добавить("Колонка1");

Таблица2 = Таблица1.Скопировать();
Таблица2[0].ВложеннаяТаблица.Колонки.Добавить("Колонка2");

ОбъектыПроверки = Новый Структура("Дерево1,Дерево2,Таблица1,Таблица2",Дерево1.Строки,Дерево2.Строки,Таблица1,Таблица2);

Для каждого КлючЗначение Из ОбъектыПроверки Цикл

   Сообщить(""+КлючЗначение.Ключ+" >>");
   Для каждого Колонка Из КлючЗначение.Значение[0].ВложеннаяТаблица.Колонки Цикл
   
       Сообщить("    "+Колонка.Имя);    
   
   КонецЦикла;

КонецЦикла;
[\1C]
выводит такой результат

Дерево1 >>
   Колонка1
   Колонка2
Дерево2 >>
   Колонка1
   Колонка2
Таблица1 >>
   Колонка1
   Колонка2
Таблица2 >>
   Колонка1
   Колонка2
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
Ребята! А что вы хотите, у вас есть объект, в полях которого записаны ссылки на другие объекты.
Когда вы просите систему скопировать объект, то она создаёт новый объект, а все поля заполняет через присваивание.
А у вас же при присваивании объект не копируется.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой