Имя: Пароль:
1C
1С v8
ТаблицаЗначений на управляемой форме
0 Zheka_zloy
 
05.07.16
18:19
Всем привет.
есть обработка которая выводить в табличную часть (созданную в конфигураторе) реквизиты выбранного объекта, потом перебераются табличные части (выбранного объекта) и для каждой таб. части создается "ТаблицаФормы" (программно) и в неё добавляются реквизиты таб. части, для каждой таб.части новая "ТаблицаФормы".

код:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Элементы.ВсеОбъекты.РежимВыбораИзСписка = Истина;
    
    Для Каждого ОдинИзДокументов Из Метаданные.Документы Цикл
        Элементы.ВсеОбъекты.СписокВыбора.Добавить(ОдинИзДокументов.Имя);
    КонецЦикла;
    
    Для Каждого ОдинИзСправочников Из Метаданные.Справочники Цикл
        Элементы.ВсеОбъекты.СписокВыбора.Добавить(ОдинИзСправочников.Имя);
    КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ВсеОбъектыПриИзменении(Элемент)
    ВсеОбъектыПриИзмененииНаСервере(Элемент.ВыделенныйТекст);
КонецПроцедуры

&НаСервере
Процедура ВсеОбъектыПриИзмененииНаСервере(ИмяОбъекта)
    
    // определяем что выбранно документ или спавочник
    Попытка
        ВыбранныйОбъект = Метаданные.НайтиПоПолномуИмени("Документ." + ИмяОбъекта);
    Исключение
        ВыбранныйОбъект = Метаданные.НайтиПоПолномуИмени("Справочник." + ИмяОбъекта);
    КонецПопытки;
    
    // устанавливаем заголовок таблицы реквизиты
    Элементы.РеквизитыОбъекта.Заголовок = ВыбранныйОбъект.Синоним;
    

    // заполняем таблицу реквизитов объекта
    Для Каждого ОдинИзРеквизитов Из ВыбранныйОбъект.Реквизиты Цикл
        НоваяСтрока = Объект.РеквизитыОбъекта.Добавить();
        НоваяСтрока.Имя = ОдинИзРеквизитов.Имя;
        НоваяСтрока.Синоним = ОдинИзРеквизитов.Синоним;
    КонецЦикла;
    
    // здесь будут лежать все табличные части
    ВсеТабличныеЧасти = Новый Структура;
    
    // массив добавляемых реквизитов
    МассивТипаВыбора = Новый Массив;
    МассивТипаВыбора.Добавить(Тип("ТаблицаЗначений"));
    ОписаниеТипаВыбора = Новый ОписаниеТипов(МассивТипаВыбора);
    МассивРеквизитов = Новый Массив;
        
    // перебор табличных частей
    Для Каждого ОднаИзТабличныхЧастей Из ВыбранныйОбъект.ТабличныеЧасти Цикл
        
        // таблица значений для текущей табличной части
        ТЗ = Новый ТаблицаЗначений;
        ТЗ.Колонки.Добавить("Имя");
        ТЗ.Колонки.Добавить("Синоним");
        ТЗ.Колонки.Добавить("Заполняющий");
        
        МассивРеквизитов.Добавить(Новый РеквизитФормы(ОднаИзТабличныхЧастей.Имя, ОписаниеТипаВыбора, "", ОднаИзТабличныхЧастей.Синоним));
        
        // заполняем ТЗ реквизитами текущей табличной части
        Для Каждого СтрокаТабличнойЧасти Из ОднаИзТабличныхЧастей.Реквизиты Цикл
            
            НоваяСтрока = ТЗ.Добавить();
            НоваяСтрока.Имя = СтрокаТабличнойЧасти.Имя;
            НоваяСтрока.Синоним = СтрокаТабличнойЧасти.Синоним;
            
        КонецЦикла;
        
        // добавляем ТЗ в структуру
        ВсеТабличныеЧасти.Вставить(ОднаИзТабличныхЧастей.Имя, ТЗ);
        
        // добавляем реквизиты(колонки)
        Для Каждого Колонка Из ТЗ.Колонки Цикл
            
            МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ОднаИзТабличныхЧастей.Имя));
            
        КонецЦикла;

    КонецЦикла;
    
    ИзменитьРеквизиты(МассивРеквизитов);
        
    Для Каждого ОднаИзТЗ Из ВсеТабличныеЧасти Цикл
        
        ТаблицаПолейВыбора = Неопределено;
        ТаблицаПолейВыбора = Элементы.Добавить(ОднаИзТЗ.Ключ, Тип("ТаблицаФормы"));
        ТаблицаПолейВыбора.ПутьКДанным = ОднаИзТЗ.Ключ;
        ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;
        
        НовыйЭлемент = Неопределено;
        Для Каждого Колонка Из ОднаИзТЗ.Значение.Колонки Цикл

// в следующей строке возникает ОШИБКА если табличных частей больше одной
            НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), ТаблицаПолейВыбора);      
            НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
            НовыйЭлемент.ПутьКДанным = ОднаИзТЗ.Ключ + "." + Колонка.Имя;
                
        КонецЦикла;
        
        ЗначениеВРеквизитФормы(ТЗ, ОднаИзТЗ.Ключ);
        
    КонецЦикла;
    
КонецПроцедуры

Ошибка возникает если у объекта больше одной таб. части
буду признателен за помощь
1 Euguln
 
05.07.16
18:23
НовыйЭлемент = Элементы.Добавить(ОднаИзТЗ.Ключ+Колонка.Имя, Тип("ПолеФормы"), ТаблицаПолейВыбора);
2 Zheka_zloy
 
06.07.16
10:24
спасибо доброму человеку что просветил балбеса
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан