|
v8: Почему "Знач" не копирует источник? | ☑ | ||
---|---|---|---|---|
0
Вуглускр1991
11.04.13
✎
20:18
|
Есть у меня в модуле такая функция:
Функция РазностьДвухТаблицКолнкмОдинаковы(Знач Т1, Знач Т2, Знач КолонкиИтогов = "") Экспорт лКолонкиСвернем = ""; лКолонкиИтогов = "," + КолонкиИтогов + ","; Если КолонкиИтогов = "" Тогда лКолонкиИтогов = "," + Т1.Колонки.Получить(Т1.Колонки.Количество() - 1).Имя + ","; КонецЕсли; Для Каждого тКол Из Т1.Колонки Цикл Если Найти(лКолонкиИтогов,"," + тКол.Имя + ",") = 0 Тогда лКолонкиСвернем = лКолонкиСвернем + "," + тКол.Имя; КонецЕсли; КонецЦикла; тДлинаКИт = СтрДлина(лКолонкиИтогов); лКолонкиИтогов = Сред(лКолонкиИтогов,2,тДлинаКИт - 2); лКолонкиСвернем = Сред(лКолонкиСвернем,2); тМаКолИтогов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(лКолонкиИтогов); Для Каждого СтрТ2 Из Т2 Цикл Для Каждого тКол Из тМаКолИтогов Цикл СтрТ2[тКол] = - СтрТ2[тКол]; КонецЦикла; КонецЦикла; ТаблицаРезультат = Т1.Скопировать(); ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Т2, ТаблицаРезультат); ТаблицаРезультат.Свернуть(лКолонкиСвернем, лКолонкиИтогов); УбратьНулиИзТаблицыМассивКолонок(ТаблицаРезультат,тМаКолИтогов); Возврат ТаблицаРезультат; КонецФункции Так вот: в строке, где инвертируется по знаку СтрТ2[тКол] = - СтрТ2[тКол]; происходит изменение знака в колонке изначальной таблицы, засунутой как параметр №2 в этй функцию, Хотя я честно написал слово "Знач", желая, чтобы платформа отпочковала копию ТЗ и не меняла ничего в изначальной. Почему? |
|||
1
Renat11111
11.04.13
✎
20:24
|
это из серии людям нех... делать?
|
|||
2
Светлый Гений
11.04.13
✎
20:27
|
(0) может быть потому, что ТЗ не примитивный тип?
|
|||
3
Chai Nic
11.04.13
✎
20:27
|
Потому что ТаблицаЗначений на самом деле означает не сам объект, а ссылку на него. Об этом явно в документации не говорится, но это факт. Соответственно, по значению в процедуру передается именно ссылка, а не копируется объект. Если надо копию - используй Выгрузить.
|
|||
4
Вуглускр1991
11.04.13
✎
20:35
|
(2) Наверное...
(3) Я уже поправил код... вопрос теологический. Я все ж надеялся ... вдруг я не правильно понимаю, как оно должно быть, или слово Знач с большой буквы написал .. (1) У меня есть функция Функция Списать(ОткудаСписать, ЧегоСписать, СтруктураИзмерения, СтруктураРесурсы) Экспорт очень помогает в работе. |
|||
5
Chai Nic
11.04.13
✎
20:59
|
(4) С точки зрения теологии вообще было бы неплохо, если бы можно было создавать процедуры с гарантированным отсутствием побочных эффектов) Но тогда это будет не 1с.
|
|||
6
Dolly_EV
20.04.13
✎
15:25
|
(0) Вуглускр1991, вот отсюда:
v8: v8: РИБ 7.7 - 8.2 поделка еще осталась? по ссылке - не работает. Можешь поделиться? |
|||
7
В тылу врага
20.04.13
✎
15:50
|
потому что передается ССЫЛКА на ТЗ, да если ты изменишь ссылку на результат не повлияет, но вот если сам объект меняешь - увы
|
|||
8
NcSteel
20.04.13
✎
16:04
|
(6) Ты уверен что хочешь эту разработку, седя по автору он дуб.
|
|||
9
Classic
20.04.13
✎
16:08
|
(3)
Все верно. Но почему это должно описываться? Это и так понятно. Значение ТЗ является тупо адрес на ячейку памяти, вот этот адрес и передается в функцию. Сложно в переменной хранить адрес всех ячеек ТЗ со значениями |
|||
10
Ковычки
20.04.13
✎
17:50
|
Функция ххх(Знач ТЗ)
ТЗ=ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(ТЗ)); ТЗ.Получить(0).ХХХ = - ТЗ.Получить(0).ХХХ; ТЗ.ВыбратьСтроку(); КонецФункции ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("ХХХ"); ТЗ.Добавить().ХХХ=1; ТЗ.ВыбратьСтроку(); ххх(ТЗ); ТЗ.ВыбратьСтроку(); |
|||
11
orefkov
20.04.13
✎
17:56
|
(0) немного не понимаешь, что означает Знач.
Оно относиться не к объекту, а к переменной, в которой лежит ссылкана объект и гарантирут, что после возврата из вызванной процедуры в этой переменной по прежнему будет лежать ссылка на тот же объект. Без знач это не гарантируется, и в переменной может находится что угодно. Так что там копируется ссылка на объект. А то что ты хочешь - это клонирование, и дорогого стоит. |
|||
12
Chai Nic
20.04.13
✎
18:19
|
(9) "Но почему это должно описываться? Это и так понятно. "
Потому что это язык программирования, а не надпись на заборе... Вон, в Си в своё время сделали кучу допущений на уровне "и так понятно" - получили гарантированный гемор и огромную кучу потенциальных граблей, когда результат алгоритма может зависеть даже от фазы луны во время работы оптимизирующего компилятора.. |
|||
13
acsent
20.04.13
✎
18:40
|
знач только для примитивных типов
|
|||
14
acsent
20.04.13
✎
18:40
|
хочешь знач для тз, передавай ТЗ.Скопировать()
|
|||
15
Dolly_EV
21.04.13
✎
06:31
|
(8) как-то ты однобоко судишь по автору. Я в свое время с этим "Знач" тоже не мало граблей поимел, пока не понял что к чему
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |