Имя: Пароль:
1C
 
Как проверить наличие предопределённого элемента?
,
0 bolobol
 
02.11.22
13:42
Добрый!

Подскажите, пожалуйста, есть ли какой прямой способ проверить наличие предопределённого элемента, чтоб без попыток при получении?

Спасибо.
1 RomanYS
 
02.11.22
13:46
(0) как минимум запросом
2 Garykom
 
гуру
02.11.22
13:48
При использовании в конфигурации Библиотеки стандартных подсистем (БСП) версии 2.1.4 и выше рекомендуется использовать функцию ПредопределенныйЭлемент общего модуля ОбщегоНазначения или ОбщегоНазначенияКлиент, которая возвращает Неопределено для несуществующих в ИБ предопределенных элементов:

  ... = ОбщегоНазначенияКлиент.ПредопределенныйЭлемент("ПланВидовРасчета.Начисления.ОкладПоЧасам");
3 bolobol
 
02.11.22
13:51
Ах вот где он должен быть! Спасибо! Сейчас туда и присунем)
4 Dmitrii
 
гуру
02.11.22
14:12
(0) Система стандартов и методик разработки конфигураций
https://its.1c.ru/db/v8std#content:443:hdoc
Для получения значения ссылок на предопределенные элементы справочников, ... в коде, ..., предназначена функция глобального контекста ПредопределенноеЗначение.
Например.

ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо");

При использовании в конфигурации Библиотеки стандартных подсистем (БСП) версии 2.1.4 и выше рекомендуется использовать функцию ПредопределенныйЭлемент общего модуля ОбщегоНазначения или ОбщегоНазначенияКлиент, которая возвращает Неопределено для несуществующих в ИБ предопределенных элементов. При этом не следует реализовывать дополнительные механизмы кеширования на клиенте предопределенных значений. Указанные выше функции не ухудшают клиент-серверное взаимодействие: серверный вызов выполняется только при первом обращении к значению, а результат автоматически кешируется.

https://its.1c.ru/db/bsp315doc#content:289:hdoc
5 Guk
 
02.11.22
14:24
(4) а можно коротенько объяснить, не вдаваясь в излишние подробности, чем вот это
ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо");
кардинально будет отличаться от вот этого
ЮрФизЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;?

быстродействием, оптимальным обращением к серверу, чем-то еще?...
6 bolobol
 
02.11.22
14:26
(5) Не работает на клиенте, не работает в отсутствии предопределённого значения
7 lodger
 
02.11.22
14:29
(5) функция (которая на самом деле директива) ПредопределенноеЗначение заменяется на гуид элемента при трансляции в код.
обращение через менеджер Перечисления триггерит вычисление гуида при каждом входе в эту процедуру и выполнении строки кода уже после трансляции.
8 lodger
 
02.11.22
14:30
- (7)

перечитал в сп

Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Вызов метода выполняет обращение к серверу.
Примечание:
Результат выполнения кэшируется при первом обращении до изменения конфигурации или версии платформы.
9 lodger
 
02.11.22
14:31
+ (8) функция обладает собственным кешем в области исполнения (клиент или сервер) и держит в памяти карту "имя"-гуид.
10 Dmitrii
 
гуру
02.11.22
14:36
(5) >>  можно коротенько объяснить?

Нет.

ЮрФизЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ЮридическоеЛицо");

ничем не будет отличаться от.

ЮрФизЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;

Во всяком случае, начиная с версии платформы до 8.3.18.
Если элемента ЮридическоеЛицо у перечисления ЮридическоеФизическоеЛицо нет, будет вызвано исключение.
До 8.3.18 метод ПредопределенноеЗначение() в случае отсутствия элемента перечисления вернёт пустую ссылку на перечисление, не вызвав исключения.
В случае с предопределенными элементами справочников, бизнес-процессов, ПВХ и т.д. разницы не будет никакой.

Чтобы не заморачиваться с возможной проблемой отсутствия предопределенного элемента, проще использовать метод БСП ОбщегоНазначения.ПредопределенныйЭлемент().
Но, с точки зрения производительности, это не самый лучший вариант, т.к. этот метод выполняет кучу дополнительных телодвижений, включая обращение к метаданным.
Но зато не вызывает исключения, а в случае отсутствия предопределенного элемента вернёт значение Неопределено.

Ну и про кеширование сказали выше.