Имя: Пароль:
1C
1C 7.7
v7: Непонятки с ОбработкаЯчейкиТаблицы
,
0 Lexxxxx
 
25.01.12
11:23
Есть код:

Функция РасшифровкаОбновить(Обновить)
   Расшифровка.Установить("Обновить", Обновить);
   Возврат Расшифровка;
КонецФункции

Процедура Сформировать()

       //...

       Таб.ИсходнаяТаблица(ИсхТаблица);
                   
   // добавим список для расшифровки
   глФлагРасшифровки = 1;
     Расшифровка = СоздатьОбъект("СписокЗначений");
     Расшифровка.Установить("Идент","НашСписок");
     Расшифровка.Установить("Объект","РасчетныеЛистки");
     Расшифровка.Установить("Форма", ИсхТаблица);
     Расшифровка.Установить("Фирма", Фирма);
   Расшифровка.Установить("Подразделение", Подразделение);
   Расшифровка.Установить("Расчетчик", Расчетчик);
   Расшифровка.Установить("Сотрудник", Сотрудник);
   Расшифровка.Установить("Дата1", НачПериода);
   Расшифровка.Установить("Дата2", ДатаПериода);
   Расшифровка.Установить("ВидПериода","Регистрации");
   Расшифровка.Установить("ПоАлфавиту",рПоАлфавиту);
   ФКратко = ?(Константа.ФИОПолностью = Да,0,1);
   Таб.ВывестиСекцию("Настройка");    
   Расшифровка.Установить("Обновить", 0);

//Далее вывод остальных секций отчета
КонецПроцедуры

В секции "Настройка" есть три ячейки, в расшифровке которых прописано РасшифровкаОбновить(N), где N - число от 1 до 3 в зависимости от конкретной ячейки.
В глобальном модуле написано:

Процедура ОбработкаЯчейкиТаблицы(Расшифровка, СтандартнаяОбработка, Таблица) Экспорт
//...
глОбновить = Число(Расшифровка.Получить("Обновить"));
//...
КонецПроцедуры

При клике по ячейке глОбновить принимает значения N, указанные в вызове функции РасшифровкаОбновить в поле "Расшифровка" в свойствах ячеек. Если посмотреть отладчиком, то при при выводе секции "Настройка" происходит три вызова РасшифровкаОбновить с разными (соответственно прописанным в ячейках) значениями параметра. Следовательно происходит изменение значения с представлением "Обновить" в списке значений Расшифровка, который является общим для всех вызовов, а значит в конце это значение будет равно значению параметра при последнем вызове (у меня оказалось2), и потом еще оно же будет установлено в 0 строкой Расшифровка.Установить("Обновить", 0); после вывода секции "Настройка".
Пр клике на ячейке в процедуре глобального модуля ОбработкаЯчейкиТаблицы значение глОбновить всегда равно N соответствующей ячейки. Почему так?! По моему скромному разумению все три ячейки содержат ссылки на один экземпляр списка, в котором значение с представлением "Обновить" было установлено в 0, а следовательно в ОбработкаЯчейкиТаблицы первым параметром мы получим этот список, и в нем "Обновить" должно быть равно 0, однако это не так! Почему?
1 Ёпрст
 
25.01.12
11:43
(0) потому, что в каждой ячейке - свой список значений в поле Расшифровка.
Со своими значениями списка.

Если че, он там как ЗначениеВСтрокуВнутр хранится всегда, т.е в расшифровке всегда строка, а не указатель на конкретный список значений.
2 1Сергей
 
25.01.12
11:52
>>По моему скромному разумению все три ячейки содержат ссылки на один экземпляр списка

твоё скромное разумение неправильное. см (1)
3 Lexxxxx
 
25.01.12
11:53
(1) Да вот очень похоже на то! Но ведь я прочитал когда-то следующее:
"По умолчанию параметры методов, процедур и функций передаются по ссылке, то есть изменение внутри процедуры или функции значения формаль­ного параметра ведет к изменению значения соответствующего фактического параметра. При передаче параметра по значению изменение значения формаль­ного параметра никак не влияет на фактический параметр вызова процедуры. Для указания того, что тот или иной параметр следует передавать по значению, следует в исходном тексте процедуры или функции перед именем параметра записать ключевое слово Знач (англоязычный синоним — Val)."
и следую этому!
Так значит в расшифровке ячейки система неявно создает копию значения (типа использует Знач) и потом его можно как угодно насиловать, но на значение, сохраненное в расшифровке, это не окажет никакого влияния?!
4 Lexxxxx
 
25.01.12
11:55
(1)"Если че, он там как ЗначениеВСтрокуВнутр хранится всегда, т.е в расшифровке всегда строка, а не указатель на конкретный список значений."
Откуда и как Вы выяснили такую тонкость?!
5 1Сергей
 
25.01.12
11:55
(3) причем тут процедуры и функции? Ты же про таблицу говоришь. А там при выводе всё запоминается
6 Lexxxxx
 
25.01.12
11:58
(5) Ну вот я и думал что при выводе запоминается ссылка на список.
7 1Сергей
 
25.01.12
11:58
(6) не ссылка, а строка
8 Lexxxxx
 
25.01.12
12:01
(7) Откуда это известно?! Вот и Ёпрст4 так говорит. Я не говорю что это не так. Я хочу узнать какое место инструкции я пропустил?
9 1Сергей
 
25.01.12
12:03
(8) стр 717 4-ый абзац
10 Lexxxxx
 
25.01.12
12:07
(1) (9) Спасибо.
11 Ёпрст
 
25.01.12
12:08
(4) :))
Сними с только просмотр таблицу и погляди на поле расшифровка в свойствах ячейки.
12 Ёпрст
 
25.01.12
12:08
Если че, в мокселе всегда только текст в ячейках.. везде.
13 Lexxxxx
 
25.01.12
12:13
(11) Бггг! Прикольно!  :)