Имя: Пароль:
1C
1С v8
Копирование ТЗ в другую ТЗ. Связь на века? :)
,
0 Полька
 
08.11.13
15:37
Это опять я. Просто интересно :)
ТЗ1 = ВыборкаДокументов.Продукция.Выгрузить();
ТЗ=ТЗ1;
ТЗ.Очистить();
Почему при этом очищаются обе таблицы? Они что, связаны между собой?
1 zak555
 
08.11.13
15:38
делать надо так

ТЗ = ТЗ1.Скопировать();
2 zak555
 
08.11.13
15:39
это не обе, а одна таблица, к которой можно обращаться через две переменные
3 Ненавижу 1С
 
гуру
08.11.13
15:39
это не копирование объектов, это копирование ссылки на один и тот же объект
есть же Скопировать
4 XLife
 
08.11.13
15:39
(1) не угадал... ТЗ = ТЗ1.СкопироватьКолонки();
5 Полька
 
08.11.13
15:39
ясно
6 zak555
 
08.11.13
15:41
(4) она хотела скопировать универсальную коллекцию, а ты предлагаешь скопировать только структуру
7 zak555
 
08.11.13
15:42
(5) думаю, что нет
8 XLife
 
08.11.13
15:43
(6) а тз.очистить(); тогда зачем?
9 zak555
 
08.11.13
15:43
+ (7)

проц(знач ТЗ)
   ТЗ.Очистить()
конецпроц

ТЗ1 = ВыборкаДокументов.Продукция.Выгрузить();
ТЗ=ТЗ1;
проц(ТЗ);
10 zak555
 
08.11.13
15:43
(8) для теста, чтобы понять, как это работает =)
11 Ненавижу 1С
 
гуру
08.11.13
15:44
(9) результат будет тот же
12 НеБорис Нуралиев
 
08.11.13
15:46
Эх молодежь! Не застали чудесной поры кодирования на Си... Не знают про указатели и переменные в памяти.
13 Полька
 
08.11.13
15:52
(6) хотела скопировать структуру :)
14 wPa
 
08.11.13
15:54
вот и пришло время в ИТ тех, кто никогда не передавал указатели )
15 zak555
 
08.11.13
16:12
(11) почему ?*
16 Ненавижу 1С
 
гуру
08.11.13
16:20
потому что (знач ТЗ) тут не прокатит ТЗ все равно ссылка
17 zak555
 
08.11.13
16:24
(16) ???
18 Холодильник
 
08.11.13
16:25
сериализация
19 zak555
 
08.11.13
16:32
Знач
     Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, т.е. изменение значения формального параметра при выполнении процедуры никак не повлияет на фактический параметр, переданный при вызове процедуры. Если это ключевое слово не указано, то параметр процедуры передается по ссылке, то есть изменение внутри процедуры значения формального параметра приведет к изменению значения соответствующего фактического параметра.
20 mikecool
 
08.11.13
16:35
(19) ТЗ накласть на Знач
21 mikecool
 
08.11.13
16:35
+20 как и СЗ
22 mikecool
 
08.11.13
16:35
(19) проверь
23 mikecool
 
08.11.13
16:35
я с этим столкнулся лет 5 назад вроде...
24 zak555
 
08.11.13
16:36
(21) и на массив

на все универсальные коллекции значений ?
25 Classic
 
08.11.13
16:39
(20)
Не совсем
26 banco
 
08.11.13
16:40
27 Classic
 
08.11.13
16:40
Приводил пример

Процедура Проц(ЗНАЧ ТЗ)
    ТЗ = Новый ТаблицаЗначений;
КонецПроцедуры

Процедура Проц(ТЗ)
   ТЗ = Новый ТаблицаЗначений;
КонецПроцедуры


Будут разные результаты
28 mikecool
 
08.11.13
16:41
(27) какие?
29 smaharbA
 
08.11.13
16:42
в первом переданная тз не изменится
30 zak555
 
08.11.13
16:43
(26) выдержу приведи, а то с этого компа у менят доступа
31 Classic
 
08.11.13
16:44
(28)
Процедура Проц(ЗНАЧ ТЗ)
    ТЗ = Новый ТаблицаЗначений;
КонецПроцедуры

Процедура Проц1(ТЗ)
   ТЗ = Новый ТаблицаЗначений;
КонецПроцедуры


Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номер1");
    Проц(ТЗ);
    Сообщить(ТЗ.Колонки.Количество());
    
    //================
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номер1");
    Проц1(ТЗ);
    Сообщить(ТЗ.Колонки.Количество());
    
    
КонецПроцедуры


Проверяй
32 zak555
 
08.11.13
16:46
(31)
1
0
33 ASU_Diamond
 
08.11.13
16:46
(19) если бы для ТЗ это работало, то какой бы результат твоей программы был? у тебя выходит что внутри процедуры изменяется параметр, но это не влияет на фактический, значит ничего не измениться в месте вызова процедуры
34 zak555
 
08.11.13
16:47
ты же явно в процедуре создаёшь локальный объект
35 Classic
 
08.11.13
16:47
(33)
Это работает для ТЗ. Просто надо понимать, что переменная ТЗ хранит не таблицу значений, а ссылку на набор значений
36 Classic
 
08.11.13
16:48
(34)
Это параметр процедуры
37 zak555
 
08.11.13
16:49
(36) который ты переобозначаешь
38 Classic
 
