Имя: Пароль:
1C
1С v8
Как программно создать динамический список?
0 megabax
 
14.11.16
14:52
Добрый день. Пытаюсь создать на форме динамический список, в ПриСозданииНаСервере вставил код:
    ДобавляемыеРеквизиты = Новый Массив;
    МассивТипов = новый Массив;
    МассивТипов.Добавить(Тип("ДинамическийСписок"));
    Реквизит = Новый РеквизитФормы("ПолеВводаСтроки",новый ОписаниеТипов(МассивТипов),, "Поле ввода строки", Истина);
    ДобавляемыеРеквизиты.Добавить(Реквизит);
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);  
    Реквизит.ТекстЗапроса =
    "ВЫБРАТЬ ПЕРВЫЕ 10
    |    Номенклатура.Код,
    |    Номенклатура.Наименование,
    |    Номенклатура.Артикул
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    НЕ Номенклатура.ЭтоГруппа"
    ;
    
    
    Элемент = ЭтаФорма.Элементы.Добавить("Список", Тип("ТаблицаФормы"), ЭтаФорма);
    Элемент.Ширина=100;
    Элемент.Высота=30;
    Элемент.ПутьКДанным="ПолеВводаСтроки";

На строке "Реквизит.ТекстЗапроса =" вылетает с ошибкой
"{Форма.Форма.Форма(20)}: Поле объекта не обнаружено (ТекстЗапроса)
    Реквизит.ТекстЗапроса ="
Подскажите пожалуйста, как это делается праивльно?
1 sandal_r
 
14.11.16
14:58
пользуйтесь конструктором запросов с обработкой результата
ну или перед "Реквизит.ТекстЗапроса" добавьте:
Реквизит = Новый Запрос();
2 megabax
 
14.11.16
15:02
(1) Тут это не прокатит, надо программное создать динамический список и вставить его в форму.
Но, собственно с этим разобрался, оказывается надо так:

    ЭтаФорма.ПолеВводаСтроки.ТекстЗапроса =
    "ВЫБРАТЬ ПЕРВЫЕ 10
    |    Номенклатура.Код,
    |    Номенклатура.Наименование,
    |    Номенклатура.Артикул
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    НЕ Номенклатура.ЭтоГруппа"
    ;

Но вопрос все равно еще открыт, так как почему то добавленный динамический список на форме не отображается.
Что еще надо добавить в код:

    Элемент = ЭтаФорма.Элементы.Добавить("Список", Тип("ТаблицаФормы"), ЭтаФорма);
    Элемент.Ширина=100;
    Элемент.Высота=30;
    Элемент.ПутьКДанным="ПолеВводаСтроки";

???
3 Timon1405
 
14.11.16
15:07
4 megabax
 
14.11.16
15:26
(3) Спасибо.
сделал вот так:
    ДобавляемыеРеквизиты = Новый Массив;
    МассивТипов = новый Массив;
    МассивТипов.Добавить(Тип("ДинамическийСписок"));
    Реквизит = Новый РеквизитФормы("ПолеСписка",новый ОписаниеТипов(МассивТипов),, "Поле ввода строки", Истина);
    ДобавляемыеРеквизиты.Добавить(Реквизит);
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);  
    ЭтаФорма.ПолеСписка.ТекстЗапроса =
    "ВЫБРАТЬ ПЕРВЫЕ 10
    |    Номенклатура.Код
    |    Номенклатура.Наименование,
    |    Номенклатура.Артикул
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |    НЕ Номенклатура.ЭтоГруппа"
    ;
    
    
    Элемент = ЭтаФорма.Элементы.Добавить("Список", Тип("ТаблицаФормы"), ЭтаФорма);
    Элемент.Ширина=100;
    Элемент.Высота=30;
    Элемент.ПутьКДанным="ПолеСписка";

    
    НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаКод", Тип("ПолеФормы"), Элемент);
    НоваяКолонкаТаблицы.ПутьКДанным = "ПолеСписка.Код";    
    
    НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаНаименование", Тип("ПолеФормы"), Элемент);
    НоваяКолонкаТаблицы.ПутьКДанным = "ПолеСписка.Наименование";
     
    НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаАртикул", Тип("ПолеФормы"), Элемент);
    НоваяКолонкаТаблицы.ПутьКДанным = "ПолеСписка.Артикул";

но почему то вылетает с ошибкой:
"{Форма.Форма.Форма(39)}: Ошибка при установке значения атрибута контекста (ПутьКДанным)
    НоваяКолонкаТаблицы.ПутьКДанным = "ПолеСписка.Код";    
по причине:
Недопустимое значение"
Как вообще определить, какой путь к данным является допустимым?
5 mikecool
 
14.11.16
15:39
(4) посмотри, что у добавленных в гуи прописано
6 mikecool
 
14.11.16
15:39
полесписка - это не зарезервировано?
7 apokrit
 
14.11.16
15:40
(0) А зачем вообще программно создавать динамический список?
8 megabax
 
14.11.16
15:41
(7) Чтобы не трогать форму, чтобы обновлять легче потом было
9 megabax
 
14.11.16
15:43
(6) ПолеСписка поменял на ПолеСписка1, не помогло.
10 apokrit
 
14.11.16
15:45
(8) Ясно.
А то что при этом время открытия такой формы увеличится в разы, это учтено?
Может стоит попробовать как-нибудь расширения вместо такого извращения задействовать?
11 НЕА123
 
14.11.16
15:46
> НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаКод", Тип("ПолеФормы"), Элемент);


НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаКод", Тип("ПолеФормы"), Элементы.Список);
12 НЕА123
 
14.11.16
15:46
(11) сторно
13 НЕА123
 
14.11.16
15:47
Для Каждого Реквизит Из Массив Цикл
        Эл = Элементы.Добавить(Реквизит.Имя, Тип("ПолеФормы"), Элементы.ТЗ1);
        Эл.вид = ВидПоляФормы.ПолеВвода;
        Эл.доступныеТипы = Новый ОписаниеТипов(Колонка.ТипЗначения);
        Эл.ПутьКДанным = "ТЗ1."+Эл.Имя;
        Эл.Формат = "ЧГ=0";
    КонецЦикла;
14 megabax
 
14.11.16
15:49
(13) Че за Массив, откуда этот массив взять?
15 НЕА123
 
14.11.16
15:50
(14)
имеется ввиду, что надо до определения ПутькДанным определить что-то.
16 megabax
 
14.11.16
16:15
Когда взял пример из http://its.1c.ru/db/pubmanagedui#content:247:hdoc:_top, заработало, но как-то попытался использовать параметры, вот в таком коде:

    // Добавить реквизит "Динамический список".
    ТипыРеквизита = Новый Массив;
    ТипыРеквизита.Добавить(Тип("ДинамическийСписок"));
     
    ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
     
    НовыйРеквизит = Новый РеквизитФормы("РеквизитПроводки", // имя
    ОписаниеТиповДляРеквизита,     // тип
    ,                                                                            // путь
    "СписокТоваров",                                  // заголовок
    Истина);                                                         // сохраняемые данные
     
    ДобавляемыеРеквизиты = Новый Массив;
    ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
     
    ИзменитьРеквизиты(ДобавляемыеРеквизиты);    
    
    // Задать текст запроса и другие свойства динамического списка.
    РеквизитСписок = ЭтаФорма["РеквизитПроводки"];
    РеквизитСписок.ТекстЗапроса =
    "ВЫБРАТЬ
    |    Хозрасчетный.СчетДт,
    |    Хозрасчетный.СчетКт,
    |    Хозрасчетный.Организация,
    |    Хозрасчетный.Сумма,
    |    Хозрасчетный.КоличествоДт,
    |    Хозрасчетный.КоличествоКт,
    |    Хозрасчетный.Содержание
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
    |ГДЕ
    |    Хозрасчетный.Регистратор = &Регистратор";
    //РеквизитСписок.ОсновнаяТаблица = "Справочник.Товары";    
    
    РеквизитСписок.Параметры.Регистратор=Док;
    
    // Добавить элемент формы и связать его с реквизитом.
    НовыйЭлемент = Элементы.Добавить("ЭлементПроводки", Тип("ТаблицаФормы"));
    НовыйЭлемент.ПутьКДанным = "РеквизитПроводки";    
    
    // Создать колонки и связать их с данными.
    НоваяКолонкаТаблицы = Элементы.Добавить("СчетДт", Тип("ПолеФормы"), НовыйЭлемент);
    НоваяКолонкаТаблицы.ПутьКДанным = "РеквизитПроводки.СчетДт";
     
    НоваяКолонкаТаблицы = Элементы.Добавить("СчетКт", Тип("ПолеФормы"), НовыйЭлемент);
    НоваяКолонкаТаблицы.ПутьКДанным = "РеквизитПроводки.СчетКт";

Почему то вылетает на РеквизитСписок.Параметры.Регистратор=Док;

с сообщением "{Форма.Форма.Форма(37)}: Поле объекта не обнаружено (Регистратор)
    РеквизитСписок.Параметры.Регистратор=Док;"
17 FIXXXL
 
14.11.16
16:49
(16) установитьПараметры
18 FIXXXL
 
14.11.16
16:50
(14) это массив созданных ранее реквизитов :)
19 megabax
 
14.11.16
17:29
(17) Спасибо, вот так
РеквизитСписок.Параметры.УстановитьЗначениеПараметра("Регистратор",Док);

прокатило