Имя: Пароль:
1C
1С v8
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) как-то ты однобоко судишь по автору. Я в свое время с этим "Знач" тоже не мало граблей поимел, пока не понял что к чему
2 + 2 = 3.9999999999999999999999999999999...