Вход | Регистрация


1С:Предприятие ::

Метки:

УФ: программное создание/удаление таблицы формы

Я
   AAlexandra
 
26.12.11 - 15:57
Помогите, пожалуйста, разобраться:
1)Не получается программно удалить таблицу на форме.

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

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

Если создание-удаление делать в одной процедуре (что бессмысленно), код отрабатывает без ошибок.
Если разнести по разным процедурам - на удалении 1с-ка просто вылетает без объявления войны. 8(
Что делаю не так?

2) На форме есть реквизит типа Динамический список.
Визуально в конструкторе формы я вижу доступные поля таблицы. Как получить этот же список в коде программно?
 
 
   jsmith82
 
1 - 26.12.11 - 16:04
читай в книге разработка управляемого интерфейса
попробуй сначала получить реквизит через метод
3
   jsmith82
 
2 - 26.12.11 - 16:07
УправляемаяФорма (ManagedForm)
ИзменитьРеквизиты (ChangeAttributes)
Синтаксис:
ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>)
3
   AAlexandra
 
3 - 26.12.11 - 16:09
(1) читала, создание таблицы на форме делала по ней.. Про удаление ничего не нашла.
Что значит "получить реквизит через метод"?

(2) я не реквизит формы программно добавляю, а элемент формы. И именно его, саму ТаблицуФормы, не получается удалить.
Реквизит формы (который динамический список) создан в конструкторе формы, его я в данный момент не трогаю.
   jsmith82
 
4 - 26.12.11 - 16:12
сорри, не вник, щас попробую у себя сделать
   Ochkarito
 
5 - 26.12.11 - 16:17
1. Посмотри, что в переменной Элементы передается, в другой процедуре.
2. Возможно некорректный синтаксис метода добавить
ЭлементыФормы.Добавить(<Тип>, <Имя>, <Видимость>, <ПоместитьНа>)
8
   vmv
 
6 - 26.12.11 - 16:18
ТаблицаФормы.ПутьКДанным = "ДокументыНаСкладе";

разве не создаст РЕКВИЗИТ формы? лепет, что де я создаю всего-лищь ЭЛЕМЕНТ формы, ей невнятен - она создаст и элемент и реквизит.

посему ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>)
нужно использовать и при создании и при удалении
8
   vmv
 
7 - 26.12.11 - 16:26
я так удаляю, колонки тоже нужно

    РодительТф  = Элементы.ГруппаСохраненнаяТаблицаВИ;
    Тф          = Элементы[ИмяТаблицыФормы];
    
    // Сформируем массивы реквизитов формы и элементов(колонок) относительно предыдущей загрузки образа Тз источника
 
    мУдаляемыхРеквизитов = Новый Массив;
    мУдаляемыхЭлементов  = Новый Массив;
    Для Каждого ЭлементКолонка Из Тф.ПодчиненныеЭлементы Цикл
        ЭлементПутьКДанным = ЭлементКолонка.ПутьКДанным;
        ЭлементКолонкаРеквизитИмя = СтрЗаменить(ЭлементПутьКДанным, (ИмяТаблицыФормы+"."),"");
        Если мПредопределенныхКолонок.Найти(Врег(ЭлементКолонкаРеквизитИмя)) <> Неопределено Тогда
           Продолжить;
        КонецЕсли;
            мУдаляемыхРеквизитов.Добавить(ЭлементПутьКДанным);
        мУдаляемыхЭлементов.Добавить(ЭлементКолонка);
    КонецЦикла;
    
    // Удалим динамические реквизиты и элементы(колонки), вернув таблицу формы к исходному виду.
 
    Если мУдаляемыхРеквизитов.Количество() Тогда
        ЭтаФорма.ИзменитьРеквизиты(,мУдаляемыхРеквизитов);
        Для Каждого ЭлементКолонка Из мУдаляемыхЭлементов Цикл
            Элементы.Удалить(ЭлементКолонка);
        КонецЦикла;
    КонецЕсли;
8
9
   AAlexandra
 
8 - 26.12.11 - 16:29
(5) Элементы - там все элементы формы, смотрела в отладчике.
Ошибка вот на этой строке:
Элементы.Удалить( Элементы["МояНоваяТаблица"] );
Элементы["МояНоваяТаблица"] в отладчике отображается корректно, Тип ТаблицаФормы.

ВсеЭлементыФормы (FormAllItems)
Добавить (Add)
Синтаксис:
Добавить(<Имя>, <ТипЭлемента>, <Родитель>) 

(6) на форме уже есть реквизит с именем ДокументыНаСкладе. Второй такой же не создается, это бы привело к ошибке.
Удалить хочу только элемент формы, реквизит не трогать..

(7) спасибо, сейчас попробую..
   AAlexandra
 
9 - 26.12.11 - 16:34
(7) Так ты удаляешь только колонки, сама ТаблицаДанных остается..
Правда, на форме она пользователю не видна, раз колонок на ней нету.
А хотелось бы и таблицу тоже удалить.
10
   AAlexandra
 
10 - 26.12.11 - 16:35
(9) ТаблицаДанных => ТаблицаФормы
 
 
   AAlexandra
 
11 - 26.12.11 - 16:42
Удаление:
ТаблицаФормы    = Элементы["МояНоваяТаблица"];
Для каждого КолонкаТаблицыФормы из ТаблицаФормы.ПодчиненныеЭлементы Цикл
    Элементы.Удалить( КолонкаТаблицыФормы );
КонецЦикла;
Элементы.Удалить( ТаблицаФормы );

Колонки нормально удаляются, сама ТаблицаФормы - нет.

Повторюсь, если создание и удаление таблицы формы происходит в ОДНОЙ процедуре (т.е. между ними нет обновления отображения, как я понимаю), код ошибки не вызывает.
14
   vmv
 
12 - 26.12.11 - 16:44
таблицу формы нужно удалить точно также

ЭтаФорма.ИзменитьРеквизиты(,мУдаляемыхРеквизитов);
ЭтаФорма.ИзменитьРеквизиты(,мУдаляемыхРеквизитов);

но на этапе удаления реквизита таблицы в мУдаляемыхРеквизитов должен быть один элемент реквизит формы типа "ТаблицаФормы"

полсе первого оператора у элемента формы "уйдет" путь к данным и он станет невидим, но элемент без пути тоже надо удалить, как-то так
15
   mozzga
 
13 - 26.12.11 - 16:44
делайте через ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>)
15
   vmv
 
14 - 26.12.11 - 16:46
(11) тогда форма не перерерисовывается на сервере - в памяти пришло, в памяти ушло
   AAlexandra
 
15 - 26.12.11 - 17:09
(12), (13) а если мне не нужно удалять РЕКВИЗИТ с формы?
Хотя программное создание и удаление реквизита меня вполне устроит =)

РЕЗЮМЕ: Ошибка не возникает, если реквизит также создавать программно и удалять ПЕРЕД удалением самой таблицы данных. Причем вручную удалять колонки не обязательно, при удалении ТаблицыФормы они удаляются сами.

Если кому интересно, работающий код:

Создание:
// тип добавляемых реквизитов формы - динамический список
 
ТипыРеквизита = Новый Массив;
ТипыРеквизита.Добавить(Тип("ДинамическийСписок"));
ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);

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

НоваяКолонкаТаблицы = Элементы.Добавить("КолонкаДокумент", Тип("ПолеФормы"), ТаблицаФормы);    
НоваяКолонкаТаблицы.ПутьКДанным = "_ДокументыНаСкладе.Документ";                    
    
Удаление:
// Удалим созданные ранее реквизиты формы..
 
МассивУдаляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов.Добавить( "_ДокументыНаСкладе" );
ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов);        

// .. и элементы формы    
 
Элементы.Удалить( Элементы["МояНоваяТаблица"]);     

jsmith82, Ochkarito, vmv, mozzga - спасибо всем БОЛЬШОЕ! =)

*без особой надежды*
А как на счет того, чтобы программно получить список доступных колонок из динамического списка? Есть варианты?
16
   vmv
 
16 - 26.12.11 - 17:23
(15) доступных слишком расплывчато.

в элементе формы(колонке) есть свойство доступность - его получить лекго если колонка видима, с видимостью все сложнее, там роли подцепляются и прочее, но елси она видима, то видима - при открытии все можно прочитать

по отборам тоже не сложно

типа так


//////////// Сброс отбора Договоров
 
    
    ТекущееПолеКДИмя = "ВидДокумента.ЯвляетсяДоговором";
    ТекущееПолеКД    =  Новый ПолеКомпоновкиДанных(ТекущееПолеКДИмя);
    
    ЭлементыОтбораСпискаДоговоров   = Список.Отбор.Элементы;
    мУдалитьЭлементыОтбораДоговоров = Новый Массив;                   
    
    Для каждого ЭлементОтбораСпискаДоговоров Из ЭлементыОтбораСпискаДоговоров Цикл
        Если ТипЗнч(ЭлементОтбораСпискаДоговоров) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
            Если ЭлементОтбораСпискаДоговоров.ЛевоеЗначение = ТекущееПолеКД Тогда
                мУдалитьЭлементыОтбораДоговоров.Добавить(ЭлементОтбораСпискаДоговоров);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Для каждого ЭлементОтбораСпискаДоговоров Из мУдалитьЭлементыОтбораДоговоров Цикл
        ЭлементыОтбораСпискаДоговоров.Удалить(ЭлементОтбораСпискаДоговоров);
    КонецЦикла;
    
    //////////// Установка отбора Договоров
 
    
    ТекущееПолеКДЗначение     = Истина;
    ТекущееПолеКДВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    
    ЭлементОтбораСписка = ЭлементыОтбораСпискаДоговоров.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбораСписка.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(ТекущееПолеКДИмя);
    ЭлементОтбораСписка.Использование  = Истина;
    ЭлементОтбораСписка.ПравоеЗначение = ТекущееПолеКДЗначение; 
    ЭлементОтбораСписка.ВидСравнения   = ТекущееПолеКДВидСравнения;
17
   AAlexandra
 
17 - 26.12.11 - 17:32
(16) Не совсем о том..
я хочу программно добавить на форму реквизит типа ДинамическийСписок, установить ему программно источник данных: основную таблицу / запрос. И потом программно отрисовать на форме таблицу со всеми колонками, которые получаются в запросе / есть в основной таблице.
Может как-то просто можно получить список колонок из реквизита формы - Динамического списка?
   vmv
 
18 - 26.12.11 - 17:43
Элементы.Список.ПодчиненныеЭлементы

разве не выдает вам коллекцию колонок дин. списка на клиенте со всей палитрой свойств?)

Правда есть подводный каменнь, если Элементы.Список.ПодчиненныеЭлементы
содержат в себе группы колонок, то эти группы нужно знать иобходить тоже

или написать функцию которая пудет делать обход
Элементы.Список.ПодчиненныеЭлементы запригивать в группы и собирать в массив только элементы колонки - это более практично и универсально, тогда можно группировать колонки на форме как хзочешь и этой функцияей их полечать, даже не помня имена групп.
   AAlexandra
 
19 - 26.12.11 - 17:56
Элементы.Список.ПодчиненныеЭлементы.Количество() = 0 в моем случае.
вот их-то (колонки) я и хочу его заполнить..
20
   vmv
 
20 - 26.12.11 - 18:15
(19) вы не создали реквизиты(колонки) в блоке кода, а лишь элементы(колонки)

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

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


надо примерно так добавить реквизиты-колонки, а потом реквизиты-элементы, при удалении аналогично. Я ни разу не пробовал создавать элементы формы без связанных с ними реквитами формы. Колонка таблицы формы - это такой же реквизит фырмы как и обычный, только вложенный. А элемент - это просто мусор на форме, если он не связан с реквизитом, допускаю только существование флажка без связи с реквизитом для управленния чем-либо на форме, пока она живет.


// Сформируем массивы реквизитов формы и элементов(колонок) относительно добавляемых колонок
 
    мДобавляемыеРеквизиты = Новый Массив;
    Для Каждого Колонка Из ТзИсточника.Колонки Цикл
        Если мПредопределенныхКолонок.Найти(Врег(Колонка.Имя)) <> Неопределено Тогда
           Продолжить;
        КонецЕсли;
        НовыйРеквизитФормы = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяТаблицыФормы, Колонка.Заголовок, Ложь); 
        мДобавляемыеРеквизиты.Добавить(НовыйРеквизитФормы);
    КонецЦикла;
    
    // После изменения реквизитов можно использовать новые пути к данным для новых колонок
 
    ЭтаФорма.ИзменитьРеквизиты(мДобавляемыеРеквизиты);
