Проверка на наличие реквизита в форме

1. user1563139 14.10.21 09:32 Сейчас в теме
Здравствуйте!
Подскажите как мне сделать проверку в форме на наличие реквизита.
При открытии формы программно создается реквизит и нужно поставить проверку,
если есть такой реквизит пропустить, если нет тогда создает.
Я делаю вот так:

Если ЭтаФорма[НаименованиеРеквизита] = Неопределено Тогда
Сообщить(1);
Иначе
Сообщить(2);
КонецЦикла;


Тут получаю ошибка Поле объекта не обнаружено
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. noprogrammer 237 14.10.21 09:39 Сейчас в теме
(1) На текущий момент времени (на сколько я понимаю) нет возможности проверить существование добавленного реквизита кроме как через "попытка\исключение"
2. BullTi 14.10.21 09:37 Сейчас в теме
Посмотрите как работает функция ЗначениеЗаполнено(), скорее всего вам подойдет
3. noprogrammer 237 14.10.21 09:38 Сейчас в теме
(2) Нет, не подойдет, ему нужно не значение реквизита проверить а существует ли сам реквизит (создан или нет)
8. BullTi 14.10.21 09:50 Сейчас в теме
(3) при использовании ЗначениеЗаполнено Для Неопределено и Null всегда возвращается Ложь.
Честно не сталкивался ни разу с проверкой реквизита на форме, думал что если реквизита нет как раз и возвращает Неопределено или Null , могу быть не прав, сам только недавно программист
11. Release 14.10.21 09:55 Сейчас в теме
(8)Насколько я помню, будет вызвано исключение: "поле объекта не существует".
noprogrammer; +1 Ответить
13. noprogrammer 237 14.10.21 12:19 Сейчас в теме
5. Release 14.10.21 09:39 Сейчас в теме
ПолучитьРеквизиты (GetAttributes)
Синтаксис:
ПолучитьРеквизиты(<Путь>)
Параметры:
<Путь> (необязательный)
Тип: Строка. 
Указывает путь к родительскому реквизиту. Если параметр опущен или указана пустая строка, возвращаются реквизиты верхнего уровня.
Возвращаемое значение:
Тип: Массив. 
Массив объектов РеквизитФормы.
Описание:
Получает описание реквизитов формы.
Показать
Istur; Aliya_St; GV.; Raf_f; Kutuzov; noprogrammer; +6 1 Ответить
6. noprogrammer 237 14.10.21 09:40 Сейчас в теме
(5) точно, совсем забыл про это.
7. soft_wind 14.10.21 09:41 Сейчас в теме
используйте Попытку

&НаКлиенте
Функция  ПроверитьРеквизит(ИмяРеквизита)
	
	Попытка
		тест = ЭтаФорма[ИмяРеквизита];
		ЕстьРеквизит = Истина;
	Исключение
		ЕстьРеквизит = Ложь;
	КонецПопытки;

	Возврат ЕстьРеквизит;

КонецФункции 

Показать
9. user1563139 14.10.21 09:53 Сейчас в теме
Спасибо всем! Попытка помогла
10. Release 14.10.21 09:53 Сейчас в теме
Или универсально для любого объекта:
Функция ЕстьСвойствоОбъекта(Объект, ИмяСвойства) Экспорт
	ЕстьСвоство = Ложь;
	
	Структура = Новый Структура(ИмяСвойства, Неопределено);
	
	ЗаполнитьЗначенияСвойств(Структура, Объект);
	
	Если Структура[ИмяСвойства] = Неопределено Тогда
		Структура[ИмяСвойства] = Ложь;
		
		ЗаполнитьЗначенияСвойств(Структура, Объект);
		
		Если Структура[ИмяСвойства] <> Ложь Тогда
			ЕстьСвоство = Истина;
		КонецЕсли;
	Иначе
		ЕстьСвоство = Истина;
	КонецЕсли;
	
	Возврат ЕстьСвоство;
КонецФункции
Показать

Не люблю умышленно создавать исключения.
al-e-ks; BrainWashed; Garik8866; Dolp4in; mc2; kabantus; Anatolia; Rataev; Valerianich; Vary; igor_karma; Yury1001; Sanario; fokses; frkbvfnjh; xdt_savon; gofforsk; Aili; romanpolyashov@yandex.ru; independ; wau8824ru; user797130; collider; NeLenin; Kutuzov; 33lab; +26 Ответить
24. quisl 24.01.23 03:07 Сейчас в теме
(10)
Функция ЕстьСвойствоОбъекта(Знач Объект, ИмяСвойства) Экспорт
ЕстьСвоство = Ложь;

Структура = Новый Структура(ИмяСвойства, Неопределено);

ЗаполнитьЗначенияСвойств(Структура, Объект);

Если Структура[ИмяСвойства] = Неопределено Тогда
Структура[ИмяСвойства] = Ложь;

ЗаполнитьЗначенияСвойств(Структура, Объект);

Если Структура[ИмяСвойства] <> Ложь Тогда
ЕстьСвоство = Истина;
КонецЕсли;
Иначе
ЕстьСвоство = Истина;
КонецЕсли;

Возврат ЕстьСвоство;
КонецФункции
Показать

Так получше будет
igor_karma; +1 Ответить
25. Release 24.01.23 14:19 Сейчас в теме
(24) Непринципиально вообще. В конкретной реализации данные объекта не изменяются, а только считываются.
12. d.batovskiy 14.10.21 11:55 Сейчас в теме
// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным.
//
// Параметры:
//  Объект       - Произвольный - объект, у которого нужно проверить наличие реквизита или свойства;
//  ИмяРеквизита - Строка       - имя реквизита или свойства.
//
// Возвращаемое значение:
//  Булево - Истина, если есть.
//
Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт
	
	КлючУникальности   = Новый УникальныйИдентификатор;
	СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
	ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);
	
	Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;
	
КонецФункции
Показать
user1671936; chemezov; WindFinder; magv; prosto_username; user1890910; walp; andrew_alen; raul19996; Altez50; Renesans; mc2; hcooh; kabantus; avmironov; igmis; user1840125; Valerianich; BlinOFF; silkwey; Pavel_Vladivostok; Demlan; wauri; eufes; zoikins; rusmil; Alex17; redsun; fieryfist; Nihonjin; frkbvfnjh; pavlov_a; katrineKA; eaa; mip128; rpgshnik; Mallok; z.snega; NeLenin; arshanskiyav; tdml; Kutuzov; Sergey_Borisovi4; GRAFin.by; volkov-mv; +45 Ответить
23. frkbvfnjh 787 23.11.22 10:49 Сейчас в теме
(12) Это гениально!
user1890910; zoikins; +2 Ответить
27. BarsukM 27.07.23 13:24 Сейчас в теме
(12)
Вероятно позабыли указать что это функция БСП
ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта
Fatenm; WindFinder; Teplotrassamen; vita8383; prosto_username; Valerianich; user1890910; HIVvich; raul19996; ipzotov; user717534; hcooh; kabantus; Antonio; avmironov; +15 Ответить
28. Seaflame 10.04.24 11:09 Сейчас в теме
(27)
ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта

Человек, ты красавчик, в БСП много всяких вкусняшек и про них забываешь/не знаешь. Я в пятницу за тебя подниму бокал (жаль имя не знаю)
14. dvk09 2 20.10.21 12:01 Сейчас в теме
Для обычных форм:
ЭтаФорма.ЭлементыФормы.Найти("Реквизит") = Неопределено

Или
ЭлементыФормы.Найти("Реквизит") = Неопределено

Если прямо в форме ищем...


Для управляемых "ЭтаФорма" не сработает вроде)) (Если не ошибаюсь, то там просто "Форма", и не "ЭлементыФормы" а "Элементы")
Но реквизиты формы есть только у управляемых форм.
Там их так же можно поискать, добавить, добавить элемент и привязать к реквизиту...
BenDigget; kabantus; AnPet; +3 2 Ответить
15. FatPanzer 20.10.21 12:06 Сейчас в теме
(14) Зачем вы ищете элементы, если автор хочет найти реквизиты?
16. dvk09 2 21.10.21 04:59 Сейчас в теме
18. user591389_aska_rabota 03.11.21 23:07 Сейчас в теме
(15)
Элементы обычно создают одновременно с реквизитами
поэтому как вариант можно и элементы проверять
17. dvk09 2 21.10.21 05:59 Сейчас в теме
В (12) похоже на решение.
19. IVC_goal 215 06.06.22 06:38 Сейчас в теме
(12) Вообще то вопрос был поиска реквизита на форме, а не в объекте
20. laperuz 46 06.06.22 08:09 Сейчас в теме
(19)А в чем проблема вызвать
ЕстьРеквизитИлиСвойствоОбъекта(ЭтаФорма, "Реквизит1")
?
Вполне работает, причем даже из клиентского контекста.
user1671936; mc2; AnPet; +3 Ответить
21. d.batovskiy 06.06.22 20:13 Сейчас в теме
(19)Вообще-то Объект - это произвольный объект, это может быть и сама форма.
22. Maden 18.07.22 09:06 Сейчас в теме
Функция ЗначениеСвойстваОбъекта(Объект, ИмяСвойства, ЗначениеСвойства) Экспорт
  Структура = Новый Структура(ИмяСвойства);
  ЗаполнитьЗначенияСвойств(Структура, Объект);  
  Возврат Структура.Свойство(ИмяСвойства,ЗначениеСвойства)
  И ЗначениеЗаполнено(ЗначениеСвойства)
КонецФункции
26. Eeeehhhh 24.05.23 15:53 Сейчас в теме
Я так к слову, если нужно к примеру обойти элементы формы и установить признак Доступность, то для декорации формы
Структура = Новый Структура("Доступность");
ЗаполнитьЗначенияСвойств(Структура, Элемент);
выдаст ошибку для декорации формы.
29. ya_anton 25 12.04.24 12:27 Сейчас в теме
ЭтаФорма.Элементы.Найти("Реквизит") = Неопределено
Оставьте свое сообщение

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