Имя: Пароль:
1C
 
Видимость экспортной переменной модуля объекта в 8.2
0 RealSaint
 
17.02.10
15:11
В модуле объекта справочника объявляю переменную:

Перем м_Перем Экспорт;

В этом же модуле инициализирую переменную значением:

м_Перем = "1";

Далее, в обработчике ОбработкаЗаполнения() или ПриКопировании() этой переменной присваивается другое значение:

м_Перем = "2";

Вопрос: почему в модуле формы в процедурах ПриСозданииНаСервере() или ПриЧтенииНаСервере() значение выражения РеквизитФормыВЗначение("Объект").м_Перем равно "1", а не "2"? Естественно, либо ОбработкаЗаполнения(), либо ПриКопировании() обрабатывается. Кто мне может объяснить это поведение? Как нужно менять значение экспортируемой переменной модуля объекта, чтобы её изменённое значение было доступно в форме?
1 Phace
 
17.02.10
15:19
А может ну его... экспортную переменную модуля та? И создать реквизит формы, раз в форме это значение используется, а?
2 RealSaint
 
17.02.10
15:22
(1) Может и ну его, но вопрос то не об этом. Тем более что значение этой переменной не должно храниться в базе данных, а нужно только при работе с объектом. Это во-первых. А во-вторых, я всё-таки хочу понять поведение системы в данном случае. Вдруг это ошибка платформы? И я смогу вздохнуть с облегчением, осознавая что это не я осёл, а платформа глючит. :-))
3 RealSaint
 
17.02.10
15:24
(1) К тому же реквизиты формы из модуля объекта недоступны. :-)
4 Phace
 
17.02.10
15:28
(2) Данные реквизита формы не хранятся в базе (если не проставить флаг "Сохраняемы данные"). По описании проблемы в (0) непонятно что ты хочешь сделать - в каком модуле чего присваиваешь и в какой последовательности.
5 strange2007
 
17.02.10
15:29
Где-то в доках видел, что 1С против каких-либо глобальных переменных. А вообще в 8.2 хитрая конструкция форм с объектами. В свое время поплясал вокруг "как сделать глобальную переменную в рамках одной обработки?" и сделал как рекомендуют.
Аргументы были основаны на том, что серверная и клиентская части различаются на очень много
6 TitanLuchs
 
17.02.10
15:32
(0) Нужно более подробное описание задачи: что за чем происходит и т.д. И чего вообще хочется достичь в итоге.
7 RealSaint
 
17.02.10
15:39
(4),(6) Последовательность действий описана в первом сообщении. Цель всего этого следующая: на форме объекта отображается картинка, хранимая в реквизите типа ХранилищеЗначения этого объекта. При копировании такого объекта я хочу для нового объекта сразу же отобразить картинку на форме. Для этого предполагается получить навигационную ссылку или адрес во временном хранилище на картинку объекта копирования и показать эту картинку на форме нового элемента. Это в общем виде. Если кто знает как решить эту задачу вообще и более культурно в частности - буду рад совету.
Но это не отменяет первоначального вопроса. :-)
8 RealSaint
 
17.02.10
15:40
(5) Оно и понятно что части различаются, только зачем тогда нужны экспортные переменные модуля объекта? :-(
9 hhhh
 
17.02.10
15:52
(8) когда создается новый объект - первым делом инициализируются экспортные переменные модуля.
10 RealSaint
 
17.02.10
15:53
(9) Я знаю. Именно это у меня и делается выражением

м_Перем = "1";
11 TitanLuchs
 
17.02.10
15:53
(7) Если ты собираешься показывать картинку на форме, то смысла устанавливать что-то в модуле ОБЪЕКТА нет никакого. Устанавливай в модуле формы в серверных процедурах.
(8) Чтобы в толстом клиенте ничего не переписывать
12 RealSaint
 
17.02.10
15:55
(11) Ну и как мне тогда получить в форме картинку из хранилища значения для НЕЗАПИСАННОГО объекта?
13 TitanLuchs
 
17.02.10
15:55
(0) "Естественно, либо ОбработкаЗаполнения(), либо ПриКопировании() обрабатывается"
То есть, когда ты выполняешь метод РеквизитФормыВЗначение("Объект") у тебя выполняется ОбработкаЗаполнения() или ПриКопировании() в модуле объекта? И на точке останова ты видишь присвоение переменной значения 2?
14 TitanLuchs
 
17.02.10
15:57
(12) А как ты собирался это делять для незаписанного объекта в модуле объекта? В форме ты можешь картинке подсунуть любой путь, в ТЧ взять ее из реквизита уже записанного объекта.
15 RealSaint
 
17.02.10
16:00
(13) Нет. Сначала, т.е. при создании-копировании объекта, выполняется ПриКопировании(). Потом в форме выполняется ПриСозданииНаСервере(). В процедуре ПриСозданииНаСервере() проверяется значение РеквизитФормыВЗначение("Объект").м_Перем. В момент этой проверки я вижу значение "1".
16 RealSaint
 
17.02.10
16:03
(14) Например, получив навигационную ссылку на картинку объекта копирования. Или картинку из объекта копирования поместить во временное хранилище.
А как я в форме узнаю, какой у меня был объект копирования?
17 Phace
 
17.02.10
16:04
(16) параметры
18 TitanLuchs
 
17.02.10
16:05
(15) А попробуй проверить: при выполнении РеквизитФормыВЗначение("Объект") в модуле объекта у тебя сработает м_Перем=1,  то есть первое присваивание? Скорее всего при создании экземпляра объекта только эта информация и запоминается для отображения на форме, а все изменения ПриКопировании нет.
19 RealSaint
 
17.02.10
16:07
(17) ЗначениеКопирования? Наверное ты прав, я об этом как-то забыл. Спасибо, попробую.
20 RealSaint
 
17.02.10
16:11
(18) Ты прав, при выполнении РеквизитФормыВЗначение("Объект") срабатывает м_Перем=1. Теперь я понял где собака порылась. Спасибо.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший