Имя: Пароль:
1C
 
Как без попытки написать "ЕслиЕстьРеквизит"?
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) вроде бы вопрос альтернативный...
Независимо от того, куда вы едете — это в гору и против ветра!