Имя: Пароль:
1C
1С v8
Динамическое создание элементов формы (УФ)
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
Значение передавать не обязательно, на форме отображается и без него
Основная теорема систематики: Новые системы плодят новые проблемы.