Имя: Пароль:
1C
 
удаление программно добавленных реквизитов
, ,
0 Strimteam
 
02.08.16
15:00
Всем доброго дня.
Столкнулся с проблемой:
На форму добавляю свой реквизит типа "Строка", с отображением как "ПолеФормы". Затем при повторной активизации формы хочу проверить - добавлен ли реквизит на форму, и удалить его если он там есть.
Для добавления использую конструкцию:
НовыйРек = Новый РеквизитФормы(СтрЗаменить(ИмяРеквизита," ",""),ДопустимыеТипы,,ИмяРеквизита);
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(НовыйРек);
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);

Но при попытке найти такой реквизит чтобы его удалить на форме - система просто не находит его в Элементы.
Если использовать ЭтаФорма[ИмяРеквизита] - находит конкретно значение типа Строка. Сделать с ней, само собой, ничего нельзя.
Вопрос - как можно удалить элемент, если он был добавлен раньше программно?
1 lera01
 
02.08.16
15:08
Проверить, если есть - просто не добавлять. Это вариант?
2 Strimteam
 
02.08.16
15:11
(1) Мне скорее надо его удалить, так как имя реквизита могло изменится, и чтобы старый не мешал - сначала пытаюсь убрать ранее добавленные. Так что всё же нужно удалять.
3 Nuobu
 
02.08.16
15:15
4 f_vadim
 
02.08.16
15:21
Элементы.Найти
5 f_vadim
 
02.08.16
15:22
или тут старообрядцы?
6 Nuobu
 
02.08.16
15:23
(4) Тут реквизиты формы, а не элементы.
7 f_vadim
 
02.08.16
15:26
(6) обсыпал голову пеплом. и на всякий случай другие части тела.
8 Strimteam
 
02.08.16
15:28
(3) похоже что всё печально. У меня обработка внутри конфигурации, но созданные реквизиты так же не получить через Метаданные(). Значит пытаться искать элементы по наименованию, а затем "переопределять" элементы на другие реквизиты. Спасибо за ссылку.
9 Kuzen
 
02.08.16
15:31
(0) Так что удалить то надо "Элемент формы" или "Реквизит Формы"?
10 Kuzen
 
02.08.16
15:32
Если реквизит то есть второй параметр у ИзменитьРеквизиты

ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>)
11 Strimteam
 
02.08.16
15:33
(10) Чтобы использовать ИзменитьРеквизиты надо сначала найти этот реквизит, и в массив передать. А я не могу найти такие реквизиты, если они были добавлены на форму программно. Если есть рабочий пример использования - буду признателен.
12 Kuzen
 
02.08.16
15:34
(0) Твой код добавляет реквизит формы, элемент формы она не создает. Поэтому в элементах ты и не находишь скорее всего.
13 Strimteam
 
02.08.16
15:37
(12) Элементы создаю отдельно, и сами элементы найти можно.
НовоеПолеФормы=ЭтаФорма.Элементы.Добавить(СтрЗаменить(ИмяРеквизита," ",""),Тип("ПолеФормы"),НайденаяГруппа);
Но только я реквизит не могу найти, чтобы его удалить затем.
14 FIXXXL
 
02.08.16
15:43
(13) я при добавлении сохраняю в списки
и при удалении чищу по спискам

//управление программно созданными реквизитами
&НаСервере
Процедура ЗафиксироватьПрограммноСозданныеРеквизитыИЭлементы(РеквизитПС)
    
    //при обновлении формы необходимо полное перезаполнение,
    //состав программно сформированных колонок может изменится
    //сохраним названия созданных при открытии формы колонок,
    //перед обновлением информации удалим согласно списка
    
    СписокУдаляемыхРеквизитов.Добавить(РеквизитПС.Путь + "." + РеквизитПС.Имя);
    СписокУдаляемыхЭлементов.Добавить(РеквизитПС.Имя);
    
КонецПроцедуры

&НаСервере
Процедура УдалитьПрограммноСозданныеРеквизитыИЭлементы()
    
    //удаление ранее созданных программно колонок
    
    //убираем элементы формы
    Для каждого ЭлементФ Из СписокУдаляемыхЭлементов Цикл
        НайденныйЭлементФормы = ЭтаФорма.Элементы.Найти(ЭлементФ.Значение);
        Если НайденныйЭлементФормы <> Неопределено  Тогда
            ЭтаФорма.Элементы.Удалить(НайденныйЭлементФормы);
        КонецЕсли;
    КонецЦикла;
    
    //убираем реквизиты формы
    МассивУдаляемыхРеквизитов = Новый Массив;
    Для каждого ЭлементСписка Из СписокУдаляемыхРеквизитов Цикл
        МассивУдаляемыхРеквизитов.Добавить(ЭлементСписка.Значение);
    КонецЦикла;    
    ИзменитьРеквизиты(,МассивУдаляемыхРеквизитов);
    
    СписокУдаляемыхРеквизитов.Очистить();
    СписокУдаляемыхЭлементов.Очистить();
    
КонецПроцедуры
15 1sanekmaloi1
 
02.08.16
15:45
Зачем его искать?

<УдаляемыеРеквизиты> (необязательный)

Тип: Массив.
Массив, содержащий строки, описывающие пути к удаляемым реквизитам.
Удалять можно только ранее программно добавленные реквизиты.

В массиве Строки с путями и все.
16 Kuzen
 
02.08.16
15:49
//добавить реквизит
    ИмяРеквизита     = "Тест";
    Путь             = "";
    НовыйРек         = Новый РеквизитФормы(ИмяРеквизита,Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100)),Путь,ИмяРеквизита);
    МассивРеквизитов = Новый Массив;
    МассивРеквизитов.Добавить(НовыйРек);
    ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);
    //удалить реквизит
    МассивУдалить = Новый Массив;
    МассивУдалить.Добавить("Тест");
    ЭтаФорма.ИзменитьРеквизиты(,МассивУдалить);
17 Strimteam
 
02.08.16
16:12
(16) Спасибо
(15) Спасибо
(14) Спасибо
Так же оказалось полезной функция ЭтаФорма.ПолучитьРеквизиты() . Элементы при добавлении на форму, и работе с формой - нормально по поиску находятся. Если же было обращение к другой форме (у меня открывалась подчинённая форма), то при возврате к оригинальной форме - элементы на форме есть, но через Элементы их в общем списке нет. Зато через ЭтаФорма.ПолучитьРеквизиты() можно увидеть что был реквизит, а значит был и элемент формы.
Всем большое спасибо за решение.