22
23
   vmv
 
21 - 26.12.11 - 18:17
РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяТаблицыФормы << третий параметр очень важен и легко ошибиться, если не прочесть СП)
   vmv
 
22 - 26.12.11 - 18:21
+(20) и только после создание реквизиов-колонок имеет смысл создавать элементы-колонки, т.к. у нас уже будут программно созданные пути и связи списка данных с реквизитами-колонками.

т.е. далее


Для Каждого Колонка Из ТзИсточника.Колонки Цикл
        Если мПредопределенныхКолонок.Найти(Врег(Колонка.Имя)) <> Неопределено Тогда
            Продолжить;
        КонецЕсли;
        НовыйЭлемент = Элементы.Добавить(ИмяТаблицыФормы + Колонка.Имя, Тип("ПолеФормы"), Тф);
        НовыйЭлемент.Вид         = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = ИмяТаблицыФормы + "." + Колонка.Имя;
    КонецЦикла;  

поправить дле своей таблицы(дин. списка)
   AAlexandra
 
23 - 26.12.11 - 18:23
(20) мой вопрос сводится к тому, как получить "ТзИсточника.Колонки", если ТзИсточника имеет тип "Динамический список".
И далее 2 варианта источника данных для него:
1) Основная таблица;
2) Произвольный запрос.
Программно я реквизиты-колонки не создавала, указания основной таблицы (или запроса) было достаточно, чтобы они создались платформой автоматически.

В режиме конструктора формы, когда добавляю новый реквизит-динамический список, реквизиты-колонки же у меня создаются автоматически, и я их визуально вижу в конструкторе формы, могу перетащить на поле формы - получатся элементы-колонки..

Можно ли, не создавая ПРОГРАММНО реквизиты-колонки, получить их список, как я его вижу в конструкторе формы?
25
27
28
   vmv
 
24 - 26.12.11 - 18:24
Элементы.Добавить(ИмяТаблицыФормы + Колонка.Имя, Тип("ПолеФормы"), Тф);

ИмяТаблицыФормы + Колонка.Имя - неприниципально, можно писать и
Колонка.Имя, просто при удалении/добавление нужно четко разделять реквизиты/элементы колонки и понимать какие там имена(идентичные с именами колонок списка или на форме к элементам-колонкам мы прилепили префикс)

усе, полный разклад по динамике таблицы формы, осталось только для себя заточить
   vmv
 
25 - 26.12.11 - 18:28
(23) нельзя, по крайней мере как я сказал, элементы формы(колонки, просто элементы) без привязки к реквизитам формы - по моему мнению просто мусор на форме.

Все же просто при динамическом создании

1. добавляем реквизиты-колонки, ибо они рождают пути
2. добавлем элементы-колонки с четкой связью с этими реквизитами и таблицей владельцем


при динамическом удалении
1. удаляем элементы-колонки
2. удаляем реквизиты-колонки
2. удаляем обновляем таблицу формы
26
   vmv
 
26 - 26.12.11 - 18:31
+(25) или если реквизиты-колонки уже родились, то вы их правильно не связяли с элементами-колонками. см. последний блок кода.

Ситуация

Элементы.Список.ПодчиненныеЭлементы.Количество() = 0

нонсенс, если все связи срослись)
   Гот
 
27 - 10.01.12 - 19:02
(23) Я делал через доступные поля отбора. Через ж, конечно, может кто подскажет, как сделать лучше?

Вот пример полностью


&НаСервере
Процедура ДобавитьТест()
    
    ТипыРеквизита = Новый Массив;
    ТипыРеквизита.Добавить(Тип("ДинамическийСписок"));
    ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);

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

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


Конецпроцедуры
   Гот
 
28 - 10.01.12 - 19:03
(23) Вот, если без лишнего кода...

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

 

Список тем форума

 
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.