Имя: Пароль:
1C
1С v8
Чудеса с таблицами значений
0 Dmitriy_
Kolesnikov
 
22.11.19
13:23
Пусть есть ТЗ, её колонка Территории имеет тип ТаблицаЗначений и содержит какую-то таблицу (таблица в ячейке таблицы). Допустим, изначально ТЗ[0].Территории[0].Результат = 5.
Теперь делаем так:
ТЗ_2 = ТЗ;
СтрокаТЗ_2 = ТЗ_2[0];
СтрокаТЗ_2.Территории[0].Результат = 0;
И тут оказывается, что ТЗ[0].Территории[0].Результат = 0!
Почему так?
Пробовал даже ТЗ_2 = ТЗ.Копировать(); - иногда помогает, иногда нет. Пока не выявил закономерность.
Платформа 8.3.14.1779
1 dka80
 
22.11.19
13:24
ТЗ_2 = ТЗ;
В ТЗ_2 будут ссылки на ТЗ. Так делать нельзя. Нужно ТЗ_2 = ТЗ.Копировать()
Почему не помогает - значит еще где-то накосячил
2 Garykom
 
гуру
22.11.19
13:26
(0) ГЫгы
3 Garykom
 
гуру
22.11.19
13:28
4 Garykom
 
гуру
22.11.19
13:29
(3)+ Ну и https://its.1c.ru/db/metod8dev#content:2606:hdoc для общего развития
И подумай чем это похоже на твой случай
5 Ёпрст
 
гуру
22.11.19
13:33
(0) ты присвоил переменной ТЗ_2  ссылку на ТЗ, теперь обе переменные ссылаются на один и тот же объект.
6 Dmitriy_
Kolesnikov
 
22.11.19
13:34
(3) спасибо, сейчас буду читать.
Вообще-то это не я накосячил, а пейсатели типового ЗУПа. Я теперь думаю, что с этим делать.
7 dka80
 
22.11.19
13:35
(6) хде? дай поглядеть
8 Dmitriy_
Kolesnikov
 
22.11.19
13:37
(5) а если после присвоения я сделаю
ТЗ_2[0].КакоетоПоле = 3
то это поле поменяется только во второй таблице, а в первой - нет.

(7) обработка МенеджерРасчетаЗарплаты, модуль объекта,
Зарплата.Начисления = Начисления;

И там такого много.
9 dka80
 
22.11.19
13:44
(8) и что плохого в этом месте?
Зарплата - экспортная переменная
Начисления - локальная таблица значений. В ней посчитали результат, и отдали наружу
10 dka80
 
22.11.19
13:49
(8) не обманывай себя
https://hkar.ru/10hbN
11 Ёпрст
 
гуру
22.11.19
14:08
(8) врешь же..
12 Dmitriy_
Kolesnikov
 
22.11.19
16:45
(10) проверил - в простом случае действительно, в обоих таблицах меняются синхронно.
Но каким-то хитрым образом получается так, что в одной таблице КакоетоПоле меняется независимо, а Территории - синхронно.

Соответственно вопросы:
1) как узнать, что две таблицы значений связаны по ссылкам?
2) как узнать, на какую именно таблицу значений указывает СтрокаТаблицыЗначений?
13 RomanYS
 
22.11.19
16:47
(12) Нет никаких "обоих таблиц". Это или одна таблица или две никак не связанные.
14 RomanYS
 
22.11.19
16:49
(12) как проверить

ТЗ = Новый ТаблицаЗначений;
ТЗ2 = ТЗ;
Сообщить((ТЗ = ТЗ2));//Да
ТЗ3 = ТЗ.Скопировать();
Сообщить((ТЗ = ТЗ3));//Нет
15 Garykom
 
гуру
22.11.19
16:54
(12) Когда дойдет что "колонка Территории имеет тип ТаблицаЗначений" же
Ты скопировал ТЗ с ТЗ_Внутр внутри в ячейке.

Новая ТЗ имеет копии простых типов значений и !внимание! копию ССЫЛКИ на туже ТЗ_Внутр что и в ячейке старой ТЗ
16 Garykom
 
гуру
22.11.19
16:56
(15)+ Еще бы на руби или на C# так поиздевался, там в первой все типы объекты а во второй все простые типы имеют объектную версию
17 Dmitriy_
Kolesnikov
 
22.11.19
16:59
(14) спасибо за метод.
(15) теперь придется везде смотреть, где таблицы скопированы по ссылке, а где по значению. В каком-то одном месте сделали копирование по значению, пока не могу его найти.
18 Dmitriy_
Kolesnikov
 
22.11.19
17:01
Ещё интересно попробовать, работает ли метод (14) с объектом СтрокаТаблицыЗначений.
19 RomanYS
 
22.11.19
17:20
(18) работает
ТЗ = Новый ТаблицаЗначений;
ТЗ.Добавить();
ТЗ2 = ТЗ;
Сообщить(""+(ТЗ = ТЗ2) + " "+(ТЗ[0] = ТЗ2[0]));//Да Да
ТЗ3 = ТЗ.Скопировать();
Сообщить(""+(ТЗ = ТЗ3) + " "+(ТЗ[0] = ТЗ3[0]));//Нет //Нет