|
УФ: программное создание/удаление таблицы формы | ☑ | ||
---|---|---|---|---|
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) Вот, если без лишнего кода...
ДоступныеПоляОтбора = ЭтаФорма._ТаблРегистрБухгалтерии.Отбор.ДоступныеПоляОтбора; Для Каждого Реквизит Из ДоступныеПоляОтбора.Элементы Цикл Попытка Сообщить(Реквизит.Поле); НоваяКолонкаТаблицы = Элементы.Добавить("Колонка" + Реквизит.Поле, Тип("ПолеФормы"), ТаблицаФормы); НоваяКолонкаТаблицы.ПутьКДанным = "_ТаблРегистрБухгалтерии."+ Реквизит.Поле; Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |