Имя: Пароль:
1C
1С v8
Параметры процедур и функций
0 nickroblogger_
 
04.08.15
01:58
Здрст.

Есть процедура:
Процедура П1(Регион = Неопределено)

....

   Регион = ?(ЗначениеЗаполнено(Регион), Регион,
Константы.Регион.Получить());

....

КонецПроцедуры

Есть ее вызов:

....
П1(ПараметрыСеанса.ТекПользователь.Филиал.Регион);
//ТекПользователь - спрСс.
//Филиал - реквизит спрСс.
//Регион - реквизит перечислСс.
....

Почему ругается и пишет, что нельзя изменить "Регион" при выполнении?
Что вообще при таком написании передается в П1()?
1 nickroblogger_
 
04.08.15
02:01
обычное приложение толстый клиент
2 tipaya
 
04.08.15
02:39
может у тебя ссылка на неизменяемый или запрещенный к изменению объект.
3 nickroblogger_
 
04.08.15
03:02
(2) че-то как-то непонятно.
4 Лодырь
 
04.08.15
03:15
Ну судя по коду, ты пытаешся чтото присвоить ПараметрыСеанса.ТекПользователь.Филиал.Регион

Логично, что нихрена не присваивается.
5 nickroblogger_
 
04.08.15
03:20
(4) ну то есть при вот такой записи:
П1(ПараметрыСеанса.ТекПользователь.Филиал.Регион) не создается переменная типа ПеречислениеСсылка со значением в указанном реквизите и не передается в качестве аргумента?

А что тогда там передается?
6 Лодырь
 
04.08.15
03:32
кстати, а строка на которую ругается - это Регион = ?(ЗначениеЗаполнено(Регион), Регион,
Константы.Регион.Получить());
или ты не смотрел?
7 nickroblogger_
 
04.08.15
03:34
(6) да, при попытке присвоить в этой строке Региону значение Регион (так как тут ЗначениеЗаполнено(Регион) = истина) и происходит ошибка.
8 tipaya
 
04.08.15
03:52
Процедура П1(Регион = Неопределено)
   новРегион = ?(ЗначениеЗаполнено(Регион), Регион,Константы.Регион.Получить());
КонецПроцедуры
Вот так  скорей всего у тебя отработает. А ты что потом хочешь делать с этой переменной?
Если изменять, то попробуй дальше:
НовРегион.ПолучитьОбъект() и далее.
9 tipaya
 
04.08.15
03:55
ИЛи воот так:
Процедура П1(Регион = Неопределено)
   новРегион = ?(ЗначениеЗаполнено(Регион), Регион.ссылка,Константы.Регион.Получить());
КонецПроцедуры
10 nickroblogger_
 
04.08.15
04:03
(9)
Как решить я понял, я просто перед передачей параметра в процедуру создаю переменную и инициализирую ее значением региона из параметра сеанса и ее передаю. Тогда всё отрабатывает.
11 tipaya
 
04.08.15
04:04
(10) или так да.
12 nickroblogger_
 
04.08.15
04:09
(11) но меня больше интересовало не как сделать, а почему.
13 tipaya
 
04.08.15
04:38
Тебе надо посмотреть какую ссылку имеет объект.
ПараметрыСеанса.ТекПользователь.Филиал.Регион
и можно ли его изменить так как это делал ты.
14 nickroblogger_
 
04.08.15
11:35
(13) я вот ничего не понял. Можно пример какие бывают?
15 Feunoir
 
04.08.15
11:40
Сделай
Процедура П1(Знач Регион = Неопределено)

(5) В твоём случае параметр передаётся, что называется "по ссылке". То есть передаётся ссылка на реквизит конкретного параметра сеанса. Поэтому поменять ты его и не можешь.
16 lera01
 
04.08.15
11:43
(4) Ты передаешь в процедуру параметр и внутри процедуры перезаполняешь его. Вместе с этим он меняется в том месте, откуда ты его вызываешь, т.е. меняется именно то, что ты в свою процедуру передаешь. Но в твоем случае ПараметрыСеанса.ТекПользователь.Филиал.Регион вот это изменить нельзя, потому что это реквизит какого-то справочника Филиал. Чтобы изменить реквизиты справочника, нужно получать объект. Если не нужно ничего изменять, переназначь переменную как в (8) советуют, создастся новая переменная и ее можно использовать.
17 grigo
 
04.08.15
11:59
ПараметрыСеанса.ТекПользователь.Филиал.Регион - это ССЫЛКА элемента справочника "Регионы". Естественно, ССЫЛКА - это одно из полей, всегда запрещенный для изменения
18 1Сергей
 
04.08.15
12:03
только на (15) посте вспомнили про слово "Знач". стыдно