Имя: Пароль:
 
1C
1С v8
УФ: программное создание/удаление таблицы формы
0 AAlexandra
 
26.12.11
15:57
Помогите, пожалуйста, разобраться:
1)Не получается программно удалить таблицу на форме.

Создаю так:

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

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

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

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

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

ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>)
3 AAlexandra
 
26.12.11
16:09
(1) читала, создание таблицы на форме делала по ней.. Про удаление ничего не нашла.
Что значит "получить реквизит через метод"?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

типа так


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

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

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

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

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

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


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


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

т.е. далее


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

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

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

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

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

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

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

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


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

Ситуация

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

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

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


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

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

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


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

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