![]() |
|
Чудеса с таблицами значений | ☑ | ||
---|---|---|---|---|
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]));//Нет //Нет |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |