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


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

Метки:

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

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

Создаю так:

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

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

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

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

ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>)
   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. Возможно некорректный синтаксис метода добавить
ЭлементыФормы.Добавить(<Тип>, <Имя>, <Видимость>, <ПоместитьНа>)
   vmv
 
6 - 26.12.11 - 16:18
ТаблицаФормы.ПутьКДанным = "ДокументыНаСкладе";

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

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

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

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

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

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

ТаблицаФормы    = Элементы["МояНоваяТаблица"];
Для каждого КолонкаТаблицыФормы из ТаблицаФормы.ПодчиненныеЭлементы Цикл
    Элементы.Удалить( КолонкаТаблицыФормы );
КонецЦикла;
Элементы.Удалить( ТаблицаФормы );

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

типа так

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

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

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

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

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

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


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


// Сформируем массивы реквизитов формы и элементов(колонок) относительно добавляемых колонок
    мДобавляемыеРеквизиты = Новый Массив;
    Для Каждого Колонка Из ТзИсточника.Колонки Цикл
        Если мПредопределенныхКолонок.Найти(Врег(Колонка.Имя)) <> Неопределено Тогда
           Продолжить;
        КонецЕсли;
        НовыйРеквизитФормы = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяТаблицыФормы, Колонка.Заголовок, Ложь); 
        мДобавляемыеРеквизиты.Добавить(НовыйРеквизитФормы);
    КонецЦикла;
    
   // После изменения реквизитов можно использовать новые пути к данным для новых колонок
 
    ЭтаФорма.ИзменитьРеквизиты(мДобавляемыеРеквизиты);
   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) Произвольный запрос.
Программно я реквизиты-колонки не создавала, указания основной таблицы (или запроса) было достаточно, чтобы они создались платформой автоматически.

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

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

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

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

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

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


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

Ситуация

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

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

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


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

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

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


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

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



Список тем форума
Рекламное место пустует   Рекламное место пустует
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует