|
Динамическое создание элементов формы (УФ) | ☑ | ||
---|---|---|---|---|
0
mrCreator
28.05.15
✎
10:22
|
Всем привет.
нужно в форме при наступлении определенного события изменять состав реквизитов. Количество и наименование реквизитов каждый раз разное. Создана специальная форма выбора из справочника номенклатура. В форме выбора есть отборы, которые должны меняться в зависимости от выбранного типа номенклатуры. Список отборов берется из справочника вид номенклатуры. делаю так: Вариант1 &НаКлиенте Процедура ВидНоменклатурыПриИзменении(Элемент) парам = СписокПараметровНоменклатуры(); для Каждого тек из Парам цикл полеВ = СоздатьПолеВвода(тек); // Сюда параметр не передается //обработка отображения поля КонецЦикла; Элементы.ПараметрыФильтров.Видимость = Истина; КонецПроцедуры &НаСервере Функция СписокПараметровНоменклатуры() запрос = новый запрос(); запрос.Текст = "ВЫБРАТЬ | ВидыНоменклатурыПараметрыНоменклатуры.НаименованиеПараметра КАК Параметр, | ВидыНоменклатурыПараметрыНоменклатуры.ТипПараметра КАК Тип, | ВидыНоменклатурыПараметрыНоменклатуры.НомерСтроки КАК НомерСтроки |ИЗ | Справочник.ВидыНоменклатуры.ПараметрыНоменклатуры КАК ВидыНоменклатурыПараметрыНоменклатуры |ГДЕ | ВидыНоменклатурыПараметрыНоменклатуры.Ссылка = &Ссылка | |УПОРЯДОЧИТЬ ПО | НомерСтроки"; запрос.УстановитьПараметр("Ссылка", ВидНоменклатуры); парам = запрос.Выполнить().Выгрузить(); СтруктураПараметров = новый Структура; для Каждого тек из Парам цикл СтруктураПараметров.Вставить(СтрЗаменить(тек.Параметр, " ", ""), Строка(тек.Тип)); КонецЦикла; Возврат СтруктураПараметров КонецФункции Функция СоздатьПолеВвода(тек) ГруппаФильров = Элементы.ПараметрыФильтров; //обычная группа на форме Если не тек.Значение = "ДаНет" тогда отборНаФорме = ЭтаФорма.элементы.Добавить(тек.Ключ, Тип("ПолеФормы"), ГруппаФильров); отборНаФорме.Вид = ВидПоляФормы.ПолеВвода; иначе отборНаФорме = ЭтаФорма.элементы.Добавить(тек.Ключ, Тип("ПолеФормы"), ГруппаФильров); отборНаФорме.Вид = ВидПоляФормы.ПолеФлажка; КонецЕсли; //отборНаФорме.Заголовок = тек.Параметр; отборНаФорме.ПоложениеЗаголовка=ПоложениеЗаголовкаЭлементаФормы.Лево; отборНаФорме.Видимость=Истина; ОтборСтруктура = новый Структура; ОтборСтруктура.Вставить("Параметр", отборНаФорме); возврат ОтборСтруктура КонецФункции выдает ошибку {Справочник.Номенклатура.Форма.КаталогТоваров.Форма(108)}: Ошибка при вызове метода контекста (СоздатьПолеВвода) полеВ = СоздатьПолеВвода(тек); по причине: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа. по причине: Ошибка преобразования данных XDTO: Запись значения свойства 'ret': форма: Элемент имя: {http://v8.1c.ru/8.2/managed-application/modules}ret по причине: Ошибка преобразования данных XDTO: Запись значения свойства 'Value': форма: Элемент имя: {http://v8.1c.ru/8.1/data/core}Value по причине: Ошибка отображения типов: Отсутствует отображение для типа 'ПолеФормы' Пробывал на сервере создаль элементы формы, потом отобразить их на клиенте, это вариант 2, тоже не пошло, т.к. при переходе в в клиент у формы нужных реквизитов не оказалось вариант 3, пробывал создать и отобразить прям на сервере, но нечего не происходит. Помогите пожалуйста разобраться... |
|||
1
Господин ПЖ
28.05.15
✎
10:25
|
не все виды объектов сериализуются ибо их нет смысла таскать туда сюда
|
|||
2
mrCreator
28.05.15
✎
10:28
|
Да и не таскал бы, но функция ЭтаФорма.элементы.Добавить() доступна только на сервере. Как мне ее создать на сервере, а потом отобразить на клиенте....
вот в чем боль... |
|||
3
mrCreator
28.05.15
✎
10:41
|
ап
|
|||
4
Господин ПЖ
28.05.15
✎
10:42
|
ИзменитьРеквизиты()
|
|||
5
mrCreator
28.05.15
✎
10:43
|
эффект тот же. Эта функция доступна тоже только на сервере и с тем же самым успехом не отображается на клиенте
|
|||
6
olegves
28.05.15
✎
10:46
|
(0) а с клиента вызвать серверную процедуру религия тебе запрещает?
|
|||
7
KulakoffAlex
28.05.15
✎
10:47
|
парам = СписокПараметровНоменклатуры();
для Каждого тек из Парам цикл полеВ = СоздатьПолеВвода(тек); // Сюда параметр не передается //обработка отображения поля КонецЦикла; Все это перенеси на сервер. |
|||
8
Господин ПЖ
28.05.15
✎
10:48
|
(5) нефиг этому всему делать на клиенте
|
|||
9
mrCreator
28.05.15
✎
10:56
|
&НаКлиенте
для Каждого тек из Парам цикл СоздатьПолеВвода(тек); КонецЦикла; &НаСервере Функция СоздатьПолеВвода(тек) ГруппаФильров = Элементы.ПараметрыФильтров; //обычная группа на форме Если не тек.Значение = "ДаНет" тогда отборНаФорме = ЭтаФорма.элементы.Добавить(тек.Ключ, Тип("ПолеФормы"), ГруппаФильров); отборНаФорме.Вид = ВидПоляФормы.ПолеВвода; иначе отборНаФорме = ЭтаФорма.элементы.Добавить(тек.Ключ, Тип("ПолеФормы"), ГруппаФильров); отборНаФорме.Вид = ВидПоляФормы.ПолеФлажка; КонецЕсли; //отборНаФорме.Заголовок = тек.Параметр; отборНаФорме.ПоложениеЗаголовка=ПоложениеЗаголовкаЭлементаФормы.Лево; отборНаФорме.Видимость=Истина; ОтборСтруктура = новый Структура; ОтборСтруктура.Вставить("Параметр", отборНаФорме); ГруппаФильров.Видимость = Истина; возврат ОтборСтруктура КонецФункции дает ошибку Отсутствует отображение для типа 'ПолеФормы' |
|||
10
Kiks
28.05.15
✎
10:58
|
МассивДобавляемыхРеквизитов = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы(ИмяРеквизита, ТипРеквизита); НовыйРеквизит.Заголовок = ЗаголовокРеквизита; ИдРеквизита = НовыйРеквизит.Имя; Примерно так: МассивДобавляемыхРеквизитов.Добавить(НовыйРеквизит); ЭтаФорма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); ЭлФормы = Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы")); ЭлФормы.Вид = ВидПоляФормы.ПолеВвода; ЭлФормы.ПутьКДанным = ИдРеквизита; ЭтаФорма[ИдРеквизита] = ЗначениеКакоеНадо; |
|||
11
mrCreator
28.05.15
✎
11:09
|
пока я нахожусь внутри серверной процедуры я вижу добавленные элементы, как только я возвращаюсь в к клиенту я их уже не вижу. Если я пытаюсь отобразить элементы прям из серверной процедуры, код отрабатывает, но на форме нечего не появляется.
|
|||
12
Господин ПЖ
28.05.15
✎
11:13
|
возврат ОтборСтруктура
у тебя мания пытаться приволочь что-то на клиента |
|||
13
Kiks
28.05.15
✎
11:15
|
В созданных элементах нужно еще значения отобразить. И путь к данным прописать.
|
|||
14
mrCreator
28.05.15
✎
11:15
|
:) есть такое (12) , потому что с сервера не получается отобразить.
|
|||
15
Господин ПЖ
28.05.15
✎
11:16
|
(13) +1
элементы формы не связанные с реквизитами не отображаются можешь бросить на форму кнопку без команды - она не отобразится |
|||
16
mrCreator
28.05.15
✎
11:22
|
создал условный реквизит для привязки к данным Парам1 с типом текст
и в серверной процедуре дописал следующее: отборНаФорме.ПутьКДанным = парам1; отборНаФорме.Отображение = Истина; при выполнении: отборНаФорме.Отображение = Истина; появляется ошибка Запись дампа и все закрывается |
|||
17
Kiks
28.05.15
✎
11:23
|
1. Программно создаешь реквизит формы, задаешь ему некоторое значение.
2. Программно создаешь элемент формы, прописываешь ему путь к новому реквизиту формы. 3. Присваеваешь новому элементу нужное значение. |
|||
18
Kiks
28.05.15
✎
11:26
|
(16) ОтборНаФорме - Это новый элемент формы?
Тогда так попробуй: ЭтаФорма[отборНаФорме.Имя] = ЗначениеКакоеНадо; |
|||
19
mrCreator
28.05.15
✎
11:55
|
(18) да ОтборНаФорме это новый элемент формы
в клиенте не доступно отборНаФорме.Имя, а в серверном отрабатывает но не показывает. |
|||
20
Kiks
28.05.15
✎
12:12
|
Когда элемент формы создается, в параметрах указывается его имя:
ЭлФормы = Элементы.Добавить(ИмяНовогоЭлементаФормы, Тип("ПолеФормы")); ЭлФормы.Вид = ВидПоляФормы.ПолеВвода; //или что там еще ЭлФормы.ПутьКДанным = ИмяНовогоСозданногоРеквизитаФормы; //тоже в параметрах создания реквизита задается ЭтаФорма[ИмяНовогоЭлементаФормы] = ЗначениеКакоеНадо; //данная конструкция позволит обратиться к конкретному элементу формы (аналог: Элементы.ИмяКонкретногоЭлемента) |
|||
21
mrCreator
28.05.15
✎
17:11
|
(20) Спасибо огромное!!! Всё получилось.
ЭлФормы = ЭтаФорма.Элементы.Добавить("ПолеОтбора", Тип("ПолеФормы")); ЭлФормы.Вид = ВидПоляФормы.ПолеВвода;//или что там еще ЭлФормы.ПутьКДанным = ИмяНовогоСозданногоРеквизитаФормы;//тоже в параметрах создания реквизита задается ошибка у меня была в том, что я оказывается путь к данным передавал не текстовую строку а реквизит |
|||
22
mrCreator
28.05.15
✎
17:11
|
Значение передавать не обязательно, на форме отображается и без него
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |