Имя: Пароль:
1C
1С v8
Передачазначения перечисления через список значений в др. форму криво работает
0 tlg25
 
25.06.13
11:38
Доброго времени суток.
Проблему решила "через одно место", но хотелось бы знать на будущее, как надо сделать(написать) правильно и почему она возникает.

Есть 2 формы(управляемые. 8.2), между которыми происходит обмен данными.
В первой форме(форма элемента справочника) реквизит типа СписокЗначений, куда я записываю нужные значения из текущей строки табличной части.
Во второй форме(произвольная форма этого справочника) параметр типа СписокЗначений(галочка "ключевой параметр" стоит). Вторая форма открывается модально по кнопке с передачей в качестве параметра реквизита типа СписокЗначений.
П = Новый Структура("ИмяПараметра", ИмяРеквизита);
ОткрытьФормуМодально("Справочник.Пациенты.Форма.ФормаСГМ", П);

Среди передаваемых значений есть ссылки на перечисления(значения перечислений).

В процедуре ПриСозданииНаСервере во второй форме, когда я просматриваю значение пришедшего параметра в отладчике, то вижу, что тип у него: ссылка на нужное мне перечисление и значение - переданное мной значение, НО когда я пытаюсь напрямую записать этот параметр в реквизит второй формы, который имеет тип ссылку на именно это перечисление, то значение НЕ ЗАПИСЫВАЕТСЯ. То есть код
МойРеквизит11 = ЭтаФорма.Параметры.ИмяПараметра[11]
НЕ РАБОТАЕТ.
Работает только через придуманный мной изврат:
Имя11 = СТРОКА(ЭтаФорма.Параметры.ИмяПараметра[11]);
Если Имя11 <> "<Пустое значение>" Тогда
   МойРеквизит11 = Перечисления.МоёПеречисление[Имя11];
КонецЕсли;    

Точно такая же проблема возникает, когда отдаю через процедуру "Оповестить" данные в первую форму обратно.

Подскажите, отчего такое возникает, ведь реквизит и элемент списка значений одного типа? (Ссылки на нужное мне перечисление)

Кстати, цифровые значения тоже не передаются просто так.
Приходиться писать МойРеквизит9 = СТРОКА(ЭтаФорма.Параметры.ИмяПараметра[11]),
хотя и реквизит и элемент списка значений - числа.

P.S. В реальном коде реквизиты и параметры имеют другие имена, но дала "абстрактные", чтобы не запутывать терминами предметной области.
1 Поросенок Петр
 
25.06.13
11:42
Элемент списка значений это не элемент массива.
2 Поросенок Петр
 
25.06.13
11:44
Если Имя11 <> "<Пустое значение>" Тогда...

а вот подобные строки нужно считать за мыслепреступление. Булавкой себя коли, когда вдруг захочется такое писать.
3 Asmody
 
25.06.13
11:56
откуда взялось "магическое число" 11?
4 samozvanec
 
25.06.13
11:58
(0)элемент списка содержит в себе значение, представление, пометку, картинку. делая вот так
МойРеквизит11 = ЭтаФорма.Параметры.ИмяПараметра[11]
ты пытаешься поместить в реквизит типа перечисление элемент списка значений

в этих целях, кстати, удобно использовать структуру. и вопросов как в (3) не будет)
5 samozvanec
 
25.06.13
11:59
а вот такие названия
П = Новый Структура("ИмяПараметра", ИмяРеквизита);
являются поводом для леща
6 tlg25
 
25.06.13
11:59
(3) Во второй строке опечатка.
Должно быть
МойРеквизит9 = СТРОКА(ЭтаФорма.Параметры.ИмяПараметра[9]).

11 - порядковый номер элемента моего параметра.
Я передаю 10 числовых параметров, 1-й строковый, а вот дальше (так как нумерация с нуля номер одиннадцатый) и начитаются элементы с типами значения перечисления.
7 Asmody
 
25.06.13
12:05
а как заполняется ИмяРеквизита?
8 tlg25
 
25.06.13
12:07
(5) В реальности имена другие, я ж приписала в постскриптуме.
Чтобы было понятнее.
Если важно, то в реальности строчка выглядит как:
П = Новый Структура("ЗначенияСГМ", ЗначенияСГМ);

Спасибо за написанное в (4). Присмотрелась в отладчике, оказывается тип именно моего элемента какое-то абстрактное "ЭлементСпискаЗначений", а уже если отрыть дерево, то ниже строка с названием "Значение" у которой только тип - ссылка на моё перечисление. Как хитро всё устроено.
9 hhhh
 
25.06.13
12:11
(8) детский сад.
10 tlg25
 
25.06.13
12:12
(7)    ИмяРеквизита.Очистить();
   НомерСтр = ЭтаФорма.Элементы.Состояние.ТекущаяСтрока;
   ЗаполнитьСписокСГМ(НомерСтр);

&НаСервере
Процедура ЗаполнитьСписокСГМ(НомерСтр);
   ИмяРеквизита.Добавить(Объект.МояТЧ[НомерСтр].НазваниеРеквизитаТЧ1)        ИмяРеквизита.Добавить(Объект.МояТЧ[НомерСтр].НазваниеРеквизитаТЧ2);

и далее также все интересующие меня реквизиты табличной части.
КонецПроцедуры
11 tlg25
 
25.06.13
12:14
(9) Простите, если Вы гуру, то я только недавно начала плотно работать с 1С и не знаю многих его тонкостей, поэтому и спрашиваю на форуме, чтобы в будущем делать грамотно и знать как "устроено изнутри"
12 hhhh
 
25.06.13
12:16
(11) но ведь в (1) вам сразу написали, что список значений - это не массив.
13 tlg25
 
25.06.13
12:18
(1) Да, спасибо, мне написали ниже, что там тип оказывается "ЭлементСпискаЗначений", а не тот тип, который мне показывает как тип значения лежащего в этом элементе. А строку написала как заглушку, потому что ни "ЗначениеЗаполнено" ни сравнение с пустой ссылкой моего перечисления 1С не принимал. Теперь понятно почему. Если тип элемента абстрактное "ЭлементСпискаЗначений", не конкретно ссылка на моё пекречисление.
14 tlg25
 
25.06.13
12:25
(12) Эта фраза не была мне понятна без развёрнутых пояснений данных ниже. Про то, что тип моего элемента, вовсе те такой, как я думаю. Кому-то достаточно полуслова(потому что он уже знает ответ), мне в данном случае было недостаточно.
15 tlg25
 
25.06.13
12:35
Спасибо Всем. Всё оказалось очень просто, надо писать не
ЭтаФорма.Параметры.ИмяПараметра[9],
а ЭтаФорма.Параметры.ИмяПараметра[9].Значение!
И тогда нормлаьно передаёт-принимается без извратов.