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

17.03.25

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

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

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

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

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

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

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

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

Все. 

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

См. также

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

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

21.05.2024    29206    dimanich70    83    

151

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

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

1 стартмани

18.03.2024    4850    6    John_d    11    

57

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

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

12.02.2024    31815    atdonya    25    

59

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    6433    ke.92@mail.ru    17    

66

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    17792    YA_418728146    8    

170

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    4718    78    progmaster    11    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 1C:Бухгалтерия 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    19653    188    sapervodichka    112    

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

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

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