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