Имя: Пароль:
1C
1С v8
Странное поведение
,
0 ramir
 
08.04.14
12:46
Из модуля формы (&НаСервере) делаю вызов серверной процедуры из общего модуля. Выполняю следующий код:

Объект = Форма.Объект;
Для Каждого Стр Из Объект.Таблица Цикл
    Стр.Реквизит = Истина;
КонецЦикла;

В отладчике смотрю значения переменных
Объект.Таблица[0].Реквизит = Истина
Форма.Объект.Таблица[0].Реквизит = Ложь

Почему так? ДанныеФормыСтруктура присваиваются не по ссылке, а по значению?
1 andreymongol82
 
08.04.14
12:48
О сколько раз уже так было.
РеквизитФормыВЗначение
ЗначениеВРеквизитФормы
2 Ненавижу 1С
 
гуру
08.04.14
12:48
(0) да, иначе работаешь с разными данными
3 ramir
 
08.04.14
12:50
(1) причем тут это? Мне не нужно выгружать, загружать объект. Мне нужно его изменить. Это раз. "Реквизит" в прикладном объекте не существует, это реквизит формы. Это два.
4 ramir
 
08.04.14
12:50
(2) ну ппц, придется переписывать.
5 Ненавижу 1С
 
гуру
08.04.14
12:50
(3) при передаче на сервер, ты его неявно сериализуешь, раотаешь с другими данными
это 1С, детка
6 ramir
 
08.04.14
12:51
(5) ну понятно что сериализую, обратно-то форма тоже сериализуется. Если я пишу

Для Каждого Стр Из Форма.Объект.Таблица Цикл
    Стр.Реквизит = Истина;
КонецЦикла;

все работает
7 ramir
 
08.04.14
12:55
(2) Хорошо хоть массивы и т.п. по ссылке присваиваются. Где бы почитать какие типы данных и как ведут себя при присваивании.
8 Ненавижу 1С
 
гуру
08.04.14
12:57
(7) с массивами вообще-то тоже не айс
9 ramir
 
08.04.14
12:58
(8) А чего с ними не так? Только если содержат значения, которые не по ссылке присваиваются.
10 andreymongol82
 
08.04.14
12:58
(3) И что это меняет-то?
Объект у тебя на сервере живет сам по себе, теперь нужно его передать форме.
11 ramir
 
08.04.14
12:59
(10) Менять Форма.Объект. По-моему вы не догоняете о чем идет речь.
12 Ненавижу 1С
 
гуру
08.04.14
13:05
модуль формы:

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



&НаСервере
Функция ПолучитьМассивНаСервере()

    Об = РеквизитФормыВЗначение("Объект");
    Возврат Об.ПолучитьМойМассив();

КонецФункции

&НаСервере
Функция ПолучитьКоличествоНаСервере()

    Об = РеквизитФормыВЗначение("Объект");
    Возврат Об.ПолучитьМойМассив().Количество();
    
КонецФункции



модуль объекта:

Перем МойМассив;

Функция ПолучитьМойМассив() Экспорт

    Возврат МойМассив;    

КонецФункции

МойМассив = Новый Массив;
13 andreymongol82
 
08.04.14
13:07
(11) Да разные это объекты.

Объект.Таблица[0].Реквизит = Истина
Форма.Объект.Таблица[0].Реквизит = Ложь

после того как заполнили Объект.Таблица - его нужно отдать форме, то есть по вашему "поменять Форма.Объект" Как это сделать? Целых два способа. ЗначениеВРеквизитФормы или Объект.Таблица.Загрузить(ТЗ).
14 ramir
 
08.04.14
13:25
(12) так это просто разные экземпляры объектов
(13) это понятно, лучше буду менять Форма.Объект без лишних выгрузок/загрузок
15 Ненавижу 1С
 
гуру
08.04.14
13:37
(14) если бы все исполнялось на одной стороне (например в клиенте обычного приложения), то это был бы один и тот же объект
16 ramir
 
08.04.14
13:41
(15) Согласен, только массивы тут ни причем.
17 ramir
 
08.04.14
13:45
Еще интересный момент

Для Каждого Стр Из Форма.Объект.Таблица Цикл
    Стр.Реквизит = Истина;
КонецЦикла;

//Работает как хочется

Для Каждого Стр Из Форма.Объект.Таблица Цикл
    Форма.ДругойРеквизит = Истина; //Что-нибудь делаем с другим реквизитом формы
    Стр.Реквизит = Истина;
КонецЦикла;

//Не работает
18 ramir
 
08.04.14
13:47
(17) Сорри поторопился. Не работает когда в цикле меняешь реквизиты формы.
19 ramir
 
08.04.14
13:48
(18) Это логично