Метод 1: Проверка через Метаданные
Этот подход использует статическую структуру конфигурации, описанную в дереве метаданных. Он отвечает на вопрос: «Задуман ли разработчиком реквизит с таким именем для этого типа объектов?»
// Проверка наличия реквизита у справочника "Контрагенты"
Если Метаданные.Справочники.Контрагенты.Реквизиты.Найти("ИНН") = Неопределено Тогда
Сообщить("Реквизит не найден в конфигурации!");
КонецЕсли;Данный метод не подходит для проверки объектов, созданных динамически или содержащих свойства формы, так как работает на уровне конфигурации, а не конкретного экземпляра
Метод 2: Проверка с использованием алгоритмов БСП
В отличие от первого подхода, функции БСП отвечают на вопрос: «Имеет ли прямо сейчас этот конкретный экземпляр объекта (которым может быть форма, структура или запись табличной части) свойство или реквизит с заданным именем?»
Достигается это хитрым, но эффективным приемом. Функция создает временную структуру с полем-«маркером» и с помощью метода ЗаполнитьЗначенияСвойств() пытается перенести в нее значение из проверяемого объекта. Если значение в структуре изменилось, значит, свойство существует.
// Эта функция внутри выполняет алгоритм, описанный выше
Результат = ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита);Этот метод универсален и подходит для подавляющего большинства практических задач.
В арсенале БСП есть также функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта). Находится функция в общем модуле ОбщегоНазначения. Но если перейти в код функции, то можно понять, что это по сути тот же метод 1, описанный выше, только вынесенный в отдельную функцию. Она проверяет наличие реквизита в метаданных.
Где вызывается — на клиенте или на сервере?
Проверка напрямую через метаданные может быть вызвана только на сервере, либо на клиенте через серверный вызов. Логично, что и функция ОбщегоНазначения.ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) может быть вызывана только на сервере или на клиенте через серверный вызов. А вот универсальная функция ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) может быть вызвана как на клиенте, так и на сервере, что только подкрепляет ее универсальность.