08.11.13
16:49
(37)
Что значит "переобозначаешь"? Я его меняю
39 Classic
 
08.11.13
16:49
Ладно, давай по-другому
40 Classic
 
08.11.13
16:51
Процедура Проц(ЗНАЧ ТЗ, ТЗ1)
    ТЗ = ТЗ1;
КонецПроцедуры

Процедура Проц1(ТЗ, ТЗ1)
   ТЗ = ТЗ1;
КонецПроцедуры


Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    
    ТЗ1 = Новый ТаблицаЗначений;
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номер1");
    Проц(ТЗ, ТЗ1);
    Сообщить(ТЗ.Колонки.Количество());
    
    //================
    ТЗ1 = Новый ТаблицаЗначений;
    
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номер1");
    Проц1(ТЗ, ТЗ1);
    Сообщить(ТЗ.Колонки.Количество());
    
    
КонецПроцедуры
41 zak555
 
08.11.13
16:51
(38)

Процедура Проц(ЗНАЧ ТЗ)
//у тебя тут ТЗ передаётся, как я понимаю по ссылке
    ТЗ = Новый ТаблицаЗначений; //а тут ты создаёшь локальную переменную процедуры
42 mikecool
 
08.11.13
16:51
а блин, я не с этим сталкивался )))
вот с чем
роцедура РазРаз(ТЗ)
    //ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.УстановитьЗначение(1, "Раз", "Три");
    ТЗ.УстановитьЗначение(2, "Раз", "Четыре");
КонецПроцедуры

Процедура ДваДва(Знач ТЗ)
    //ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.УстановитьЗначение(1, "Раз", "Три");
    ТЗ.УстановитьЗначение(2, "Раз", "Четыре");
    
КонецПроцедуры


//*******************************************
Процедура Сформировать()
    
    ТЗ = СоздатьОбъект("ТаблицаЗначений");    
    ТЗ.НоваяКолонка("Раз");
    ТЗ.НоваяСтрока();
    ТЗ.Раз = "Рас";
    ТЗ.НоваяСтрока();
    ТЗ.Раз = "Два";
    Сообщить(ТЗ.КоличествоСтрок());
    
    РазРаз(ТЗ);
    Сообщить(ТЗ.КоличествоСтрок());
    Сообщить(тз.ПолучитьЗначение(1, "Раз"));
    Сообщить(тз.ПолучитьЗначение(2, "Раз"));
    
    ТЗ = СоздатьОбъект("ТаблицаЗначений");    
    ТЗ.НоваяКолонка("Раз");
    ТЗ.НоваяСтрока();
    ТЗ.Раз = "Рас";
    ТЗ.НоваяСтрока();
    ТЗ.Раз = "Два";
    Сообщить(ТЗ.КоличествоСтрок());
    
    ДваДва(ТЗ);
    Сообщить(ТЗ.КоличествоСтрок());
    Сообщить(тз.ПолучитьЗначение(1, "Раз"));
    Сообщить(тз.ПолучитьЗначение(2, "Раз"));
    
    
КонецПроцедуры

результаты
2
2
Три
Четыре
2
2
Три
Четыре
43 Classic
 
08.11.13
16:52
(42)
Я просто показал, что не совсем пофиг на ЗНАЧ :)
44 zak555
 
08.11.13
16:53
(40) должно быть
0
0
45 Classic
 
08.11.13
16:53
(41)
У тебя странные представления про локальность переменных :)
46 Classic
 
08.11.13
16:53
(44)
А сколько выдает?
47 banco
 
08.11.13
16:54
прочитали бы уже статью на ИТС
Разница для всех типов при передаче параметра процедуры или функции по ссылке или по значению проявляется в присвоении фактическому параметру процедуры или функции нового значения. Вызов свойств и методов контекста фактического параметра, если таковые имеются, влияет на формальный параметр независимо от того, передается ли он по ссылке или по значению.
48 Classic
 
08.11.13
16:55
(47)
Для этого ИТС читать не надо. передача по ссылке и по значению есть в любом языке. Правда как правило по умолчанию значение, а не ссылка, как в 1С
49 Ненавижу 1С
 
гуру
08.11.13
16:57
(44) Знач означает, что значение переменной ТЗ (а это ССЫЛКА на объект, а не сам объект) не вернется из процедуры
но сам то объект изменен! и не важно чему стала потом равняться ссылка
50 zak555
 
08.11.13
18:42
тупанул
51 ilkoder
 
08.11.13
19:38
если я передам по значению ссылку на элемент справочника - оно мне что, новый элемент справочника сделает? это будет тот же самый элемент справочника
52 sapphire
 
08.11.13
20:37
(0) Нет, просто дура.
ТЗ=ТЗ1; //Указатель на одну переменную для сериализованного объекта присваивается другому
ТЗ=ТЗ1.Скопировать();// Создается новый объект
53 rozer76
 
09.11.13
12:01
(47) + открыл для себя недавно такое "Знач блокирует возврат параметра из другого контекста" см. v8: "Знач" в параметре функции - 12 пост
54 К_Дач
 
09.11.13
13:49
(47) не совсем понятно, а можно пример?

Если я передам в процедуру Проц(Знач ТЗ) таблицу значений и попытаюсь переопределить ее - ничего не выйдет, это нам уже Classic продемонстрировал. А что с остальными типами? Другие коллекции значений, а простые типы?
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn