|
Как без попытки написать "ЕслиЕстьРеквизит"? | ☑ | ||
---|---|---|---|---|
0
bolobol
07.12.22
✎
14:40
|
Добрый!
Как сделать код "ЕслиЕстьРеквизит" без попытки?: Попытка ЧтотоТамСделать(ЧтотоТут.КонтактноеЛицо); // Если есть реквизит КонтактноеЛицо Исключение ЧтотоТамСделатьЕслиЕстьРеквизит(ЧтотоТут); // Если нет реквизита КонтактноеЛицо КонецПопытки; Спасибо! |
|||
1
ДНН
07.12.22
✎
14:41
|
(0) через Метаданные
|
|||
2
Табуретко
07.12.22
✎
14:42
|
||||
3
bolobol
07.12.22
✎
14:42
|
Сложна! Попроще бы
|
|||
4
Asmody
07.12.22
✎
14:43
|
В БСП есть метод.
Ну или такое - по мотивам: Функция ЕстьРеквизитОбъекта(Переменная, Знач ИмяРеквизита) Экспорт Перем проверка, контроль; контроль = Новый УникальныйИдентификатор; Попытка проверка = Новый Структура(ИмяРеквизита, контроль); Исключение // в имя реквизита передали какую-то дичь Возврат Ложь; КонецПопытки; Если проверка.Количество() > 1 Тогда // в имя реквизита передали строку со списком. такое не проверяем Возврат Ложь; КонецЕсли; ЗаполнитьЗначенияСвойств(проверка, Переменная); Возврат проверка[ИмяРеквизита] <> контроль; КонецФункции |
|||
5
bolobol
07.12.22
✎
14:44
|
Точно! Прям так и называется же! Спасибо!!
|
|||
6
Kassern
07.12.22
✎
14:45
|
(5) А там всего 1 строчка) НЕ (МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено)
|
|||
7
bolobol
07.12.22
✎
14:46
|
Блин, да... Стандартные реквизиты не смотрит тоже
|
|||
8
Fragster
гуру
07.12.22
✎
14:47
|
УИ = Новый УникальныйИдентификатор();
СтруктураДляПроверки = Новый структура("ИмяРеквизита", УИ); ЗаполнитьЗначенияСвойств(СтруктураДляПроверки, ПроверяемыйОбъект); ЕстьРеквизит = СтруктураДляПроверки.ИмяРеквизита <> УИ; |
|||
9
arsik
гуру
07.12.22
✎
14:51
|
(7) Ну так свою напиши.
|
|||
10
Eiffil123
07.12.22
✎
14:51
|
(8) кстати, хороший лайфхак.
|
|||
11
Kassern
07.12.22
✎
14:53
|
(8) (10) Я бы рассматривал метод Свойство()
|
|||
12
Fragster
гуру
07.12.22
✎
14:53
|
(10) да я уже после увидел, что в (4) он же, но с обработкой мусора на входе
|
|||
13
Fragster
гуру
07.12.22
✎
14:54
|
(11) ну и где у "СправочникОбъект" этот метод?
|
|||
14
Kassern
07.12.22
✎
14:57
|
(13) а где сказано в (0), что речь про СправочникОбъект?)
Для ДанныеФормыСтруктура вполне себе работает. |
|||
15
Fragster
гуру
07.12.22
✎
15:00
|
(14) а где в (0) про ДанныеФормыСтруктура?
|
|||
16
bolobol
07.12.22
✎
15:05
|
(8) Только если Реквизит не с типом УникальныйИдентификатор вдруг)
Спасибо!! |
|||
17
Kassern
07.12.22
✎
15:06
|
(15) Разница лишь в том, что я не утверждаю, что метод не рабочий. Из задачи, не понятно, где и как будет это использоваться, поэтому (11) имеет место быть.
(16) Новый УникальныйИдентификатор()<>Новый УникальныйИдентификатор(). Так, что не переживайте) |
|||
18
bolobol
07.12.22
✎
15:09
|
(17) До кучи - это же будет получение всех реквизитов объекта... Вот где собака порылась!
|
|||
19
Kassern
07.12.22
✎
15:11
|
(18) А в ЗаполнитьЗначенияСвойств думаете не будет получения всех реквизитов объекта?
|
|||
20
bolobol
07.12.22
✎
15:12
|
(19) Я об этом и написал жэ...
|
|||
21
Kassern
07.12.22
✎
15:13
|
(18) В общем, если работаете с формой и хотите проверить есть или нет у объекта реквизит, то можете воспользоваться методом Свойство(), без контекста формы, можете использовать метод БСП с метаданными, или же (8) как вариант.
|
|||
22
Kassern
07.12.22
✎
15:13
|
(20) значит я вас не так понял.
|
|||
23
Fragster
гуру
07.12.22
✎
15:16
|
(18) от справочникОбъект - не будет (уже и так есть). От СправочникСсылка - будет, причем при попытке и получении через точку - тоже будет.
|
|||
24
bolobol
07.12.22
✎
15:47
|
Да, только через Метаданные, похоже, вариант. Если не Форма, где Свойство, возможно, спасает
|
|||
25
Eiffil123
07.12.22
✎
16:08
|
(21) но реквизит формы можно создать программно, это не значит что у объекта есть этот реквизит
|
|||
26
bolobol
07.12.22
✎
16:44
|
В общем, написал такое, не очень-то проверял, правда..
Функция ЕстьРеквизит(ПроверяемыйОбъект, ИмяРеквизита, РазделМетаданных= "Реквизиты") Экспорт Возврат НЕ ПроверяемыйОбъект.Метаданные()[РазделМетаданных].Найти(ИмяРеквизита) = Неопределено; КонецФункции Действительно - одна строка) Реквизиты, ТабличныеЧасти, а вот со СтандартныеРеквизиты не работает.. |
|||
27
ass1c
07.12.22
✎
17:20
|
(26) добавь в свою функцию
ОбщегоНазначения.ЭтоСтандартныйРеквизит(ПроверяемыйОбъект.Метаданные().СтандартныеРеквизиты, ИмяРеквизита) Функция общего модуля ЕРП (из БСП видимо): // Возвращает признак того, что реквизит входит в подмножество стандартных реквизитов. // // Параметры: // СтандартныеРеквизиты - ОписанияСтандартныхРеквизитов - тип и значение, описывающие коллекцию настроек различных // стандартных реквизитов; // ИмяРеквизита - Строка - реквизит, который необходимо проверить на принадлежность множеству стандартных // реквизитов. // // Возвращаемое значение: // Булево - Истина, если реквизит входит в подмножество стандартных реквизитов. // Функция ЭтоСтандартныйРеквизит(СтандартныеРеквизиты, ИмяРеквизита) Экспорт Для Каждого Реквизит Из СтандартныеРеквизиты Цикл Если Реквизит.Имя = ИмяРеквизита Тогда Возврат Истина; КонецЕсли; КонецЦикла; Возврат Ложь; КонецФункции |
|||
28
TormozIT
гуру
08.12.22
✎
07:30
|
Способ через ЗаполнитьЗначенияСвойств() довольно долгий. В частом коде его применять не выгодно. Намного быстрее обычная Попытка.
|
|||
29
НафНаф
08.12.22
✎
07:47
|
(28) в общем случае "довольно долгий" или даже на структуре, состоящей всего из одного поля?
|
|||
30
TormozIT
гуру
08.12.22
✎
08:14
|
(29) Да, грубо раз в 10 дольше чем попытка.
|
|||
31
TormozIT
гуру
08.12.22
✎
08:15
|
Я про (8)
|
|||
32
toypaul
гуру
08.12.22
✎
09:06
|
код в (8) есть в типовой функции УТ. так что свою можно не писать.
|
|||
33
НафНаф
08.12.22
✎
10:22
|
(30) вроде бы вопрос альтернативный...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |