Удаление программно созданных реквизитов формы

1. val_ka 25.06.21 05:15 Сейчас в теме
Как удалить реквизиты, которые были созданы программно?
По теме из базы знаний
Найденные решения
10. Неопределено 91 25.06.21 09:22 Сейчас в теме
(9)
РеквизитыФормы = ЭтаФорма.ПолучитьРеквизиты(); //Точки в шапке цикла – не круто
МассивУдаляемых = Новый Массив; //Не надо делать в цикле то, что можно сделать один раз
Для Каждого РеквизитФормы Из РеквизитыФормы Цикл
	ИмяРеквизита = РеквизитФормы.Имя; //Не надо каждый раз обращаться к нему через точку
	Если СтрНайти(ИмяРеквизита, "Смета") И Не СтрНайти(ИмяРеквизита, "ТекущаяСмета") Тогда //Двойное условие выглядит круче, чем условие в условии; Сравнение с нулём можно заменить на неявное сравнение с типом булево
		МассивУдаляемых.Добавить(ИмяРеквизита);
	КонецЕсли;
КонецЦикла;
ИзменитьРеквизиты( , МассивУдаляемых); //Не надо делать в цикле то, что можно сделать один раз
Показать
METZEN2010; user1988332; Skrasnikov; lesha_edo; smile6601; dvk09; FatPanzer; +7 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Dr.HiHi 2 25.06.21 05:24 Сейчас в теме
ФормаКлиентскогоПриложения (ClientApplicationForm)
ИзменитьРеквизиты (ChangeAttributes)
Синтаксис:
ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>)
Параметры:
<ДобавляемыеРеквизиты> (необязательный)
Тип: Массив.
Массив, содержащий объекты типа РеквизитФормы.
Добавлять можно реквизиты верхнего уровня и вложенные реквизиты, являющиеся колонками.
К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект.<Имя реквизита>.
<УдаляемыеРеквизиты> (необязательный)
Тип: Массив.
Массив, содержащий строки, описывающие пути к удаляемым реквизитам.
Удалять можно только ранее программно добавленные реквизиты.
Описание:
Изменяет структуру реквизитов формы.
Сначала выполняется удаление реквизитов. Таким образом массивы добавляемых и удаляемых реквизитов могут содержать реквизиты с одинаковым путём.
Внимание! Действия добавления и удаления выполняются за один вызов. Следует учитывать, что операция изменения состава реквизитов является ресурсоемкой, поэтому операции изменения состава реквизитов формы выполняются пакетным образом.
Доступность:
Сервер, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.2.
Описание изменено в версии 8.3.16.
3. val_ka 25.06.21 05:44 Сейчас в теме
(2) Про это знаю. Как получить сами реквизиты, чтобы их удалить потом используя этот способ.

Нашла способ
ЭтаФорма.ПолучитьРеквизиты()


Пробую
4. val_ka 25.06.21 06:40 Сейчас в теме
Если вдруг кому-нибудь понадобится

Для каждого Рек Из  ЭтаФорма.ПолучитьРеквизиты() Цикл
		
			Если СтрНайти(Рек.Имя, "Смета") <> 0 Тогда
				
					Если  СтрНайти(Рек.Имя, "ТекущаяСмета") <> 0 Тогда
						Продолжить;				
					КонецЕсли;
					
					 Массив = Новый Массив;
					 Массив.Добавить(Рек.Имя);
					 ИзменитьРеквизиты(,Массив);			
				
			КонецЕсли;		
		
		КонецЦикла;
Показать
5. Неопределено 91 25.06.21 06:44 Сейчас в теме
6. Dr.HiHi 2 25.06.21 07:45 Сейчас в теме
(4) в цикле собирайте реквизиты в массив, а после обхода, если массив не пустой, выполняйте ИзменитьРеквизиты
ну и условия можно объединить, что более красивее выглядило;))
7. Kolesonik 14 25.06.21 08:53 Сейчас в теме
(6)наверно подразумевается, что в условие попадёт только единожды поэтому процедура в цикле
8. Kolesonik 14 25.06.21 08:59 Сейчас в теме
(6)вот почему нельзя проверить просто на ="Смета", я не понял
9. val_ka 25.06.21 09:08 Сейчас в теме
(8) Потому что "ТекущаяСмета" это реквизит формы, который не создан программно и мне он нужен всегда.
11. Kolesonik 14 25.06.21 09:29 Сейчас в теме
(9)это я понял, но ведь рек.Имя<>"Смета" в таком случае
13. val_ka 25.06.21 10:01 Сейчас в теме
(11) Потому что это часть названия реквизита, Полное имя реквизитов "Смета1", "Смета2" и т.д.
15. Kolesonik 14 25.06.21 10:02 Сейчас в теме
10. Неопределено 91 25.06.21 09:22 Сейчас в теме
(9)
РеквизитыФормы = ЭтаФорма.ПолучитьРеквизиты(); //Точки в шапке цикла – не круто
МассивУдаляемых = Новый Массив; //Не надо делать в цикле то, что можно сделать один раз
Для Каждого РеквизитФормы Из РеквизитыФормы Цикл
	ИмяРеквизита = РеквизитФормы.Имя; //Не надо каждый раз обращаться к нему через точку
	Если СтрНайти(ИмяРеквизита, "Смета") И Не СтрНайти(ИмяРеквизита, "ТекущаяСмета") Тогда //Двойное условие выглядит круче, чем условие в условии; Сравнение с нулём можно заменить на неявное сравнение с типом булево
		МассивУдаляемых.Добавить(ИмяРеквизита);
	КонецЕсли;
КонецЦикла;
ИзменитьРеквизиты( , МассивУдаляемых); //Не надо делать в цикле то, что можно сделать один раз
Показать
METZEN2010; user1988332; Skrasnikov; lesha_edo; smile6601; dvk09; FatPanzer; +7 Ответить
12. Kolesonik 14 25.06.21 09:59 Сейчас в теме
(10)а почему нельзя обращаться к свойству реквизита через точку в цикле, можете объяснить?
14. FatPanzer 25.06.21 10:02 Сейчас в теме
(12) Можно. Но только один раз. А если надо несколько раз - правильно вывести его в отдельную переменную. Потому что обращение через точку - это по сути своей поиск по имени свойства в коллекции свойств. Зачем каждый раз запускать поиск?
17. Неопределено 91 25.06.21 10:04 Сейчас в теме
(12) Я не писал, что этого нельзя делать. Можно, просто оптимальнее будет зафиксировать значение в отдельной переменной и в следующие разы обращаться напрямую к нему.
18. Kolesonik 14 25.06.21 10:08 Сейчас в теме
(17)и насчёт оптимальности, неужели необходимо использовать стрнайти, почему просто сравнением не сделать?
19. Неопределено 91 25.06.21 10:19 Сейчас в теме
(18) Я без понятия как там называются реквизиты и сколько их. Если нам нужна максимальная эффективность, а там только один реквизит, можно захардкодить его имя, заодно избавившись от цикла. Представленное решение является универсальным.
16. val_ka 25.06.21 10:04 Сейчас в теме
(10)Спасибо! Только учусь. Учла ваши комментарии
20. dvk09 2 26.06.21 22:47 Сейчас в теме
(10)
Сравнение с нулём можно заменить на неявное сравнение с типом булево


А вот про это не знал, потестим.
Если действительно так, то Спасибо.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот