ЕстьСвойство() - функция, определяющая наличие у объекта свойства или реквизита с определенным именем

17.03.25

Разработка - Универсальные функции

Еще одна реализация функции для проверки наличия указанного свойства или реквизита у указанного объекта.

Понадобилась функция для определения наличия свойства или реквизита у конкретного объекта для самописной конфигурации. В интернете представлено несколько вариантов реализации данного функционала. В различных вариантах подобных функций, представленных в интернете, в структуру помещается  или null, или Неопределено и т.п. И затем вызывается метод ЗаполнитьЗначенияСвойств() и проверяется на равенство в структуре на null или Неопределено и т.п. соответственно.

Хочу представить аудитории еще один вариант функции для проверки наличия свойства, в которой в структуру помещается сама эта же структура:

// ЕстьСвойство(Объект, Свойство)
Функция ЕстьСвойство(Объект, Свойство)
	
	Структура = Новый Структура;
	Структура.Вставить(Свойство, Структура);
	ЗаполнитьЗначенияСвойств(Структура, Объект);
	ЕстьСвойство = (Структура[Свойство] <> Структура);
	Возврат ЕстьСвойство;
	
КонецФункции // ЕстьСвойство()

Функция возвращает: Истина - есть свойство с таким именем; ложь - нет свойства с таким именем.
Как это работает:

  1. Создается структура;
  2. Структура помещается сама в себя;
  3. К Структуре применяется ЗаполнитьЗначенияСвойств();
  4. Смотрим что произошло со Структурой. Если Структура никак не изменилась, значит данного Свойства нет.

Если со Структурой произошли изменения, значит данное Свойство есть. 

Все. 

Функция тестировалась на платформе 8.3.9.2170.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3318    Abysswalker    7    

44

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    6169    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    48208    dimanich70    83    

169

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7257    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    60141    atdonya    31    

69

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9034    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. awk 745 17.03.25 14:47 Сейчас в теме
17.03.2025 - 8.3.9 - Печаль.
9. provadyuga 107 17.03.25 16:24 Сейчас в теме
(1) Сейчас протестировал на 8.3.26.1540. Функция успешно отработала и выдала правильный результат.
2. Evg-Lylyk 5236 17.03.25 14:58 Сейчас в теме
На этот код будут ругаться различные анализаторы. Можно в качестве значения использовать Новый Массив.
provadyuga; +1 Ответить
3. Mshaydurov 2 17.03.25 15:11 Сейчас в теме
(2) Вставлять новый УникальныйИдентификатор() и сравнивать с ним как вариант
4. SlavaKron 17.03.25 15:26 Сейчас в теме
Это разве не циклическая ссылка и утечка памяти как результат?
BigB; awk; ardn; provadyuga; +4 Ответить
6. provadyuga 107 17.03.25 16:08 Сейчас в теме
(4) Дело в том, что в памяти находится всегда только один экземпляр Структуры. А в нее под Свойством помещается все лишь ссылка (на саму себя). Так что утечек не должно быть.
8. SlavaKron 17.03.25 16:18 Сейчас в теме
(6) Если включить проверку циклических ссылок, то ругается:
&НаКлиенте
Процедура Команда1(Команда)
	Команда1НаСервере();
КонецПроцедуры

&НаСервере
Процедура Команда1НаСервере()
	Структура = Новый Структура;
	Структура.Вставить("Структура", Структура);
КонецПроцедуры
Показать
Прикрепленные файлы:
BigB; ixijixi; +2 Ответить
10. provadyuga 107 17.03.25 16:53 Сейчас в теме
(8) Какая версия платформы? Я сейчас в 8.3.26.1540 создал чистую базу, добавил обработку с кодом. Все запустилось.
Прикрепленные файлы:
11. SlavaKron 17.03.25 17:47 Сейчас в теме
(10) Чистая файловая 8.3.25.1394. Режим совместимости не используется.
Попробуйте, кстати, передать такую структуру с сервера на клиент.
12. provadyuga 107 17.03.25 19:06 Сейчас в теме
(11) Согласен насчет циклической ссылки. Код функции содержит циклическую ссылку. О циклических ссылка написано здесь.
Но тогда после проверки
ЕстьСвойство = (Структура[Свойство] <> Структура);
можно добавить строку
Структура[Свойство] = Неопределено
Чтобы явно освободить ссылку в Структуре перед окончанием работы функции.
Тогда код функции станет таким:
// ЕстьСвойство(Объект, Свойство)
Функция ЕстьСвойство(Объект, Свойство)
	
	Структура = Новый Структура;
	Структура.Вставить(Свойство, Структура);
	ЗаполнитьЗначенияСвойств(Структура, Объект);
	ЕстьСвойство = (Структура[Свойство] <> Структура);
	Структура[Свойство] = Неопределено;
	Возврат ЕстьСвойство;
	
КонецФункции // ЕстьСвойство()
Показать

Можно еще, как написал Evg-Lylyk в (2), использовать в Структуре
Новый Массив
вместо ссылки на саму себя.
5. Evg-Lylyk 5236 17.03.25 15:39 Сейчас в теме
(3) Так в БСП так и работает, но этот вариант видимо автору не понравился
7. provadyuga 107 17.03.25 16:10 Сейчас в теме
(5) В БСП отличный, красивый и остроумный вариант.
Но получается, что есть еще вариант.
13. provadyuga 107 18.03.25 06:59 Сейчас в теме
Вот еще вариант, в котором устранена циклическая ссылка, путем создания еще одной структуры - СтруктураДляСвойства:
//ЕстьСвойство(Объект, Свойство)
Функция ЕстьСвойство(Объект, Свойство)
	
	СтруктураДляСвойства = Новый Структура;
	Структура = Новый Структура(Свойство, СтруктураДляСвойства);
	ЗаполнитьЗначенияСвойств(Структура, Объект);
	ЕстьСвойство = (Структура[Свойство] <> СтруктураДляСвойства);
	Возврат ЕстьСвойство;
	
КонецФункции // ЕстьСвойство()	
Показать
14. xaozai 21.03.25 10:01 Сейчас в теме
Как по мне, использование встроенного метода Свойство() (там, где он есть) или поиска реквизита через метаданные (Объект.Метаданные().Реквизиты.Найти("ИмяРеквизита") = Неопредлелено) выглядит понятнее. Т.е., специалист, который увидит этот код сразу поймет, что делается. А приведенный здесь текст, описывающий метод, выглядит не очень понятно.
Cерый; rongevud; +2 Ответить
15. le_ 253 21.03.25 13:53 Сейчас в теме
Просто скрин из ирОбщий.
Прикрепленные файлы:
mefalcon; Dach; +2 Ответить
16. mefalcon 38 16.04.25 08:24 Сейчас в теме
(15) или так ))
Функция ЕстьСвойство(Объект, СвойствоОбъекта)

УникальноеЗначениеДляПроверки = новый УникальныйИдентификатор;
Структура = Новый Структура(СвойствоОбъекта, УникальноеЗначениеДляПроверки);
ЗаполнитьЗначенияСвойств(Структура, Объект);
ЕстьСвойство = НЕ Структура.СвойствоОбъекта = УникальноеЗначениеДляПроверки;
Возврат ЕстьСвойство;

КонецФункции // ЕстьСвойство()
Для отправки сообщения требуется регистрация/авторизация