Имя: Пароль:
1C
1С v8
почему "знач" не работает
0 vde69
 
20.09.11
10:32
собствено при возврате массива заполненого в процедуре мы имееи ЗАПОЛНЕНЫЙ массив, по чему?

// рекурсиооная процедура
//
Процедура ОбработатьУровеньДерева(ТекущиеСтроки, УровеньДоступа, Дата, знач МассивРодителей = Неопределено, ШтатнаяЕдиница = Неопределено)
   Если МассивРодителей = Неопределено Тогда
       МассивРодителей = Новый Массив;
   КонецЕсли;
       
   ТЗ = РаботаСШтанымРасписанием.ПолучитьПодчиненныеШтатныеЕдиницы(ШтатнаяЕдиница, Дата, УровеньДоступа);
   Для каждого эл Из ТЗ Цикл
       Если не ЗначениеЗаполнено(ШтатнаяЕдиница) Тогда
           // для корня - массив пересоздаем
           МассивРодителей = Новый Массив;
       КонецЕсли;
       
       Если МассивРодителей.Найти(эл.ШтатнаяЕдиница) <> Неопределено Тогда
           // рекусивное зацикливание
           Сообщить("Для " + ШтатнаяЕдиница + ", уровня " +  УровеньДоступа + ", на дату " + Дата + " - Обноружено зацикливание, элемент: " + эл.ШтатнаяЕдиница);
           Продолжить;
       КонецЕсли;
       
       МассивРодителей.Добавить(эл.ШтатнаяЕдиница);
       НоваяСтрока = ТекущиеСтроки.Добавить();
       ЗаполнитьЗначенияСвойств(НоваяСтрока, эл);
       ОбработатьУровеньДерева(НоваяСтрока.Строки, УровеньДоступа, Дата, МассивРодителей, эл.ШтатнаяЕдиница);
   КонецЦикла;
КонецПроцедуры
1 butterbean
 
20.09.11
10:34
ну дык ты передал массив, он массивом и остался, все правильно :-)
2 Rie
 
20.09.11
10:34
(0) Насколько я понимаю, передаётся указатель на массив. Этот указатель не изменяется (поскольку Знач). Ну а сам массив - никто не мешает заполнять.
3 Defender aka LINN
 
20.09.11
10:35
Вроде только для примитивных типов работает
4 Ёпрст
 
гуру
20.09.11
10:36
(0) знач - токма для простых типов данных - дата/строка/число.
всё остальное - по ссылке, как-то так.
5 vde69
 
20.09.11
10:36
из СП

Знач
    Необязательное ключевое слово, которое указывает на то, что следующий за ним параметр передается по значению, т.е. изменение значения формального параметра при выполнении процедуры никак не повлияет на фактический параметр, переданный при вызове процедуры. Если это ключевое слово не указано, то параметр процедуры передается по ссылке, то есть изменение внутри процедуры значения формального параметра приведет к изменению значения соответствующего фактического параметра.
6 mirosh
 
20.09.11
10:36
(5) работает только для примитивных типов вроде
7 Defender aka LINN
 
20.09.11
10:36
(5) Такая вот багофича
8 Axel2009
 
20.09.11
10:41
(6) ссылка - примитивный тип?
9 Rie
 
20.09.11
10:43
(8) Что понимается в данном случае под "ссылкой" (в контексте 1С)?
10 Serginio1
 
20.09.11
10:44
У тебя переменная в которой хранится ссылка на массив не изменилась, но это не значит что нельзя изменять данные по сылке, значит все впорядке, а вот
МассивРодителей = Новый Массив; не должно изменить значение преременной в которой хранится  ссылка , и оригинальный массив должен остаться тем же. По определению в 1С все данные передаются по ссылке, то есть адреса, для ссылочных типов адреса переменных в которых хранится адрес ссылки
11 Axel2009
 
20.09.11
10:44
(9) ссылка на объект
12 Rie
 
20.09.11
10:47
(11) Имеется в виду, к примеру, СправочникСсылка.КакойТо или Структура?
13 Axel2009
 
20.09.11
10:48
(0) имхо Баг это.

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

Процедура Тест(Знач Массив)
   Массив = Новый Массив;
   Массив.Добавить(2);
   Массив.Добавить(4);
КонецПроцедуры
Количество будет 1 и тип Массив. однако если его не переинициировать , тогда количество будет 3.
14 Axel2009
 
20.09.11
10:48
(12) с каких пор структура - ссылка?
15 Serginio1
 
20.09.11
10:52
(14) В 1С нет понятия структур как в других языках. Нет их кстати и в Яве.
(13) Это не баг. Это одно из недостатков императивных языков перед функциональными, где все объекты только для чтения, хотя это и можно победить на уровне компилятора и введения массивов только для чтения.
16 Sammo
 
20.09.11
10:54
Емнип, из той же оперы

Список1 = Новый СписокЗначений;
Список2 = Список1;
Список2.Добавить("что-то", "с чем-то");
Сообщить(Список1.Количество());
17 Serginio1
 
20.09.11
10:55
+15 и только для фреймворков, где за записью в в такие объекты следит компилятор
18 Axel2009
 
20.09.11
10:59
(15) много чего нет. и классов нет, и возможности объявить функцию с неограниченным количеством переменных, и перегрузить операнд и много чего еще нет.
но мы говорим про 1с и в контексте 1с структура есть.
19 5 Элемент
 
20.09.11
11:00
20 Rie
 
20.09.11
11:00
(15) Странно. Тип данных Структура есть, а понятия "структура"  - нет.
21 Rie
 
20.09.11
11:01
(13) Пример некорректный.
В (13) - изменяется параметр Массив (ему присваивается новое значение).
В (0) - параметру может ничего и не присваиваться, меняется массив.
22 Rie
 
20.09.11
11:02
(14) Издавна. Структура при присваиваниях не копируется, копируется указатель на неё.
23 Stepa86
 
20.09.11
11:04
Структура как и массив, как и тз, как и другие коллекции передаются по ссылке, что дает кучу эффектов... вот тока при передачи с клиента на сервер и обратно не уверен, а тестить лень
24 Serginio1
 
20.09.11
11:05
(18,20)Структура в 8 это класс типа словаря, структура в других языках э Value тип состоящий из нескольких полей и переменная хранит не адрес, представляет собой диапозон памяти в которых хранятся значения полей этой структуры. Во
25 5 Элемент
 
20.09.11
11:16
(23) в тонком клиенте передается копия
26 Axel2009
 
20.09.11
11:21
(24) да мне пофигу как в других языках. мы говорим в рамках 1с.
много языков можно привязать к ассемблеру, что там так а тут не так. у 1с задачи другие.
27 Serginio1
 
20.09.11
11:26
(26) Все так или иначе привязано к ассемблеру. И все проблемы этой ветки как раз являются незнанием элементарных элементов программирования.
28 Axel2009
 
20.09.11
11:33
(27) про элементарные элементы программирования я обязательно запомню и буду упоминать при любой возможности.
29 Serginio1
 
20.09.11
11:41
(28) Ну элементы то разные бывают. Элемент класс далеко не элементарен, а вот адреса, ссылки, переменные являются примитивами программирования.
30 andrewks
 
20.09.11
11:44
никакого бага нет.
ссылка не менялась, какие претензии.
разве в сях и пр. по-другому?
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.